From 2ee99435632318c47a02fb10aa013baf862c1bbe Mon Sep 17 00:00:00 2001 From: can1357 Date: Sat, 8 Aug 2026 09:58:34 +0200 Subject: [PATCH] refactor: unify builtins in one place --- .github/workflows/ci.yml | 6 +- Cargo.lock | 941 +- Cargo.toml | 3 +- MODULE.bazel | 2 +- MODULE.bazel.lock | 288 +- README.md | 16 +- .../BUILD.bazel | 75 +- .../brush-builtins => pi-builtins}/Cargo.lock | 0 crates/pi-builtins/Cargo.toml | 451 + crates/pi-builtins/LICENSE | 186 + crates/pi-builtins/README.md | 69 + .../src/alias.rs | 0 crates/pi-builtins/src/b2sum.rs | 69 + .../src/base32.rs} | 343 +- crates/pi-builtins/src/base64.rs | 106 + crates/pi-builtins/src/basename.rs | 208 + .../brush-builtins => pi-builtins}/src/bg.rs | 0 .../src/bind.rs | 0 .../src/break_.rs | 0 .../src/builder.rs | 0 .../src/builtin_.rs | 0 .../src/caller.rs | 0 crates/pi-builtins/src/cat.rs | 814 ++ .../brush-builtins => pi-builtins}/src/cd.rs | 0 crates/pi-builtins/src/cksum.rs | 1957 ++++ crates/{pi-shell => pi-builtins}/src/cmp.rs | 317 +- .../src/colon.rs | 0 crates/pi-builtins/src/combine.rs | 381 + crates/pi-builtins/src/comm.rs | 422 + .../src/command.rs | 0 .../src/complete.rs | 0 .../src/continue_.rs | 0 .../{vendor/uu-cut => pi-builtins}/src/cut.rs | 658 +- crates/pi-builtins/src/date.rs | 2052 ++++ .../src/declare.rs | 0 crates/pi-builtins/src/diff.rs | 549 + .../uu-dirname => pi-builtins}/src/dirname.rs | 200 +- .../src/dirs.rs | 0 .../brush-builtins => pi-builtins}/src/dot.rs | 0 .../src/echo.rs | 0 .../src/enable.rs | 0 .../moreutils => pi-builtins/src}/errno.rs | 225 +- .../src/eval.rs | 0 .../src/exec.rs | 0 .../src/exit.rs | 0 .../src/export.rs | 0 .../src/factory.rs | 173 +- .../src/false_.rs | 0 .../brush-builtins => pi-builtins}/src/fc.rs | 0 crates/{pi-shell => pi-builtins}/src/fd.rs | 352 +- .../brush-builtins => pi-builtins}/src/fg.rs | 0 crates/pi-builtins/src/find.rs | 5121 +++++++++ .../src/getopts.rs | 0 .../src/lib.rs => pi-builtins/src/grep.rs} | 576 +- .../src/hash.rs | 0 crates/pi-builtins/src/head.rs | 1481 +++ .../src/help.rs | 0 .../src/history.rs | 0 crates/pi-builtins/src/host.rs | 964 ++ crates/pi-builtins/src/hostname.rs | 251 + crates/pi-builtins/src/ifne.rs | 313 + crates/pi-builtins/src/isutf8.rs | 395 + .../src/jobs.rs | 0 .../help.txt => pi-builtins/src/jq-help.txt} | 0 crates/pi-builtins/src/jq.rs | 1550 +++ crates/pi-builtins/src/kill.rs | 494 + .../src/let_.rs | 0 crates/pi-builtins/src/lib.rs | 309 + .../{vendor/uu-ln => pi-builtins}/src/ln.rs | 477 +- crates/pi-builtins/src/ls.rs | 5262 +++++++++ .../src/mapfile.rs | 0 crates/pi-builtins/src/md5sum.rs | 115 + crates/pi-builtins/src/mkdir.rs | 426 + crates/pi-builtins/src/mktemp.rs | 805 ++ .../{vendor/uu-mv => pi-builtins}/src/mv.rs | 1058 +- crates/pi-builtins/src/nohup.rs | 107 + crates/pi-builtins/src/nproc.rs | 206 + crates/pi-builtins/src/paste.rs | 452 + crates/pi-builtins/src/pgrep.rs | 106 + crates/pi-builtins/src/pidwait.rs | 76 + crates/pi-builtins/src/pkill.rs | 62 + .../src/popd.rs | 0 crates/pi-builtins/src/printenv.rs | 200 + .../src/printf.rs | 0 crates/pi-builtins/src/proc_match.rs | 937 ++ crates/pi-builtins/src/proc_snapshot.rs | 1084 ++ crates/pi-builtins/src/ps.rs | 1486 +++ .../src/pushd.rs | 0 .../brush-builtins => pi-builtins}/src/pwd.rs | 0 .../src/read.rs | 0 crates/pi-builtins/src/readlink.rs | 346 + crates/pi-builtins/src/realpath.rs | 466 + .../src/return_.rs | 0 crates/{pi-uu-grep => pi-builtins}/src/rg.rs | 528 +- crates/pi-builtins/src/rm.rs | 1676 +++ crates/pi-builtins/src/sed.rs | 9533 +++++++++++++++++ crates/pi-builtins/src/seq.rs | 930 ++ .../brush-builtins => pi-builtins}/src/set.rs | 0 crates/pi-builtins/src/sha1sum.rs | 37 + crates/pi-builtins/src/sha224sum.rs | 37 + crates/pi-builtins/src/sha256sum.rs | 37 + crates/pi-builtins/src/sha384sum.rs | 37 + crates/pi-builtins/src/sha512sum.rs | 37 + .../src/shift.rs | 0 .../src/shopt.rs | 0 crates/pi-builtins/src/sleep.rs | 139 + .../uu-sort => pi-builtins}/src/sort.rs | 2932 ++++- crates/pi-builtins/src/sponge.rs | 280 + .../uu-stat => pi-builtins}/src/stat.rs | 564 +- .../src/suspend.rs | 0 crates/pi-builtins/src/tac.rs | 517 + crates/pi-builtins/src/tail.rs | 3610 +++++++ crates/pi-builtins/src/tee.rs | 458 + .../src/test.rs | 0 crates/pi-builtins/src/timeout.rs | 223 + .../src/times.rs | 0 crates/pi-builtins/src/top.rs | 442 + .../uu-touch => pi-builtins}/src/touch.rs | 578 +- .../operation.rs => pi-builtins/src/tr.rs} | 607 +- .../src/trap.rs | 0 .../src/true_.rs | 0 .../src/truncate.rs | 335 +- crates/pi-builtins/src/ts.rs | 448 + .../src/type_.rs | 0 .../src/ulimit.rs | 0 .../src/umask.rs | 0 .../src/unalias.rs | 0 crates/pi-builtins/src/uname.rs | 309 + .../src/unimp.rs | 0 .../uu-uniq => pi-builtins}/src/uniq.rs | 526 +- .../src/unset.rs | 0 .../src/wait.rs | 0 crates/pi-builtins/src/wc.rs | 1650 +++ crates/pi-builtins/src/which.rs | 173 + crates/pi-builtins/src/whoami.rs | 130 + .../xargs/mod.rs => pi-builtins/src/xargs.rs} | 529 +- crates/pi-builtins/src/yes.rs | 324 + crates/pi-natives/BUILD.bazel | 1 - crates/pi-natives/Cargo.toml | 1 - crates/pi-natives/src/crash_handler.rs | 2 +- crates/pi-natives/src/lib.rs | 4 +- crates/pi-natives/src/tokens.rs | 2 +- crates/pi-shell/BUILD.bazel | 56 +- crates/pi-shell/Cargo.toml | 54 +- crates/pi-shell/src/coreutils.rs | 363 - crates/pi-shell/src/lib.rs | 10 +- crates/pi-shell/src/moreutils.rs | 15 - crates/pi-shell/src/moreutils/combine.rs | 377 - crates/pi-shell/src/moreutils/ifne.rs | 309 - crates/pi-shell/src/moreutils/isutf8.rs | 390 - crates/pi-shell/src/moreutils/sponge.rs | 306 - crates/pi-shell/src/moreutils/ts.rs | 530 - crates/pi-shell/src/process.rs | 15 +- crates/pi-shell/src/shell.rs | 4682 +------- crates/pi-shell/src/which.rs | 252 - crates/pi-uu-diff/BUILD.bazel | 28 - crates/pi-uu-diff/Cargo.toml | 21 - crates/pi-uu-diff/src/lib.rs | 608 -- crates/pi-uu-grep/BUILD.bazel | 29 - crates/pi-uu-grep/Cargo.toml | 29 - crates/pi-uutils-ctx/BUILD.bazel | 26 - crates/pi-uutils-ctx/Cargo.toml | 16 - crates/pi-uutils-ctx/src/lib.rs | 446 - crates/vendor/brush-builtins/Cargo.toml | 250 - crates/vendor/brush-builtins/LICENSE | 32 - crates/vendor/brush-builtins/README.md | 204 - crates/vendor/brush-builtins/src/kill.rs | 258 - crates/vendor/brush-builtins/src/lib.rs | 154 - crates/vendor/jaq/BUILD.bazel | 29 - crates/vendor/jaq/Cargo.toml | 26 - crates/vendor/jaq/LICENSE | 23 - crates/vendor/jaq/src/cli.rs | 236 - crates/vendor/jaq/src/filter.rs | 358 - crates/vendor/jaq/src/lib.rs | 333 - crates/vendor/jaq/src/read.rs | 89 - crates/vendor/jaq/src/tests.rs | 299 - crates/vendor/jaq/src/write.rs | 127 - crates/vendor/uu-b2sum/BUILD.bazel | 22 - crates/vendor/uu-b2sum/Cargo.toml | 18 - crates/vendor/uu-b2sum/LICENSE | 18 - crates/vendor/uu-b2sum/src/b2sum.rs | 36 - crates/vendor/uu-base32/BUILD.bazel | 28 - crates/vendor/uu-base32/Cargo.toml | 17 - crates/vendor/uu-base32/LICENSE | 18 - crates/vendor/uu-base32/src/base32.rs | 52 - crates/vendor/uu-base64/BUILD.bazel | 29 - crates/vendor/uu-base64/Cargo.toml | 22 - crates/vendor/uu-base64/LICENSE | 18 - crates/vendor/uu-base64/src/base64.rs | 133 - crates/vendor/uu-basename/BUILD.bazel | 21 - crates/vendor/uu-basename/Cargo.toml | 17 - crates/vendor/uu-basename/LICENSE | 18 - crates/vendor/uu-basename/src/basename.rs | 169 - crates/vendor/uu-cat/BUILD.bazel | 28 - crates/vendor/uu-cat/Cargo.toml | 19 - crates/vendor/uu-cat/LICENSE | 18 - crates/vendor/uu-cat/src/cat.rs | 771 -- crates/vendor/uu-checksum-common/BUILD.bazel | 21 - crates/vendor/uu-checksum-common/Cargo.toml | 20 - crates/vendor/uu-checksum-common/LICENSE | 18 - crates/vendor/uu-checksum-common/src/cli.rs | 221 - .../vendor/uu-checksum-common/src/compute.rs | 311 - crates/vendor/uu-checksum-common/src/lib.rs | 241 - .../vendor/uu-checksum-common/src/validate.rs | 1004 -- crates/vendor/uu-comm/BUILD.bazel | 21 - crates/vendor/uu-comm/Cargo.toml | 16 - crates/vendor/uu-comm/LICENSE | 19 - crates/vendor/uu-comm/src/comm.rs | 383 - crates/vendor/uu-cut/BUILD.bazel | 28 - crates/vendor/uu-cut/Cargo.toml | 19 - crates/vendor/uu-cut/LICENSE | 18 - crates/vendor/uu-cut/src/matcher.rs | 118 - crates/vendor/uu-cut/src/searcher.rs | 176 - crates/vendor/uu-date/BUILD.bazel | 28 - crates/vendor/uu-date/Cargo.toml | 36 - crates/vendor/uu-date/LICENSE | 18 - crates/vendor/uu-date/src/date.rs | 1658 --- crates/vendor/uu-date/src/format_modifiers.rs | 760 -- crates/vendor/uu-dirname/BUILD.bazel | 28 - crates/vendor/uu-dirname/Cargo.toml | 19 - crates/vendor/uu-dirname/LICENSE | 18 - crates/vendor/uu-find/BUILD.bazel | 45 - crates/vendor/uu-find/Cargo.toml | 30 - .../uu-find/src/find/matchers/access.rs | 56 - .../uu-find/src/find/matchers/delete.rs | 101 - .../vendor/uu-find/src/find/matchers/empty.rs | 97 - .../vendor/uu-find/src/find/matchers/entry.rs | 280 - .../vendor/uu-find/src/find/matchers/exec.rs | 240 - crates/vendor/uu-find/src/find/matchers/fs.rs | 180 - .../vendor/uu-find/src/find/matchers/glob.rs | 236 - .../vendor/uu-find/src/find/matchers/group.rs | 133 - .../vendor/uu-find/src/find/matchers/lname.rs | 98 - .../src/find/matchers/logical_matchers.rs | 586 - crates/vendor/uu-find/src/find/matchers/ls.rs | 302 - .../vendor/uu-find/src/find/matchers/mod.rs | 1726 --- .../vendor/uu-find/src/find/matchers/name.rs | 145 - .../vendor/uu-find/src/find/matchers/path.rs | 77 - .../vendor/uu-find/src/find/matchers/perm.rs | 268 - .../uu-find/src/find/matchers/printer.rs | 119 - .../uu-find/src/find/matchers/printf.rs | 1034 -- .../vendor/uu-find/src/find/matchers/prune.rs | 56 - .../vendor/uu-find/src/find/matchers/quit.rs | 35 - .../vendor/uu-find/src/find/matchers/regex.rs | 221 - .../uu-find/src/find/matchers/samefile.rs | 111 - .../vendor/uu-find/src/find/matchers/size.rs | 161 - .../vendor/uu-find/src/find/matchers/stat.rs | 99 - .../vendor/uu-find/src/find/matchers/time.rs | 893 -- .../uu-find/src/find/matchers/type_matcher.rs | 216 - .../vendor/uu-find/src/find/matchers/user.rs | 130 - crates/vendor/uu-find/src/find/mod.rs | 1453 --- crates/vendor/uu-find/src/lib.rs | 36 - crates/vendor/uu-find/tests/bsd_compat.rs | 107 - crates/vendor/uu-head/BENCHMARKING.md | 51 - crates/vendor/uu-head/BUILD.bazel | 28 - crates/vendor/uu-head/Cargo.toml | 19 - crates/vendor/uu-head/LICENSE | 18 - crates/vendor/uu-head/locales/en-US.ftl | 31 - crates/vendor/uu-head/src/cli.rs | 93 - crates/vendor/uu-head/src/head.rs | 689 -- crates/vendor/uu-head/src/parse.rs | 192 - crates/vendor/uu-head/src/take.rs | 655 -- crates/vendor/uu-hostname/BUILD.bazel | 28 - crates/vendor/uu-hostname/Cargo.toml | 31 - crates/vendor/uu-hostname/LICENSE | 18 - crates/vendor/uu-hostname/src/hostname.rs | 308 - crates/vendor/uu-ln/BUILD.bazel | 28 - crates/vendor/uu-ln/Cargo.toml | 23 - crates/vendor/uu-ln/LICENSE | 18 - crates/vendor/uu-ls/BUILD.bazel | 28 - crates/vendor/uu-ls/Cargo.toml | 46 - crates/vendor/uu-ls/LICENSE | 18 - crates/vendor/uu-ls/locales/en-US.ftl | 147 - crates/vendor/uu-ls/src/colors.rs | 847 -- crates/vendor/uu-ls/src/config.rs | 1069 -- crates/vendor/uu-ls/src/dired.rs | 345 - crates/vendor/uu-ls/src/display.rs | 1344 --- crates/vendor/uu-ls/src/ls.rs | 1592 --- crates/vendor/uu-md5sum/BUILD.bazel | 21 - crates/vendor/uu-md5sum/Cargo.toml | 16 - crates/vendor/uu-md5sum/LICENSE | 18 - crates/vendor/uu-md5sum/src/md5sum.rs | 6 - crates/vendor/uu-mkdir/BUILD.bazel | 21 - crates/vendor/uu-mkdir/Cargo.toml | 27 - crates/vendor/uu-mkdir/LICENSE | 18 - crates/vendor/uu-mkdir/locales/en-US.ftl | 19 - crates/vendor/uu-mkdir/src/mkdir.rs | 398 - crates/vendor/uu-mktemp/BUILD.bazel | 28 - crates/vendor/uu-mktemp/Cargo.toml | 24 - crates/vendor/uu-mktemp/LICENSE | 18 - crates/vendor/uu-mktemp/src/mktemp.rs | 941 -- crates/vendor/uu-mv/BUILD.bazel | 28 - crates/vendor/uu-mv/Cargo.toml | 44 - crates/vendor/uu-mv/LICENSE | 18 - crates/vendor/uu-mv/src/error.rs | 33 - crates/vendor/uu-mv/src/hardlink.rs | 334 - crates/vendor/uu-nproc/BUILD.bazel | 28 - crates/vendor/uu-nproc/Cargo.toml | 22 - crates/vendor/uu-nproc/LICENSE | 18 - crates/vendor/uu-nproc/src/nproc.rs | 287 - crates/vendor/uu-paste/BUILD.bazel | 21 - crates/vendor/uu-paste/Cargo.toml | 17 - crates/vendor/uu-paste/LICENSE | 19 - crates/vendor/uu-paste/src/paste.rs | 335 - crates/vendor/uu-printenv/BUILD.bazel | 28 - crates/vendor/uu-printenv/Cargo.toml | 21 - crates/vendor/uu-printenv/LICENSE | 18 - crates/vendor/uu-printenv/src/printenv.rs | 243 - crates/vendor/uu-readlink/BUILD.bazel | 28 - crates/vendor/uu-readlink/Cargo.toml | 22 - crates/vendor/uu-readlink/LICENSE | 18 - crates/vendor/uu-readlink/src/readlink.rs | 422 - crates/vendor/uu-realpath/BUILD.bazel | 28 - crates/vendor/uu-realpath/Cargo.toml | 22 - crates/vendor/uu-realpath/LICENSE | 18 - crates/vendor/uu-realpath/src/realpath.rs | 568 - crates/vendor/uu-rm/BUILD.bazel | 28 - crates/vendor/uu-rm/Cargo.toml | 29 - crates/vendor/uu-rm/LICENSE | 18 - crates/vendor/uu-rm/locales/en-US.ftl | 51 - crates/vendor/uu-rm/src/platform/mod.rs | 12 - crates/vendor/uu-rm/src/platform/unix.rs | 421 - crates/vendor/uu-rm/src/rm.rs | 1187 -- crates/vendor/uu-sed/BUILD.bazel | 28 - crates/vendor/uu-sed/Cargo.toml | 26 - crates/vendor/uu-sed/LICENSE | 21 - crates/vendor/uu-sed/src/lib.rs | 259 - crates/vendor/uu-sed/src/sed/command.rs | 550 - crates/vendor/uu-sed/src/sed/compiler.rs | 3083 ------ .../vendor/uu-sed/src/sed/delimited_parser.rs | 1315 --- .../vendor/uu-sed/src/sed/error_handling.rs | 113 - crates/vendor/uu-sed/src/sed/fast_io.rs | 1436 --- crates/vendor/uu-sed/src/sed/fast_regex.rs | 703 -- crates/vendor/uu-sed/src/sed/in_place.rs | 320 - crates/vendor/uu-sed/src/sed/mod.rs | 485 - crates/vendor/uu-sed/src/sed/named_writer.rs | 95 - crates/vendor/uu-sed/src/sed/processor.rs | 818 -- .../uu-sed/src/sed/script_char_provider.rs | 139 - .../uu-sed/src/sed/script_line_provider.rs | 284 - crates/vendor/uu-seq/BUILD.bazel | 28 - crates/vendor/uu-seq/Cargo.toml | 32 - crates/vendor/uu-seq/LICENSE | 18 - crates/vendor/uu-seq/src/error.rs | 57 - crates/vendor/uu-seq/src/number.rs | 52 - crates/vendor/uu-seq/src/numberparse.rs | 351 - crates/vendor/uu-seq/src/seq.rs | 561 - crates/vendor/uu-sha1sum/BUILD.bazel | 22 - crates/vendor/uu-sha1sum/Cargo.toml | 18 - crates/vendor/uu-sha1sum/LICENSE | 18 - crates/vendor/uu-sha1sum/src/sha1sum.rs | 10 - crates/vendor/uu-sha224sum/BUILD.bazel | 22 - crates/vendor/uu-sha224sum/Cargo.toml | 18 - crates/vendor/uu-sha224sum/LICENSE | 18 - crates/vendor/uu-sha224sum/src/sha224sum.rs | 10 - crates/vendor/uu-sha256sum/BUILD.bazel | 22 - crates/vendor/uu-sha256sum/Cargo.toml | 18 - crates/vendor/uu-sha256sum/LICENSE | 18 - crates/vendor/uu-sha256sum/src/sha256sum.rs | 10 - crates/vendor/uu-sha384sum/BUILD.bazel | 22 - crates/vendor/uu-sha384sum/Cargo.toml | 18 - crates/vendor/uu-sha384sum/LICENSE | 18 - crates/vendor/uu-sha384sum/src/sha384sum.rs | 10 - crates/vendor/uu-sha512sum/BUILD.bazel | 22 - crates/vendor/uu-sha512sum/Cargo.toml | 18 - crates/vendor/uu-sha512sum/LICENSE | 18 - crates/vendor/uu-sha512sum/src/sha512sum.rs | 10 - crates/vendor/uu-sort/BUILD.bazel | 28 - crates/vendor/uu-sort/Cargo.toml | 43 - crates/vendor/uu-sort/LICENSE | 18 - crates/vendor/uu-sort/locales/en-US.ftl | 110 - crates/vendor/uu-sort/src/buffer_hint.rs | 146 - crates/vendor/uu-sort/src/check.rs | 122 - crates/vendor/uu-sort/src/chunks.rs | 496 - crates/vendor/uu-sort/src/custom_str_cmp.rs | 64 - crates/vendor/uu-sort/src/ext_sort/mod.rs | 20 - .../vendor/uu-sort/src/ext_sort/threaded.rs | 347 - crates/vendor/uu-sort/src/ext_sort/wasi.rs | 59 - crates/vendor/uu-sort/src/merge.rs | 580 - crates/vendor/uu-sort/src/numeric_str_cmp.rs | 422 - crates/vendor/uu-sort/src/tmp_dir.rs | 64 - crates/vendor/uu-stat/BUILD.bazel | 28 - crates/vendor/uu-stat/Cargo.toml | 29 - crates/vendor/uu-stat/LICENSE | 18 - crates/vendor/uu-tac/BUILD.bazel | 28 - crates/vendor/uu-tac/Cargo.toml | 26 - crates/vendor/uu-tac/LICENSE | 18 - crates/vendor/uu-tac/src/error.rs | 47 - crates/vendor/uu-tac/src/tac.rs | 634 -- crates/vendor/uu-tail/BUILD.bazel | 31 - crates/vendor/uu-tail/Cargo.toml | 37 - crates/vendor/uu-tail/src/args.rs | 659 -- crates/vendor/uu-tail/src/chunks.rs | 705 -- crates/vendor/uu-tail/src/follow/files.rs | 219 - crates/vendor/uu-tail/src/follow/mod.rs | 70 - crates/vendor/uu-tail/src/follow/watch.rs | 650 -- crates/vendor/uu-tail/src/parse.rs | 124 - crates/vendor/uu-tail/src/paths.rs | 234 - crates/vendor/uu-tail/src/platform/mod.rs | 29 - crates/vendor/uu-tail/src/platform/unix.rs | 47 - crates/vendor/uu-tail/src/platform/windows.rs | 53 - crates/vendor/uu-tail/src/tail.rs | 947 -- crates/vendor/uu-tail/src/text.rs | 22 - crates/vendor/uu-tee/BUILD.bazel | 21 - crates/vendor/uu-tee/Cargo.toml | 17 - crates/vendor/uu-tee/LICENSE | 18 - crates/vendor/uu-tee/src/cli.rs | 89 - crates/vendor/uu-tee/src/tee.rs | 239 - crates/vendor/uu-touch/BUILD.bazel | 28 - crates/vendor/uu-touch/Cargo.toml | 36 - crates/vendor/uu-touch/LICENSE | 18 - crates/vendor/uu-tr/BUILD.bazel | 21 - crates/vendor/uu-tr/Cargo.toml | 19 - crates/vendor/uu-tr/LICENSE | 18 - crates/vendor/uu-tr/src/simd.rs | 99 - crates/vendor/uu-tr/src/tr.rs | 223 - crates/vendor/uu-tr/src/unicode_table.rs | 15 - crates/vendor/uu-truncate/BUILD.bazel | 28 - crates/vendor/uu-truncate/Cargo.toml | 22 - crates/vendor/uu-truncate/LICENSE | 18 - crates/vendor/uu-uname/BUILD.bazel | 28 - crates/vendor/uu-uname/Cargo.toml | 21 - crates/vendor/uu-uname/LICENSE | 18 - crates/vendor/uu-uname/src/uname.rs | 342 - crates/vendor/uu-uniq/BUILD.bazel | 21 - crates/vendor/uu-uniq/Cargo.toml | 18 - crates/vendor/uu-uniq/LICENSE | 18 - crates/vendor/uu-uniq/locales/en-US.ftl | 44 - crates/vendor/uu-wc/BUILD.bazel | 21 - crates/vendor/uu-wc/Cargo.toml | 30 - crates/vendor/uu-wc/LICENSE | 18 - crates/vendor/uu-wc/src/count_fast.rs | 220 - crates/vendor/uu-wc/src/countable.rs | 80 - crates/vendor/uu-wc/src/utf8/LICENSE | 26 - crates/vendor/uu-wc/src/utf8/mod.rs | 84 - crates/vendor/uu-wc/src/utf8/read.rs | 117 - crates/vendor/uu-wc/src/wc.rs | 1065 -- crates/vendor/uu-wc/src/word_count.rs | 37 - crates/vendor/uu-whoami/BUILD.bazel | 28 - crates/vendor/uu-whoami/Cargo.toml | 27 - crates/vendor/uu-whoami/LICENSE | 18 - crates/vendor/uu-whoami/src/whoami.rs | 198 - crates/vendor/uu-xargs/BUILD.bazel | 28 - crates/vendor/uu-xargs/Cargo.toml | 17 - crates/vendor/uu-xargs/LICENSE | 18 - crates/vendor/uu-xargs/src/lib.rs | 43 - crates/vendor/uu-xargs/src/tests.rs | 192 - crates/vendor/uu-yes/BUILD.bazel | 28 - crates/vendor/uu-yes/Cargo.toml | 23 - crates/vendor/uu-yes/LICENSE | 18 - crates/vendor/uu-yes/src/yes.rs | 351 - docs/native-crates.md | 26 +- docs/natives-build-release-debugging.md | 4 +- packages/natives/CHANGELOG.md | 13 + rustfmt.toml | 2 +- scripts/run-rs-task.ts | 18 +- 454 files changed, 59110 insertions(+), 67520 deletions(-) rename crates/{vendor/brush-builtins => pi-builtins}/BUILD.bazel (54%) rename crates/{vendor/brush-builtins => pi-builtins}/Cargo.lock (100%) create mode 100644 crates/pi-builtins/Cargo.toml create mode 100644 crates/pi-builtins/LICENSE create mode 100644 crates/pi-builtins/README.md rename crates/{vendor/brush-builtins => pi-builtins}/src/alias.rs (100%) create mode 100644 crates/pi-builtins/src/b2sum.rs rename crates/{vendor/uu-base32/src/base_common.rs => pi-builtins/src/base32.rs} (75%) create mode 100644 crates/pi-builtins/src/base64.rs create mode 100644 crates/pi-builtins/src/basename.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/bg.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/bind.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/break_.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/builder.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/builtin_.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/caller.rs (100%) create mode 100644 crates/pi-builtins/src/cat.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/cd.rs (100%) create mode 100644 crates/pi-builtins/src/cksum.rs rename crates/{pi-shell => pi-builtins}/src/cmp.rs (74%) rename crates/{vendor/brush-builtins => pi-builtins}/src/colon.rs (100%) create mode 100644 crates/pi-builtins/src/combine.rs create mode 100644 crates/pi-builtins/src/comm.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/command.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/complete.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/continue_.rs (100%) rename crates/{vendor/uu-cut => pi-builtins}/src/cut.rs (53%) create mode 100644 crates/pi-builtins/src/date.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/declare.rs (100%) create mode 100644 crates/pi-builtins/src/diff.rs rename crates/{vendor/uu-dirname => pi-builtins}/src/dirname.rs (54%) rename crates/{vendor/brush-builtins => pi-builtins}/src/dirs.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/dot.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/echo.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/enable.rs (100%) rename crates/{pi-shell/src/moreutils => pi-builtins/src}/errno.rs (58%) rename crates/{vendor/brush-builtins => pi-builtins}/src/eval.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/exec.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/exit.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/export.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/factory.rs (52%) rename crates/{vendor/brush-builtins => pi-builtins}/src/false_.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/fc.rs (100%) rename crates/{pi-shell => pi-builtins}/src/fd.rs (85%) rename crates/{vendor/brush-builtins => pi-builtins}/src/fg.rs (100%) create mode 100644 crates/pi-builtins/src/find.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/getopts.rs (100%) rename crates/{pi-uu-grep/src/lib.rs => pi-builtins/src/grep.rs} (71%) rename crates/{vendor/brush-builtins => pi-builtins}/src/hash.rs (100%) create mode 100644 crates/pi-builtins/src/head.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/help.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/history.rs (100%) create mode 100644 crates/pi-builtins/src/host.rs create mode 100644 crates/pi-builtins/src/hostname.rs create mode 100644 crates/pi-builtins/src/ifne.rs create mode 100644 crates/pi-builtins/src/isutf8.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/jobs.rs (100%) rename crates/{vendor/jaq/src/help.txt => pi-builtins/src/jq-help.txt} (100%) create mode 100644 crates/pi-builtins/src/jq.rs create mode 100644 crates/pi-builtins/src/kill.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/let_.rs (100%) create mode 100644 crates/pi-builtins/src/lib.rs rename crates/{vendor/uu-ln => pi-builtins}/src/ln.rs (54%) create mode 100644 crates/pi-builtins/src/ls.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/mapfile.rs (100%) create mode 100644 crates/pi-builtins/src/md5sum.rs create mode 100644 crates/pi-builtins/src/mkdir.rs create mode 100644 crates/pi-builtins/src/mktemp.rs rename crates/{vendor/uu-mv => pi-builtins}/src/mv.rs (55%) create mode 100644 crates/pi-builtins/src/nohup.rs create mode 100644 crates/pi-builtins/src/nproc.rs create mode 100644 crates/pi-builtins/src/paste.rs create mode 100644 crates/pi-builtins/src/pgrep.rs create mode 100644 crates/pi-builtins/src/pidwait.rs create mode 100644 crates/pi-builtins/src/pkill.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/popd.rs (100%) create mode 100644 crates/pi-builtins/src/printenv.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/printf.rs (100%) create mode 100644 crates/pi-builtins/src/proc_match.rs create mode 100644 crates/pi-builtins/src/proc_snapshot.rs create mode 100644 crates/pi-builtins/src/ps.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/pushd.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/pwd.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/read.rs (100%) create mode 100644 crates/pi-builtins/src/readlink.rs create mode 100644 crates/pi-builtins/src/realpath.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/return_.rs (100%) rename crates/{pi-uu-grep => pi-builtins}/src/rg.rs (75%) create mode 100644 crates/pi-builtins/src/rm.rs create mode 100644 crates/pi-builtins/src/sed.rs create mode 100644 crates/pi-builtins/src/seq.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/set.rs (100%) create mode 100644 crates/pi-builtins/src/sha1sum.rs create mode 100644 crates/pi-builtins/src/sha224sum.rs create mode 100644 crates/pi-builtins/src/sha256sum.rs create mode 100644 crates/pi-builtins/src/sha384sum.rs create mode 100644 crates/pi-builtins/src/sha512sum.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/shift.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/shopt.rs (100%) create mode 100644 crates/pi-builtins/src/sleep.rs rename crates/{vendor/uu-sort => pi-builtins}/src/sort.rs (51%) create mode 100644 crates/pi-builtins/src/sponge.rs rename crates/{vendor/uu-stat => pi-builtins}/src/stat.rs (83%) rename crates/{vendor/brush-builtins => pi-builtins}/src/suspend.rs (100%) create mode 100644 crates/pi-builtins/src/tac.rs create mode 100644 crates/pi-builtins/src/tail.rs create mode 100644 crates/pi-builtins/src/tee.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/test.rs (100%) create mode 100644 crates/pi-builtins/src/timeout.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/times.rs (100%) create mode 100644 crates/pi-builtins/src/top.rs rename crates/{vendor/uu-touch => pi-builtins}/src/touch.rs (63%) rename crates/{vendor/uu-tr/src/operation.rs => pi-builtins/src/tr.rs} (54%) rename crates/{vendor/brush-builtins => pi-builtins}/src/trap.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/true_.rs (100%) rename crates/{vendor/uu-truncate => pi-builtins}/src/truncate.rs (50%) create mode 100644 crates/pi-builtins/src/ts.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/type_.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/ulimit.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/umask.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/unalias.rs (100%) create mode 100644 crates/pi-builtins/src/uname.rs rename crates/{vendor/brush-builtins => pi-builtins}/src/unimp.rs (100%) rename crates/{vendor/uu-uniq => pi-builtins}/src/uniq.rs (68%) rename crates/{vendor/brush-builtins => pi-builtins}/src/unset.rs (100%) rename crates/{vendor/brush-builtins => pi-builtins}/src/wait.rs (100%) create mode 100644 crates/pi-builtins/src/wc.rs create mode 100644 crates/pi-builtins/src/which.rs create mode 100644 crates/pi-builtins/src/whoami.rs rename crates/{vendor/uu-xargs/src/xargs/mod.rs => pi-builtins/src/xargs.rs} (71%) create mode 100644 crates/pi-builtins/src/yes.rs delete mode 100644 crates/pi-shell/src/coreutils.rs delete mode 100644 crates/pi-shell/src/moreutils.rs delete mode 100644 crates/pi-shell/src/moreutils/combine.rs delete mode 100644 crates/pi-shell/src/moreutils/ifne.rs delete mode 100644 crates/pi-shell/src/moreutils/isutf8.rs delete mode 100644 crates/pi-shell/src/moreutils/sponge.rs delete mode 100644 crates/pi-shell/src/moreutils/ts.rs delete mode 100644 crates/pi-shell/src/which.rs delete mode 100644 crates/pi-uu-diff/BUILD.bazel delete mode 100644 crates/pi-uu-diff/Cargo.toml delete mode 100644 crates/pi-uu-diff/src/lib.rs delete mode 100644 crates/pi-uu-grep/BUILD.bazel delete mode 100644 crates/pi-uu-grep/Cargo.toml delete mode 100644 crates/pi-uutils-ctx/BUILD.bazel delete mode 100644 crates/pi-uutils-ctx/Cargo.toml delete mode 100644 crates/pi-uutils-ctx/src/lib.rs delete mode 100644 crates/vendor/brush-builtins/Cargo.toml delete mode 100644 crates/vendor/brush-builtins/LICENSE delete mode 100644 crates/vendor/brush-builtins/README.md delete mode 100644 crates/vendor/brush-builtins/src/kill.rs delete mode 100644 crates/vendor/brush-builtins/src/lib.rs delete mode 100644 crates/vendor/jaq/BUILD.bazel delete mode 100644 crates/vendor/jaq/Cargo.toml delete mode 100644 crates/vendor/jaq/LICENSE delete mode 100644 crates/vendor/jaq/src/cli.rs delete mode 100644 crates/vendor/jaq/src/filter.rs delete mode 100644 crates/vendor/jaq/src/lib.rs delete mode 100644 crates/vendor/jaq/src/read.rs delete mode 100644 crates/vendor/jaq/src/tests.rs delete mode 100644 crates/vendor/jaq/src/write.rs delete mode 100644 crates/vendor/uu-b2sum/BUILD.bazel delete mode 100644 crates/vendor/uu-b2sum/Cargo.toml delete mode 100644 crates/vendor/uu-b2sum/LICENSE delete mode 100644 crates/vendor/uu-b2sum/src/b2sum.rs delete mode 100644 crates/vendor/uu-base32/BUILD.bazel delete mode 100644 crates/vendor/uu-base32/Cargo.toml delete mode 100644 crates/vendor/uu-base32/LICENSE delete mode 100644 crates/vendor/uu-base32/src/base32.rs delete mode 100644 crates/vendor/uu-base64/BUILD.bazel delete mode 100644 crates/vendor/uu-base64/Cargo.toml delete mode 100644 crates/vendor/uu-base64/LICENSE delete mode 100644 crates/vendor/uu-base64/src/base64.rs delete mode 100644 crates/vendor/uu-basename/BUILD.bazel delete mode 100644 crates/vendor/uu-basename/Cargo.toml delete mode 100644 crates/vendor/uu-basename/LICENSE delete mode 100644 crates/vendor/uu-basename/src/basename.rs delete mode 100644 crates/vendor/uu-cat/BUILD.bazel delete mode 100644 crates/vendor/uu-cat/Cargo.toml delete mode 100644 crates/vendor/uu-cat/LICENSE delete mode 100644 crates/vendor/uu-cat/src/cat.rs delete mode 100644 crates/vendor/uu-checksum-common/BUILD.bazel delete mode 100644 crates/vendor/uu-checksum-common/Cargo.toml delete mode 100644 crates/vendor/uu-checksum-common/LICENSE delete mode 100644 crates/vendor/uu-checksum-common/src/cli.rs delete mode 100644 crates/vendor/uu-checksum-common/src/compute.rs delete mode 100644 crates/vendor/uu-checksum-common/src/lib.rs delete mode 100644 crates/vendor/uu-checksum-common/src/validate.rs delete mode 100644 crates/vendor/uu-comm/BUILD.bazel delete mode 100644 crates/vendor/uu-comm/Cargo.toml delete mode 100644 crates/vendor/uu-comm/LICENSE delete mode 100644 crates/vendor/uu-comm/src/comm.rs delete mode 100644 crates/vendor/uu-cut/BUILD.bazel delete mode 100644 crates/vendor/uu-cut/Cargo.toml delete mode 100644 crates/vendor/uu-cut/LICENSE delete mode 100644 crates/vendor/uu-cut/src/matcher.rs delete mode 100644 crates/vendor/uu-cut/src/searcher.rs delete mode 100644 crates/vendor/uu-date/BUILD.bazel delete mode 100644 crates/vendor/uu-date/Cargo.toml delete mode 100644 crates/vendor/uu-date/LICENSE delete mode 100644 crates/vendor/uu-date/src/date.rs delete mode 100644 crates/vendor/uu-date/src/format_modifiers.rs delete mode 100644 crates/vendor/uu-dirname/BUILD.bazel delete mode 100644 crates/vendor/uu-dirname/Cargo.toml delete mode 100644 crates/vendor/uu-dirname/LICENSE delete mode 100644 crates/vendor/uu-find/BUILD.bazel delete mode 100644 crates/vendor/uu-find/Cargo.toml delete mode 100644 crates/vendor/uu-find/src/find/matchers/access.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/delete.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/empty.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/entry.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/exec.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/fs.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/glob.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/group.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/lname.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/logical_matchers.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/ls.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/mod.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/name.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/path.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/perm.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/printer.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/printf.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/prune.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/quit.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/regex.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/samefile.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/size.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/stat.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/time.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/type_matcher.rs delete mode 100644 crates/vendor/uu-find/src/find/matchers/user.rs delete mode 100644 crates/vendor/uu-find/src/find/mod.rs delete mode 100644 crates/vendor/uu-find/src/lib.rs delete mode 100644 crates/vendor/uu-find/tests/bsd_compat.rs delete mode 100644 crates/vendor/uu-head/BENCHMARKING.md delete mode 100644 crates/vendor/uu-head/BUILD.bazel delete mode 100644 crates/vendor/uu-head/Cargo.toml delete mode 100644 crates/vendor/uu-head/LICENSE delete mode 100644 crates/vendor/uu-head/locales/en-US.ftl delete mode 100644 crates/vendor/uu-head/src/cli.rs delete mode 100644 crates/vendor/uu-head/src/head.rs delete mode 100644 crates/vendor/uu-head/src/parse.rs delete mode 100644 crates/vendor/uu-head/src/take.rs delete mode 100644 crates/vendor/uu-hostname/BUILD.bazel delete mode 100644 crates/vendor/uu-hostname/Cargo.toml delete mode 100644 crates/vendor/uu-hostname/LICENSE delete mode 100644 crates/vendor/uu-hostname/src/hostname.rs delete mode 100644 crates/vendor/uu-ln/BUILD.bazel delete mode 100644 crates/vendor/uu-ln/Cargo.toml delete mode 100644 crates/vendor/uu-ln/LICENSE delete mode 100644 crates/vendor/uu-ls/BUILD.bazel delete mode 100644 crates/vendor/uu-ls/Cargo.toml delete mode 100644 crates/vendor/uu-ls/LICENSE delete mode 100644 crates/vendor/uu-ls/locales/en-US.ftl delete mode 100644 crates/vendor/uu-ls/src/colors.rs delete mode 100644 crates/vendor/uu-ls/src/config.rs delete mode 100644 crates/vendor/uu-ls/src/dired.rs delete mode 100644 crates/vendor/uu-ls/src/display.rs delete mode 100644 crates/vendor/uu-ls/src/ls.rs delete mode 100644 crates/vendor/uu-md5sum/BUILD.bazel delete mode 100644 crates/vendor/uu-md5sum/Cargo.toml delete mode 100644 crates/vendor/uu-md5sum/LICENSE delete mode 100644 crates/vendor/uu-md5sum/src/md5sum.rs delete mode 100644 crates/vendor/uu-mkdir/BUILD.bazel delete mode 100644 crates/vendor/uu-mkdir/Cargo.toml delete mode 100644 crates/vendor/uu-mkdir/LICENSE delete mode 100644 crates/vendor/uu-mkdir/locales/en-US.ftl delete mode 100644 crates/vendor/uu-mkdir/src/mkdir.rs delete mode 100644 crates/vendor/uu-mktemp/BUILD.bazel delete mode 100644 crates/vendor/uu-mktemp/Cargo.toml delete mode 100644 crates/vendor/uu-mktemp/LICENSE delete mode 100644 crates/vendor/uu-mktemp/src/mktemp.rs delete mode 100644 crates/vendor/uu-mv/BUILD.bazel delete mode 100644 crates/vendor/uu-mv/Cargo.toml delete mode 100644 crates/vendor/uu-mv/LICENSE delete mode 100644 crates/vendor/uu-mv/src/error.rs delete mode 100644 crates/vendor/uu-mv/src/hardlink.rs delete mode 100644 crates/vendor/uu-nproc/BUILD.bazel delete mode 100644 crates/vendor/uu-nproc/Cargo.toml delete mode 100644 crates/vendor/uu-nproc/LICENSE delete mode 100644 crates/vendor/uu-nproc/src/nproc.rs delete mode 100644 crates/vendor/uu-paste/BUILD.bazel delete mode 100644 crates/vendor/uu-paste/Cargo.toml delete mode 100644 crates/vendor/uu-paste/LICENSE delete mode 100644 crates/vendor/uu-paste/src/paste.rs delete mode 100644 crates/vendor/uu-printenv/BUILD.bazel delete mode 100644 crates/vendor/uu-printenv/Cargo.toml delete mode 100644 crates/vendor/uu-printenv/LICENSE delete mode 100644 crates/vendor/uu-printenv/src/printenv.rs delete mode 100644 crates/vendor/uu-readlink/BUILD.bazel delete mode 100644 crates/vendor/uu-readlink/Cargo.toml delete mode 100644 crates/vendor/uu-readlink/LICENSE delete mode 100644 crates/vendor/uu-readlink/src/readlink.rs delete mode 100644 crates/vendor/uu-realpath/BUILD.bazel delete mode 100644 crates/vendor/uu-realpath/Cargo.toml delete mode 100644 crates/vendor/uu-realpath/LICENSE delete mode 100644 crates/vendor/uu-realpath/src/realpath.rs delete mode 100644 crates/vendor/uu-rm/BUILD.bazel delete mode 100644 crates/vendor/uu-rm/Cargo.toml delete mode 100644 crates/vendor/uu-rm/LICENSE delete mode 100644 crates/vendor/uu-rm/locales/en-US.ftl delete mode 100644 crates/vendor/uu-rm/src/platform/mod.rs delete mode 100644 crates/vendor/uu-rm/src/platform/unix.rs delete mode 100644 crates/vendor/uu-rm/src/rm.rs delete mode 100644 crates/vendor/uu-sed/BUILD.bazel delete mode 100644 crates/vendor/uu-sed/Cargo.toml delete mode 100644 crates/vendor/uu-sed/LICENSE delete mode 100644 crates/vendor/uu-sed/src/lib.rs delete mode 100644 crates/vendor/uu-sed/src/sed/command.rs delete mode 100644 crates/vendor/uu-sed/src/sed/compiler.rs delete mode 100644 crates/vendor/uu-sed/src/sed/delimited_parser.rs delete mode 100644 crates/vendor/uu-sed/src/sed/error_handling.rs delete mode 100644 crates/vendor/uu-sed/src/sed/fast_io.rs delete mode 100644 crates/vendor/uu-sed/src/sed/fast_regex.rs delete mode 100644 crates/vendor/uu-sed/src/sed/in_place.rs delete mode 100644 crates/vendor/uu-sed/src/sed/mod.rs delete mode 100644 crates/vendor/uu-sed/src/sed/named_writer.rs delete mode 100644 crates/vendor/uu-sed/src/sed/processor.rs delete mode 100644 crates/vendor/uu-sed/src/sed/script_char_provider.rs delete mode 100644 crates/vendor/uu-sed/src/sed/script_line_provider.rs delete mode 100644 crates/vendor/uu-seq/BUILD.bazel delete mode 100644 crates/vendor/uu-seq/Cargo.toml delete mode 100644 crates/vendor/uu-seq/LICENSE delete mode 100644 crates/vendor/uu-seq/src/error.rs delete mode 100644 crates/vendor/uu-seq/src/number.rs delete mode 100644 crates/vendor/uu-seq/src/numberparse.rs delete mode 100644 crates/vendor/uu-seq/src/seq.rs delete mode 100644 crates/vendor/uu-sha1sum/BUILD.bazel delete mode 100644 crates/vendor/uu-sha1sum/Cargo.toml delete mode 100644 crates/vendor/uu-sha1sum/LICENSE delete mode 100644 crates/vendor/uu-sha1sum/src/sha1sum.rs delete mode 100644 crates/vendor/uu-sha224sum/BUILD.bazel delete mode 100644 crates/vendor/uu-sha224sum/Cargo.toml delete mode 100644 crates/vendor/uu-sha224sum/LICENSE delete mode 100644 crates/vendor/uu-sha224sum/src/sha224sum.rs delete mode 100644 crates/vendor/uu-sha256sum/BUILD.bazel delete mode 100644 crates/vendor/uu-sha256sum/Cargo.toml delete mode 100644 crates/vendor/uu-sha256sum/LICENSE delete mode 100644 crates/vendor/uu-sha256sum/src/sha256sum.rs delete mode 100644 crates/vendor/uu-sha384sum/BUILD.bazel delete mode 100644 crates/vendor/uu-sha384sum/Cargo.toml delete mode 100644 crates/vendor/uu-sha384sum/LICENSE delete mode 100644 crates/vendor/uu-sha384sum/src/sha384sum.rs delete mode 100644 crates/vendor/uu-sha512sum/BUILD.bazel delete mode 100644 crates/vendor/uu-sha512sum/Cargo.toml delete mode 100644 crates/vendor/uu-sha512sum/LICENSE delete mode 100644 crates/vendor/uu-sha512sum/src/sha512sum.rs delete mode 100644 crates/vendor/uu-sort/BUILD.bazel delete mode 100644 crates/vendor/uu-sort/Cargo.toml delete mode 100644 crates/vendor/uu-sort/LICENSE delete mode 100644 crates/vendor/uu-sort/locales/en-US.ftl delete mode 100644 crates/vendor/uu-sort/src/buffer_hint.rs delete mode 100644 crates/vendor/uu-sort/src/check.rs delete mode 100644 crates/vendor/uu-sort/src/chunks.rs delete mode 100644 crates/vendor/uu-sort/src/custom_str_cmp.rs delete mode 100644 crates/vendor/uu-sort/src/ext_sort/mod.rs delete mode 100644 crates/vendor/uu-sort/src/ext_sort/threaded.rs delete mode 100644 crates/vendor/uu-sort/src/ext_sort/wasi.rs delete mode 100644 crates/vendor/uu-sort/src/merge.rs delete mode 100644 crates/vendor/uu-sort/src/numeric_str_cmp.rs delete mode 100644 crates/vendor/uu-sort/src/tmp_dir.rs delete mode 100644 crates/vendor/uu-stat/BUILD.bazel delete mode 100644 crates/vendor/uu-stat/Cargo.toml delete mode 100644 crates/vendor/uu-stat/LICENSE delete mode 100644 crates/vendor/uu-tac/BUILD.bazel delete mode 100644 crates/vendor/uu-tac/Cargo.toml delete mode 100644 crates/vendor/uu-tac/LICENSE delete mode 100644 crates/vendor/uu-tac/src/error.rs delete mode 100644 crates/vendor/uu-tac/src/tac.rs delete mode 100644 crates/vendor/uu-tail/BUILD.bazel delete mode 100644 crates/vendor/uu-tail/Cargo.toml delete mode 100644 crates/vendor/uu-tail/src/args.rs delete mode 100644 crates/vendor/uu-tail/src/chunks.rs delete mode 100644 crates/vendor/uu-tail/src/follow/files.rs delete mode 100644 crates/vendor/uu-tail/src/follow/mod.rs delete mode 100644 crates/vendor/uu-tail/src/follow/watch.rs delete mode 100644 crates/vendor/uu-tail/src/parse.rs delete mode 100644 crates/vendor/uu-tail/src/paths.rs delete mode 100644 crates/vendor/uu-tail/src/platform/mod.rs delete mode 100644 crates/vendor/uu-tail/src/platform/unix.rs delete mode 100644 crates/vendor/uu-tail/src/platform/windows.rs delete mode 100644 crates/vendor/uu-tail/src/tail.rs delete mode 100644 crates/vendor/uu-tail/src/text.rs delete mode 100644 crates/vendor/uu-tee/BUILD.bazel delete mode 100644 crates/vendor/uu-tee/Cargo.toml delete mode 100644 crates/vendor/uu-tee/LICENSE delete mode 100644 crates/vendor/uu-tee/src/cli.rs delete mode 100644 crates/vendor/uu-tee/src/tee.rs delete mode 100644 crates/vendor/uu-touch/BUILD.bazel delete mode 100644 crates/vendor/uu-touch/Cargo.toml delete mode 100644 crates/vendor/uu-touch/LICENSE delete mode 100644 crates/vendor/uu-tr/BUILD.bazel delete mode 100644 crates/vendor/uu-tr/Cargo.toml delete mode 100644 crates/vendor/uu-tr/LICENSE delete mode 100644 crates/vendor/uu-tr/src/simd.rs delete mode 100644 crates/vendor/uu-tr/src/tr.rs delete mode 100644 crates/vendor/uu-tr/src/unicode_table.rs delete mode 100644 crates/vendor/uu-truncate/BUILD.bazel delete mode 100644 crates/vendor/uu-truncate/Cargo.toml delete mode 100644 crates/vendor/uu-truncate/LICENSE delete mode 100644 crates/vendor/uu-uname/BUILD.bazel delete mode 100644 crates/vendor/uu-uname/Cargo.toml delete mode 100644 crates/vendor/uu-uname/LICENSE delete mode 100644 crates/vendor/uu-uname/src/uname.rs delete mode 100644 crates/vendor/uu-uniq/BUILD.bazel delete mode 100644 crates/vendor/uu-uniq/Cargo.toml delete mode 100644 crates/vendor/uu-uniq/LICENSE delete mode 100644 crates/vendor/uu-uniq/locales/en-US.ftl delete mode 100644 crates/vendor/uu-wc/BUILD.bazel delete mode 100644 crates/vendor/uu-wc/Cargo.toml delete mode 100644 crates/vendor/uu-wc/LICENSE delete mode 100644 crates/vendor/uu-wc/src/count_fast.rs delete mode 100644 crates/vendor/uu-wc/src/countable.rs delete mode 100644 crates/vendor/uu-wc/src/utf8/LICENSE delete mode 100644 crates/vendor/uu-wc/src/utf8/mod.rs delete mode 100644 crates/vendor/uu-wc/src/utf8/read.rs delete mode 100644 crates/vendor/uu-wc/src/wc.rs delete mode 100644 crates/vendor/uu-wc/src/word_count.rs delete mode 100644 crates/vendor/uu-whoami/BUILD.bazel delete mode 100644 crates/vendor/uu-whoami/Cargo.toml delete mode 100644 crates/vendor/uu-whoami/LICENSE delete mode 100644 crates/vendor/uu-whoami/src/whoami.rs delete mode 100644 crates/vendor/uu-xargs/BUILD.bazel delete mode 100644 crates/vendor/uu-xargs/Cargo.toml delete mode 100644 crates/vendor/uu-xargs/LICENSE delete mode 100644 crates/vendor/uu-xargs/src/lib.rs delete mode 100644 crates/vendor/uu-xargs/src/tests.rs delete mode 100644 crates/vendor/uu-yes/BUILD.bazel delete mode 100644 crates/vendor/uu-yes/Cargo.toml delete mode 100644 crates/vendor/uu-yes/LICENSE delete mode 100644 crates/vendor/uu-yes/src/yes.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9f9d9adab..559118073 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -163,14 +163,16 @@ jobs: # Clippy scope mirrors `cargo clippy --workspace` (libraries only, no # test targets) plus the strict/default split: crates with # `[lints] workspace = true` get the workspace policy, the vendored - # brush fork is exempt (same as run-rs-task.ts's cargo excludes). + # brush-core fork is exempt (same as run-rs-task.ts's cargo excludes). + # pi-builtins lands in the default-lints bucket below: it opts out of + # pedantic/nursery in its own manifest but is still linted. - name: Clippy (workspace lint policy on opted-in crates) run: | bazelisk query "kind('rust_library|rust_shared_library', //crates/pi-ast/... + //crates/pi-iso/... + //crates/pi-natives/... + //crates/pi-shell/... + //crates/pi-voice/... + //crates/pi-walker/...)" \ | xargs bazelisk --bazelrc="${{ steps.cache.outputs.rc }}" build --config=clippy-strict -- - name: Clippy (default lints elsewhere) run: | - bazelisk query "kind('rust_library|rust_shared_library', //crates/... - (//crates/pi-ast/... + //crates/pi-iso/... + //crates/pi-natives/... + //crates/pi-shell/... + //crates/pi-voice/... + //crates/pi-walker/...) - //crates/vendor/brush-core/... - //crates/vendor/brush-builtins/...)" \ + bazelisk query "kind('rust_library|rust_shared_library', //crates/... - (//crates/pi-ast/... + //crates/pi-iso/... + //crates/pi-natives/... + //crates/pi-shell/... + //crates/pi-voice/... + //crates/pi-walker/...) - //crates/vendor/brush-core/...)" \ | xargs bazelisk --bazelrc="${{ steps.cache.outputs.rc }}" build --config=clippy -- - name: Rustfmt run: bazelisk --bazelrc="${{ steps.cache.outputs.rc }}" build --config=rustfmt //crates/... diff --git a/Cargo.lock b/Cargo.lock index b58a83b56..336877a95 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -722,31 +722,6 @@ dependencies = [ "syn 2.0.119", ] -[[package]] -name = "brush-builtins" -version = "0.2.0" -dependencies = [ - "anyhow", - "brush-core", - "brush-parser 0.4.0", - "cfg-if", - "chrono", - "clap", - "fancy-regex 0.17.0", - "futures", - "itertools 0.14.0", - "nix 0.31.3", - "pretty_assertions", - "procfs", - "rlimit", - "strum", - "strum_macros", - "thiserror 2.0.19", - "tokio", - "tracing", - "uucore 0.8.0", -] - [[package]] name = "brush-core" version = "0.5.0" @@ -1114,16 +1089,6 @@ dependencies = [ "windows-link 0.2.1", ] -[[package]] -name = "chrono-tz" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" -dependencies = [ - "chrono", - "phf 0.12.1", -] - [[package]] name = "cipher" version = "0.4.4" @@ -2089,17 +2054,6 @@ dependencies = [ "regex-syntax", ] -[[package]] -name = "fancy-regex" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e1dacd0d2082dfcf1351c4bdd566bbe89a2b263235a2b50058f1e130a47277" -dependencies = [ - "bit-set", - "regex-automata", - "regex-syntax", -] - [[package]] name = "fastrand" version = "2.5.0" @@ -2416,12 +2370,6 @@ version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" -[[package]] -name = "futures-timer" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" - [[package]] name = "futures-util" version = "0.3.33" @@ -3366,23 +3314,6 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" -[[package]] -name = "jaq" -version = "2.3.0" -dependencies = [ - "codesnake", - "hifijson", - "jaq-core", - "jaq-json", - "jaq-std", - "memmap2", - "parking_lot", - "pi-uutils-ctx", - "tempfile", - "unicode-width 0.1.14", - "yansi", -] - [[package]] name = "jaq-core" version = "2.2.1" @@ -3934,18 +3865,6 @@ dependencies = [ "libc", ] -[[package]] -name = "nix" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" -dependencies = [ - "bitflags 2.13.1", - "cfg-if", - "cfg_aliases 0.2.2", - "libc", -] - [[package]] name = "nix" version = "0.30.1" @@ -4082,12 +4001,6 @@ dependencies = [ "libm", ] -[[package]] -name = "number_prefix" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" - [[package]] name = "objc2" version = "0.6.4" @@ -4733,15 +4646,6 @@ dependencies = [ "phf_shared 0.11.3", ] -[[package]] -name = "phf" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" -dependencies = [ - "phf_shared 0.12.1", -] - [[package]] name = "phf" version = "0.13.1" @@ -4849,15 +4753,6 @@ dependencies = [ "siphasher", ] -[[package]] -name = "phf_shared" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" -dependencies = [ - "siphasher", -] - [[package]] name = "phf_shared" version = "0.13.1" @@ -4945,6 +4840,90 @@ dependencies = [ "tree-sitter-zig", ] +[[package]] +name = "pi-builtins" +version = "17.2.11" +dependencies = [ + "ansi-width", + "anyhow", + "argmax", + "bigdecimal", + "binary-heap-plus", + "brush-core", + "brush-parser 0.4.0", + "bstr", + "bytecount", + "cfg-if", + "chrono", + "clap", + "codesnake", + "compare", + "dns-lookup", + "faccess", + "fancy-regex 0.17.0", + "filetime", + "flume", + "foldhash 0.2.0", + "fs_extra", + "futures", + "glob", + "globset", + "grep-cli", + "grep-matcher", + "grep-pcre2", + "grep-printer", + "grep-regex", + "grep-searcher", + "hex", + "hifijson", + "hostname", + "ignore", + "indicatif", + "itertools 0.14.0", + "jaq-core", + "jaq-json", + "jaq-std", + "jiff", + "libc", + "lscolors", + "memchr", + "memmap2", + "nix 0.31.3", + "nom 8.0.0", + "notify", + "num-bigint", + "num-traits", + "onig", + "os_display", + "parking_lot", + "parse_datetime", + "pi-walker", + "platform-info", + "pretty_assertions", + "procfs", + "rand 0.10.2", + "rayon", + "regex", + "rlimit", + "rustc-hash 2.1.3", + "rustix 1.1.4", + "self_cell", + "serde_json", + "similar 3.1.2", + "strum", + "strum_macros", + "tempfile", + "thiserror 2.0.19", + "tokio", + "tokio-util", + "tracing", + "unicode-width 0.2.2", + "uucore", + "uutils_term_grid", + "windows-sys 0.61.2", + "yansi", +] + [[package]] name = "pi-iso" version = "17.2.11" @@ -4999,7 +4978,6 @@ dependencies = [ "pi-ast", "pi-iso", "pi-shell", - "pi-uutils-ctx", "pi-voice", "pi-walker", "pipewire", @@ -5034,24 +5012,16 @@ name = "pi-shell" version = "17.2.11" dependencies = [ "anyhow", - "brush-builtins", "brush-core", "brush-parser 0.3.0", "bytes", "clap", "flume", - "globset", - "ignore", - "jaq", "jiff", "libc", - "memchr", "os_pipe", "parking_lot", - "pi-uutils-ctx", - "pi-walker", - "pi_uu_diff", - "pi_uu_grep", + "pi-builtins", "regex", "serde", "serde_json", @@ -5060,62 +5030,11 @@ dependencies = [ "tokio", "tokio-util", "toml", - "uu_b2sum", - "uu_base64", - "uu_basename", - "uu_cat", - "uu_comm", - "uu_cut", - "uu_date", - "uu_dirname", - "uu_find", - "uu_head", - "uu_hostname", - "uu_ln", - "uu_ls", - "uu_md5sum", - "uu_mkdir", - "uu_mktemp", - "uu_mv", - "uu_nproc", - "uu_paste", - "uu_printenv", - "uu_readlink", - "uu_realpath", - "uu_rm", - "uu_sed", - "uu_seq", - "uu_sha1sum", - "uu_sha224sum", - "uu_sha256sum", - "uu_sha384sum", - "uu_sha512sum", - "uu_sort", - "uu_stat", - "uu_tac", - "uu_tail", - "uu_tee", - "uu_touch", - "uu_tr", - "uu_truncate", - "uu_uname", - "uu_uniq", - "uu_wc", - "uu_whoami", - "uu_xargs", - "uu_yes", "windows-sys 0.61.2", "winreg 0.56.0", "xxhash-rust", ] -[[package]] -name = "pi-uutils-ctx" -version = "0.1.0" -dependencies = [ - "libc", -] - [[package]] name = "pi-voice" version = "17.2.11" @@ -5144,36 +5063,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "pi_uu_diff" -version = "0.8.0" -dependencies = [ - "clap", - "parking_lot", - "pi-uutils-ctx", - "similar 3.1.2", - "tempfile", -] - -[[package]] -name = "pi_uu_grep" -version = "0.8.0" -dependencies = [ - "clap", - "globset", - "grep-cli", - "grep-matcher", - "grep-pcre2", - "grep-printer", - "grep-regex", - "grep-searcher", - "ignore", - "parking_lot", - "pi-uutils-ctx", - "pi-walker", - "serde_json", -] - [[package]] name = "pin-project-lite" version = "0.2.17" @@ -5728,12 +5617,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "relative-path" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" - [[package]] name = "rend" version = "0.5.4" @@ -5826,35 +5709,6 @@ dependencies = [ "smallvec", ] -[[package]] -name = "rstest" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5a3193c063baaa2a95a33f03035c8a72b83d97a54916055ba22d35ed3839d49" -dependencies = [ - "futures-timer", - "futures-util", - "rstest_macros", -] - -[[package]] -name = "rstest_macros" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c845311f0ff7951c5506121a9ad75aec44d083c31583b2ea5a30bcb0b0abba0" -dependencies = [ - "cfg-if", - "glob", - "proc-macro-crate", - "proc-macro2", - "quote", - "regex", - "relative-path", - "rustc_version", - "syn 2.0.119", - "unicode-ident", -] - [[package]] name = "rtcp" version = "0.17.2" @@ -7616,582 +7470,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" -[[package]] -name = "uu_b2sum" -version = "0.8.0" -dependencies = [ - "clap", - "pi-uutils-ctx", - "uu_checksum_common", - "uucore 0.8.0", -] - -[[package]] -name = "uu_base32" -version = "0.8.0" -dependencies = [ - "clap", - "pi-uutils-ctx", - "uucore 0.8.0", -] - -[[package]] -name = "uu_base64" -version = "0.8.0" -dependencies = [ - "clap", - "parking_lot", - "pi-uutils-ctx", - "tempfile", - "uu_base32", - "uucore 0.8.0", -] - -[[package]] -name = "uu_basename" -version = "0.8.0" -dependencies = [ - "clap", - "pi-uutils-ctx", - "uucore 0.8.0", -] - -[[package]] -name = "uu_cat" -version = "0.8.0" -dependencies = [ - "clap", - "memchr", - "pi-uutils-ctx", - "thiserror 2.0.19", - "uucore 0.8.0", -] - -[[package]] -name = "uu_checksum_common" -version = "0.8.0" -dependencies = [ - "base64-simd", - "clap", - "hex", - "os_display", - "pi-uutils-ctx", - "uucore 0.8.0", -] - -[[package]] -name = "uu_comm" -version = "0.8.0" -dependencies = [ - "clap", - "pi-uutils-ctx", - "uucore 0.8.0", -] - -[[package]] -name = "uu_cut" -version = "0.8.0" -dependencies = [ - "bstr", - "clap", - "memchr", - "pi-uutils-ctx", - "uucore 0.8.0", -] - -[[package]] -name = "uu_date" -version = "0.8.0" -dependencies = [ - "clap", - "jiff", - "parking_lot", - "parse_datetime", - "pi-uutils-ctx", - "regex", - "rustix 1.1.4", - "tempfile", - "uucore 0.8.0", -] - -[[package]] -name = "uu_dirname" -version = "0.8.0" -dependencies = [ - "clap", - "parking_lot", - "pi-uutils-ctx", - "uucore 0.8.0", -] - -[[package]] -name = "uu_find" -version = "0.8.0" -dependencies = [ - "argmax", - "chrono", - "clap", - "faccess", - "filetime", - "nix 0.29.0", - "onig", - "parking_lot", - "pi-uutils-ctx", - "pi-walker", - "regex", - "tempfile", - "uucore 0.0.30", -] - -[[package]] -name = "uu_head" -version = "0.8.0" -dependencies = [ - "clap", - "memchr", - "pi-uutils-ctx", - "thiserror 2.0.19", - "uucore 0.8.0", -] - -[[package]] -name = "uu_hostname" -version = "0.8.0" -dependencies = [ - "clap", - "dns-lookup", - "hostname", - "parking_lot", - "pi-uutils-ctx", - "uucore 0.8.0", - "windows-sys 0.61.2", -] - -[[package]] -name = "uu_ln" -version = "0.8.0" -dependencies = [ - "clap", - "parking_lot", - "pi-uutils-ctx", - "tempfile", - "thiserror 2.0.19", - "uucore 0.8.0", -] - -[[package]] -name = "uu_ls" -version = "0.8.0" -dependencies = [ - "ansi-width", - "clap", - "glob", - "hostname", - "lscolors", - "pi-uutils-ctx", - "rustc-hash 2.1.3", - "thiserror 2.0.19", - "uucore 0.8.0", - "uutils_term_grid", -] - -[[package]] -name = "uu_md5sum" -version = "0.8.0" -dependencies = [ - "clap", - "uu_checksum_common", - "uucore 0.8.0", -] - -[[package]] -name = "uu_mkdir" -version = "0.8.0" -dependencies = [ - "clap", - "pi-uutils-ctx", - "rustix 1.1.4", - "uucore 0.8.0", -] - -[[package]] -name = "uu_mktemp" -version = "0.8.0" -dependencies = [ - "clap", - "parking_lot", - "pi-uutils-ctx", - "rand 0.10.2", - "tempfile", - "thiserror 2.0.19", - "uucore 0.8.0", -] - -[[package]] -name = "uu_mv" -version = "0.8.0" -dependencies = [ - "clap", - "fs_extra", - "indicatif", - "libc", - "pi-uutils-ctx", - "rustc-hash 2.1.3", - "thiserror 2.0.19", - "uucore 0.8.0", - "windows-sys 0.61.2", -] - -[[package]] -name = "uu_nproc" -version = "0.8.0" -dependencies = [ - "clap", - "libc", - "parking_lot", - "pi-uutils-ctx", - "uucore 0.8.0", -] - -[[package]] -name = "uu_paste" -version = "0.8.0" -dependencies = [ - "clap", - "pi-uutils-ctx", - "uucore 0.8.0", -] - -[[package]] -name = "uu_printenv" -version = "0.8.0" -dependencies = [ - "clap", - "parking_lot", - "pi-uutils-ctx", - "uucore 0.8.0", -] - -[[package]] -name = "uu_readlink" -version = "0.8.0" -dependencies = [ - "clap", - "parking_lot", - "pi-uutils-ctx", - "tempfile", - "uucore 0.8.0", -] - -[[package]] -name = "uu_realpath" -version = "0.8.0" -dependencies = [ - "clap", - "parking_lot", - "pi-uutils-ctx", - "tempfile", - "uucore 0.8.0", -] - -[[package]] -name = "uu_rm" -version = "0.8.0" -dependencies = [ - "clap", - "indicatif", - "libc", - "pi-uutils-ctx", - "thiserror 2.0.19", - "uucore 0.8.0", - "windows-sys 0.61.2", -] - -[[package]] -name = "uu_sed" -version = "0.1.1" -dependencies = [ - "clap", - "fancy-regex 0.18.0", - "memchr", - "memmap2", - "parking_lot", - "pi-uutils-ctx", - "regex", - "tempfile", - "uucore 0.9.0", -] - -[[package]] -name = "uu_seq" -version = "0.8.0" -dependencies = [ - "bigdecimal", - "clap", - "num-bigint", - "num-traits", - "parking_lot", - "pi-uutils-ctx", - "thiserror 2.0.19", - "uucore 0.8.0", -] - -[[package]] -name = "uu_sha1sum" -version = "0.8.0" -dependencies = [ - "clap", - "pi-uutils-ctx", - "uu_checksum_common", - "uucore 0.8.0", -] - -[[package]] -name = "uu_sha224sum" -version = "0.8.0" -dependencies = [ - "clap", - "pi-uutils-ctx", - "uu_checksum_common", - "uucore 0.8.0", -] - -[[package]] -name = "uu_sha256sum" -version = "0.8.0" -dependencies = [ - "clap", - "pi-uutils-ctx", - "uu_checksum_common", - "uucore 0.8.0", -] - -[[package]] -name = "uu_sha384sum" -version = "0.8.0" -dependencies = [ - "clap", - "pi-uutils-ctx", - "uu_checksum_common", - "uucore 0.8.0", -] - -[[package]] -name = "uu_sha512sum" -version = "0.8.0" -dependencies = [ - "clap", - "pi-uutils-ctx", - "uu_checksum_common", - "uucore 0.8.0", -] - -[[package]] -name = "uu_sort" -version = "0.8.0" -dependencies = [ - "bigdecimal", - "binary-heap-plus", - "clap", - "compare", - "flume", - "foldhash 0.2.0", - "itertools 0.14.0", - "memchr", - "nix 0.31.3", - "pi-uutils-ctx", - "rand 0.10.2", - "rayon", - "self_cell", - "tempfile", - "thiserror 2.0.19", - "uucore 0.8.0", -] - -[[package]] -name = "uu_stat" -version = "0.8.0" -dependencies = [ - "clap", - "parking_lot", - "pi-uutils-ctx", - "tempfile", - "thiserror 2.0.19", - "uucore 0.8.0", - "windows-sys 0.61.2", -] - -[[package]] -name = "uu_tac" -version = "0.8.0" -dependencies = [ - "clap", - "memchr", - "memmap2", - "parking_lot", - "pi-uutils-ctx", - "regex", - "tempfile", - "thiserror 2.0.19", - "uucore 0.8.0", -] - -[[package]] -name = "uu_tail" -version = "0.8.0" -dependencies = [ - "clap", - "libc", - "memchr", - "notify", - "parking_lot", - "pi-uutils-ctx", - "rstest", - "rustix 1.1.4", - "tempfile", - "uu_tac", - "uucore 0.8.0", - "windows-sys 0.61.2", -] - -[[package]] -name = "uu_tee" -version = "0.8.0" -dependencies = [ - "clap", - "pi-uutils-ctx", - "uucore 0.8.0", -] - -[[package]] -name = "uu_touch" -version = "0.8.0" -dependencies = [ - "clap", - "filetime", - "jiff", - "libc", - "parking_lot", - "parse_datetime", - "pi-uutils-ctx", - "rustix 1.1.4", - "tempfile", - "thiserror 2.0.19", - "uucore 0.8.0", - "windows-sys 0.61.2", -] - -[[package]] -name = "uu_tr" -version = "0.8.0" -dependencies = [ - "bytecount", - "clap", - "nom 8.0.0", - "pi-uutils-ctx", - "uucore 0.8.0", -] - -[[package]] -name = "uu_truncate" -version = "0.8.0" -dependencies = [ - "clap", - "parking_lot", - "pi-uutils-ctx", - "tempfile", - "uucore 0.8.0", -] - -[[package]] -name = "uu_uname" -version = "0.8.0" -dependencies = [ - "clap", - "parking_lot", - "pi-uutils-ctx", - "platform-info", - "uucore 0.8.0", -] - -[[package]] -name = "uu_uniq" -version = "0.8.0" -dependencies = [ - "clap", - "pi-uutils-ctx", - "uucore 0.8.0", -] - -[[package]] -name = "uu_wc" -version = "0.8.0" -dependencies = [ - "bytecount", - "clap", - "libc", - "pi-uutils-ctx", - "rustix 1.1.4", - "thiserror 2.0.19", - "unicode-width 0.2.2", - "uucore 0.8.0", -] - -[[package]] -name = "uu_whoami" -version = "0.8.0" -dependencies = [ - "clap", - "parking_lot", - "pi-uutils-ctx", - "uucore 0.8.0", - "windows-sys 0.61.2", -] - -[[package]] -name = "uu_xargs" -version = "0.8.0" -dependencies = [ - "clap", - "libc", - "parking_lot", - "pi-uutils-ctx", - "tempfile", -] - -[[package]] -name = "uu_yes" -version = "0.8.0" -dependencies = [ - "clap", - "itertools 0.14.0", - "parking_lot", - "pi-uutils-ctx", - "uucore 0.8.0", -] - -[[package]] -name = "uucore" -version = "0.0.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71f4e82877d06de779c611a3d54720f56f1e68b228fb30a5b6c66ef07e68263d" -dependencies = [ - "chrono", - "chrono-tz", - "clap", - "dunce", - "glob", - "iana-time-zone", - "libc", - "nix 0.29.0", - "number_prefix", - "os_display", - "uucore_procs 0.0.30", - "wild", - "winapi-util", - "windows-sys 0.59.0", -] - [[package]] name = "uucore" version = "0.8.0" @@ -8239,7 +7517,7 @@ dependencies = [ "thiserror 2.0.19", "unic-langid", "unit-prefix", - "uucore_procs 0.8.0", + "uucore_procs", "wild", "winapi-util", "windows-sys 0.61.2", @@ -8247,37 +7525,6 @@ dependencies = [ "z85", ] -[[package]] -name = "uucore" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069b34217c27f611e1589f540f58118dbf226a9e407d38ab472052ff075a1dc2" -dependencies = [ - "clap", - "fluent", - "fluent-syntax", - "libc", - "nix 0.31.3", - "os_display", - "rustc-hash 2.1.3", - "rustix 1.1.4", - "thiserror 2.0.19", - "unic-langid", - "uucore_procs 0.9.0", - "wild", -] - -[[package]] -name = "uucore_procs" -version = "0.0.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c72435859e812e602e225dea48d014abb6b1072220a8d44f2fe0565553b1f7e4" -dependencies = [ - "proc-macro2", - "quote", - "uuhelp_parser", -] - [[package]] name = "uucore_procs" version = "0.8.0" @@ -8288,22 +7535,6 @@ dependencies = [ "quote", ] -[[package]] -name = "uucore_procs" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34337da211e7abfff7189b794afb3b5018fe356fb36474b73645458fc1201350" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "uuhelp_parser" -version = "0.0.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb6d972f580f8223cb7052d8580aea2b7061e368cf476de32ea9457b19459ed" - [[package]] name = "uuid" version = "1.24.0" diff --git a/Cargo.toml b/Cargo.toml index f2931eec5..8ab180f72 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,6 @@ repository = "https://github.com/can1357/oh-my-pi" [patch.crates-io] brush-core = { path = "crates/vendor/brush-core" } -brush-builtins = { path = "crates/vendor/brush-builtins" } [profile.release] opt-level = 3 @@ -181,7 +180,7 @@ pi-shell = { path = "crates/pi-shell" } pi-voice = { path = "crates/pi-voice" } pi-walker = { path = "crates/pi-walker" } brush-core = { path = "crates/vendor/brush-core" } -brush-builtins = { path = "crates/vendor/brush-builtins" } +pi-builtins = { path = "crates/pi-builtins" } # ────────────────────────────────────────────────────────────────────────────── # Async Runtime & Concurrency diff --git a/MODULE.bazel b/MODULE.bazel index a364a32b7..4c9405ec8 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -145,7 +145,7 @@ crate.from_cargo( ], # The root manifest covers all workspace members, including the vendored # brush fork (members so their sources render hermetically; the - # [patch.crates-io] entries redirect brush-builtins' registry dep to them). + # [patch.crates-io] entry redirects brush-core's registry dep to it). manifests = ["//:Cargo.toml"], ) diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 1547b5227..418e3de0c 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -501,65 +501,15 @@ "REPO_MAPPING:rules_rust+,bazel_skylib bazel_skylib+", "REPO_MAPPING:rules_rust+,bazel_tools bazel_tools", "REPO_MAPPING:rules_rust+,rules_cc rules_cc+", - "FILE:@@//Cargo.lock 74de1bbe75d943165586e7d93c0927dc9364f04a228e09d9a8fc4d72913821b4", - "FILE:@@//Cargo.toml 022f835901fa62c996cd5daaf08b995bbd5c8492dfe30d4db2a35647e36c6aaf", + "FILE:@@//Cargo.lock 523a0435df21567eed77c97e99b898f766d1d2538edb3cf073a486d3a5d8b7a9", + "FILE:@@//Cargo.toml 18af71ee89a6c54f796cbe8702fe7b53839c64038ea93ac16a4e528ac51cc188", "FILE:@@//crates/pi-ast/Cargo.toml 4467b5854e91088ad1669756f7a0aaec3c2208fc28057a29982ccc902ecaf356", - "FILE:@@//crates/pi-iso/Cargo.toml 1cd7ed7e5e8cbe9b1683f38f1250d475d6bec29cd84c757af817eb5a79cffdb2", - "FILE:@@//crates/pi-natives/Cargo.toml 62615407c076b4c5dbb88a1b5ac7499856483c5012bd41068158ce924212fda5", - "FILE:@@//crates/pi-shell/Cargo.toml dff7badd2729fe8ba492500bab6119cb994f3d0bb21d559587b2c6a17168408a", - "FILE:@@//crates/vendor/brush-builtins/Cargo.toml 8fe6d032420ed1b915656fca1a37f86b1a2bf5f7cbb0d60d013c98fce86eaccd", - "FILE:@@//crates/vendor/brush-core/Cargo.toml cc50ec81f548f8ca4a3fd2b280665319dba66df9cbc9bd15c3edd6266bc3269c", - "FILE:@@//crates/vendor/jaq/Cargo.toml 5fe3521d1f65be68db98a0915e55efa0545980f1023ab7e591a39896106f6fb3", - "FILE:@@//crates/pi-uutils-ctx/Cargo.toml 50ae0a32682d4c0be6e670d112275c459fc8c15eda5282b15fe95ce1568e407a", + "FILE:@@//crates/pi-builtins/Cargo.toml 3fa7f3e979caf0ca93630c5dca2ab9997f94c247ddaa9452c581cc79afb55f64", "FILE:@@//crates/pi-walker/Cargo.toml 464d100d6326658eebdbe2742acb6c637d124ee77c686c1f5c404101f43c7347", - "FILE:@@//crates/pi-uu-diff/Cargo.toml bf156ee17e411d087f17bdc505d072fce867deb9ea31b5c907d44e053346ea6d", - "FILE:@@//crates/pi-uu-grep/Cargo.toml 9710fdaffc3b599874ce529c1e9219a8395748fb2645f939fd4070a6d8809476", - "FILE:@@//crates/vendor/uu-b2sum/Cargo.toml 5cf89671927aa8c2f68949f51665f00ebcf163f4ca47c62fea8cd51af8e10161", - "FILE:@@//crates/vendor/uu-checksum-common/Cargo.toml 90a0705282c5730a7e73aaa94a0892470d5f76e73bc907fbcf59a8e504c7791e", - "FILE:@@//crates/vendor/uu-base64/Cargo.toml c5e1a9a91ea22ea02e937296cb836be883ddc2905ea728a50d7c3ae3b3e27607", - "FILE:@@//crates/vendor/uu-base32/Cargo.toml ae685d39159b6bb9d9abb22d095fa421127312194cca9fc53d391d084d61cad2", - "FILE:@@//crates/vendor/uu-basename/Cargo.toml a33ecd32dee1f0488c9573b150df8139718ed4f76db613e80d4586b2d1b1ab11", - "FILE:@@//crates/vendor/uu-cat/Cargo.toml 8c22ba365a546ea4d83d2d5061a1eaaa2216bb29516b669f11701a3fb26f6879", - "FILE:@@//crates/vendor/uu-comm/Cargo.toml 7aac3caac65b33477cb2607be8f28517d86edfbcc3d0e9b450d89b46a6145393", - "FILE:@@//crates/vendor/uu-cut/Cargo.toml 153b8d7af3c0dc34e50c4c8e2f3183c4ccf24bf8b3bfd29e47df78a4d9df2910", - "FILE:@@//crates/vendor/uu-date/Cargo.toml 639bdcf221b76babcd36de73aaa1ae958bca60f5010e281c7026435befa33bbe", - "FILE:@@//crates/vendor/uu-dirname/Cargo.toml 59d4089cb1a01f42fc5584ecb0268b750eb1a04cc395d3657208b43b27a170d2", - "FILE:@@//crates/vendor/uu-find/Cargo.toml 1e91096b0487b51eaf407c9ce2b853d7108dbf3aa327684d7887f2e1108cd5fa", - "FILE:@@//crates/vendor/uu-head/Cargo.toml d16c96c33c114d5d5e1e5237e92a38b06287bfd0bd545a82d789f40b7ef98dae", - "FILE:@@//crates/vendor/uu-hostname/Cargo.toml c3cb74df5820162f7c6739cc878651f54f39670b887c3fd8e5e1a9b19e708a58", - "FILE:@@//crates/vendor/uu-ln/Cargo.toml 875fdb66f0e501eb9d41b7f8063f38df96686a84baf18c6e5bf657630ff42380", - "FILE:@@//crates/vendor/uu-ls/Cargo.toml 6d75538f6cefbae4bedc3901c06be656d2a0aa923552e8fe72a8e6c4c45ce776", - "FILE:@@//crates/vendor/uu-md5sum/Cargo.toml 4f733d56a7273ab812c92af2599611bcc932add4fb09f4adb82322dc9ad90b65", - "FILE:@@//crates/vendor/uu-mkdir/Cargo.toml 2336d17d21262597a002392de0e850f8fcbb48ec456c148a8074960ed7dd59d4", - "FILE:@@//crates/vendor/uu-mktemp/Cargo.toml f619ab74c89ce1606d781c817e262e36387cd711730b3a64af9842ac60827cc5", - "FILE:@@//crates/vendor/uu-mv/Cargo.toml 194786f17804492edadcdf4bd9f4e7775b34a0fa2239cfd9423ff9c561fe5b40", - "FILE:@@//crates/vendor/uu-nproc/Cargo.toml e120bab792e52d60504e27df1ec70f0d8f98b35e461007811aac6eb7a28bfd55", - "FILE:@@//crates/vendor/uu-paste/Cargo.toml 3b9c06282ebcd6ab10cbb470ed6705c190d16eef407fde696a077369330bc347", - "FILE:@@//crates/vendor/uu-printenv/Cargo.toml 2934d8d86986793053c04bfb738f9679f961f8e003a6a8ca87d149998453010b", - "FILE:@@//crates/vendor/uu-readlink/Cargo.toml 629de230ef83cd7f6b06fa874d567f0915c87fbd894081d481de0c997d1b4421", - "FILE:@@//crates/vendor/uu-realpath/Cargo.toml ff23ff3bd62748f09b94ce817fa4c293e849e143e2b0fa4180795789c0630744", - "FILE:@@//crates/vendor/uu-rm/Cargo.toml c8a990be4aaa3e85b1499241a29cef1c1efd47555d88b1dc3d511ab7733763ab", - "FILE:@@//crates/vendor/uu-sed/Cargo.toml 1b9935f0dcfca5d4b5704427afe8fca0004d0cf989020e873c66f643ddf68cae", - "FILE:@@//crates/vendor/uu-seq/Cargo.toml f8063d89796cecb0bcb4777b53965e9cd32efd82b1968eee2c996a87b671304f", - "FILE:@@//crates/vendor/uu-sha1sum/Cargo.toml b6137daf0ee0b64f068fd51001d2d6790cbcfb155947fa0e84dbb4500e6aec2a", - "FILE:@@//crates/vendor/uu-sha224sum/Cargo.toml 404b0c4450361566204c28ce1ddb5dc659b58a760e54fa212a4d8bd4940c4cf2", - "FILE:@@//crates/vendor/uu-sha256sum/Cargo.toml 87cb6cb470aa6f97424b5bd1c2c89be32b24f5169db100362f84edba87361e7c", - "FILE:@@//crates/vendor/uu-sha384sum/Cargo.toml 0b1b939415106026ba65c96a32a016164e80c46673c1c68f72dbd9a55ee64a2b", - "FILE:@@//crates/vendor/uu-sha512sum/Cargo.toml 84e1810a1ecad886f07fd47f509a49d3ddb960a6065f575c5234307301b2429f", - "FILE:@@//crates/vendor/uu-sort/Cargo.toml a4c15571a75a3f5d70c32c8ec9d55b84873c33897d737c6174ca62d4990d3518", - "FILE:@@//crates/vendor/uu-stat/Cargo.toml 53251d5273655706b1687720d88c12f691d2e8423b3443e9ab8b1368496c7af5", - "FILE:@@//crates/vendor/uu-tac/Cargo.toml fb1e84f20d57b090c029b82eec6fad412882b0b6e3f9b4c7ca65e15e5432285c", - "FILE:@@//crates/vendor/uu-tail/Cargo.toml aaf9a769caef68055fd9951c5f905e35b6adbe25c9fe078b2f1a27c9cee10b3d", - "FILE:@@//crates/vendor/uu-tee/Cargo.toml 238a0997492ccbc3bb88c0fdddafb7e3e0d2450802f2aa9d6e52eba5834f6729", - "FILE:@@//crates/vendor/uu-touch/Cargo.toml 981f4dc4094998dab5953e0c5b4e0a592ccdae9d5147dd07c30aaab6f12e9632", - "FILE:@@//crates/vendor/uu-tr/Cargo.toml 53845d22240dde56d67854df0dd2d7ad331a5bcda087c65799c35e5526392762", - "FILE:@@//crates/vendor/uu-truncate/Cargo.toml 4e3bacc3d5d2216da94fe0584d9409c58a90203255197082e18bb10d3716ffb7", - "FILE:@@//crates/vendor/uu-uname/Cargo.toml d3434df84c8067f1bd8c090626273db0232def138ffacbc94ed597dfc0294988", - "FILE:@@//crates/vendor/uu-uniq/Cargo.toml 249c721273ecdd061a6fbda0c8bbe83c36472d0ebdb1b5451926a8648028430d", - "FILE:@@//crates/vendor/uu-wc/Cargo.toml 9af4d9fe9f1bb66a4b838e0ac7d51d6f331e39576e86b0836f39cbe9a3432a92", - "FILE:@@//crates/vendor/uu-whoami/Cargo.toml 4d2e3cd67fc1408641dca3f77c754dfc245777d5c3f1260014694632e4c48540", - "FILE:@@//crates/vendor/uu-xargs/Cargo.toml ecd2699904131db4fac1592793816a1e063f57100d5e599da095adcf919b27ef", - "FILE:@@//crates/vendor/uu-yes/Cargo.toml 6a717ee1ec2f45d388858c3e2333e315532f8cbc4e30805ad5cece19cb59a4dc", + "FILE:@@//crates/pi-iso/Cargo.toml 1cd7ed7e5e8cbe9b1683f38f1250d475d6bec29cd84c757af817eb5a79cffdb2", + "FILE:@@//crates/pi-natives/Cargo.toml 65009d558c255476ca2554e78e8d2410b30c2af48c293d49ebf34a46bb853546", + "FILE:@@//crates/pi-shell/Cargo.toml 33e310fe70852a0fe983008d5fa89e66bc46ef97a4549bda1e204a019359ceb8", + "FILE:@@//crates/vendor/brush-core/Cargo.toml cc50ec81f548f8ca4a3fd2b280665319dba66df9cbc9bd15c3edd6266bc3269c", "FILE:@@//crates/pi-voice/Cargo.toml 565b5e48abc8bf664827d4d08924b5b8819c6b7b870fb659e479e1f87f183fc0" ], "generatedRepoSpecs": { @@ -567,9 +517,9 @@ "repoRuleId": "@@rules_rust+//crate_universe/private:crates_vendor.bzl%crates_vendor_remote_repository", "attributes": { "contents": { - "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n [\n \"cargo-bazel.json\",\n \"crates.bzl\",\n \"defs.bzl\",\n ] + glob(\n allow_empty = True,\n include = [\"*.bazel\"],\n ),\n)\n\nfilegroup(\n name = \"srcs\",\n srcs = glob(\n allow_empty = True,\n include = [\n \"*.bazel\",\n \"*.bzl\",\n ],\n ),\n)\n\n# Workspace Member Dependencies\nalias(\n name = \"ansi-width-0.1.0\",\n actual = \"@crates__ansi-width-0.1.0//:ansi_width\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ansi-width\",\n actual = \"@crates__ansi-width-0.1.0//:ansi_width\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"anyhow-1.0.104\",\n actual = \"@crates__anyhow-1.0.104//:anyhow\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"anyhow\",\n actual = \"@crates__anyhow-1.0.104//:anyhow\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"arboard-3.6.1\",\n actual = \"@crates__arboard-3.6.1//:arboard\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"arboard\",\n actual = \"@crates__arboard-3.6.1//:arboard\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"argmax-0.3.1\",\n actual = \"@crates__argmax-0.3.1//:argmax\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"argmax\",\n actual = \"@crates__argmax-0.3.1//:argmax\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ashpd-0.11.1\",\n actual = \"@crates__ashpd-0.11.1//:ashpd\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ashpd\",\n actual = \"@crates__ashpd-0.11.1//:ashpd\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ast-grep-core-0.39.9\",\n actual = \"@crates__ast-grep-core-0.39.9//:ast_grep_core\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ast-grep-core\",\n actual = \"@crates__ast-grep-core-0.39.9//:ast_grep_core\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-recursion-1.1.1\",\n actual = \"@crates__async-recursion-1.1.1//:async_recursion\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-recursion\",\n actual = \"@crates__async-recursion-1.1.1//:async_recursion\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait-0.1.91\",\n actual = \"@crates__async-trait-0.1.91//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait\",\n actual = \"@crates__async-trait-0.1.91//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"atspi-0.30.0\",\n actual = \"@crates__atspi-0.30.0//:atspi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"atspi\",\n actual = \"@crates__atspi-0.30.0//:atspi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"audiopus_sys-0.2.2\",\n actual = \"@crates__audiopus_sys-0.2.2//:audiopus_sys\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"audiopus_sys\",\n actual = \"@crates__audiopus_sys-0.2.2//:audiopus_sys\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"base64-0.22.1\",\n actual = \"@crates__base64-0.22.1//:base64\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"base64\",\n actual = \"@crates__base64-0.22.1//:base64\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"base64-simd-0.8.0\",\n actual = \"@crates__base64-simd-0.8.0//:base64_simd\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"base64-simd\",\n actual = \"@crates__base64-simd-0.8.0//:base64_simd\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bigdecimal-0.4.10\",\n actual = \"@crates__bigdecimal-0.4.10//:bigdecimal\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bigdecimal\",\n actual = \"@crates__bigdecimal-0.4.10//:bigdecimal\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"binary-heap-plus-0.5.0\",\n actual = \"@crates__binary-heap-plus-0.5.0//:binary_heap_plus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"binary-heap-plus\",\n actual = \"@crates__binary-heap-plus-0.5.0//:binary_heap_plus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bon-3.9.3\",\n actual = \"@crates__bon-3.9.3//:bon\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bon\",\n actual = \"@crates__bon-3.9.3//:bon\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"brush-parser-0.3.0\",\n actual = \"@crates__brush-parser-0.3.0//:brush_parser\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"brush-parser-0.4.0\",\n actual = \"@crates__brush-parser-0.4.0//:brush_parser\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bstr-1.13.0\",\n actual = \"@crates__bstr-1.13.0//:bstr\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bstr\",\n actual = \"@crates__bstr-1.13.0//:bstr\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bytecount-0.6.9\",\n actual = \"@crates__bytecount-0.6.9//:bytecount\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bytecount\",\n actual = \"@crates__bytecount-0.6.9//:bytecount\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bytes-1.12.1\",\n actual = \"@crates__bytes-1.12.1//:bytes\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bytes\",\n actual = \"@crates__bytes-1.12.1//:bytes\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"cached-0.59.0\",\n actual = \"@crates__cached-0.59.0//:cached\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"cached\",\n actual = \"@crates__cached-0.59.0//:cached\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"cfg-if-1.0.4\",\n actual = \"@crates__cfg-if-1.0.4//:cfg_if\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"cfg-if\",\n actual = \"@crates__cfg-if-1.0.4//:cfg_if\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"check_elevation-0.2.7\",\n actual = \"@crates__check_elevation-0.2.7//:check_elevation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"check_elevation\",\n actual = \"@crates__check_elevation-0.2.7//:check_elevation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"chrono-0.4.45\",\n actual = \"@crates__chrono-0.4.45//:chrono\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"chrono\",\n actual = \"@crates__chrono-0.4.45//:chrono\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap-4.6.6\",\n actual = \"@crates__clap-4.6.6//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap\",\n actual = \"@crates__clap-4.6.6//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clipboard-win-5.4.1\",\n actual = \"@crates__clipboard-win-5.4.1//:clipboard_win\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clipboard-win\",\n actual = \"@crates__clipboard-win-5.4.1//:clipboard_win\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"codesnake-0.2.1\",\n actual = \"@crates__codesnake-0.2.1//:codesnake\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"codesnake\",\n actual = \"@crates__codesnake-0.2.1//:codesnake\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"color-print-0.3.7\",\n actual = \"@crates__color-print-0.3.7//:color_print\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"color-print\",\n actual = \"@crates__color-print-0.3.7//:color_print\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"command-fds-0.3.3\",\n actual = \"@crates__command-fds-0.3.3//:command_fds\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"command-fds\",\n actual = \"@crates__command-fds-0.3.3//:command_fds\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"compare-0.1.0\",\n actual = \"@crates__compare-0.1.0//:compare\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"compare\",\n actual = \"@crates__compare-0.1.0//:compare\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"core-graphics-0.25.0\",\n actual = \"@crates__core-graphics-0.25.0//:core_graphics\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"core-graphics\",\n actual = \"@crates__core-graphics-0.25.0//:core_graphics\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"dashmap-6.2.1\",\n actual = \"@crates__dashmap-6.2.1//:dashmap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"dashmap\",\n actual = \"@crates__dashmap-6.2.1//:dashmap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"dns-lookup-3.0.1\",\n actual = \"@crates__dns-lookup-3.0.1//:dns_lookup\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"dns-lookup\",\n actual = \"@crates__dns-lookup-3.0.1//:dns_lookup\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"enigo-0.6.1\",\n actual = \"@crates__enigo-0.6.1//:enigo\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"enigo\",\n actual = \"@crates__enigo-0.6.1//:enigo\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"faccess-0.2.4\",\n actual = \"@crates__faccess-0.2.4//:faccess\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"faccess\",\n actual = \"@crates__faccess-0.2.4//:faccess\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fancy-regex-0.17.0\",\n actual = \"@crates__fancy-regex-0.17.0//:fancy_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fancy-regex-0.18.0\",\n actual = \"@crates__fancy-regex-0.18.0//:fancy_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"filetime-0.2.29\",\n actual = \"@crates__filetime-0.2.29//:filetime\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"filetime\",\n actual = \"@crates__filetime-0.2.29//:filetime\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"flume-0.11.1\",\n actual = \"@crates__flume-0.11.1//:flume\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"flume\",\n actual = \"@crates__flume-0.11.1//:flume\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"foldhash-0.2.0\",\n actual = \"@crates__foldhash-0.2.0//:foldhash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"foldhash\",\n actual = \"@crates__foldhash-0.2.0//:foldhash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fontdue-0.9.4\",\n actual = \"@crates__fontdue-0.9.4//:fontdue\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fontdue\",\n actual = \"@crates__fontdue-0.9.4//:fontdue\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"foreign-types-0.5.0\",\n actual = \"@crates__foreign-types-0.5.0//:foreign_types\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"foreign-types\",\n actual = \"@crates__foreign-types-0.5.0//:foreign_types\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fs_extra-1.3.0\",\n actual = \"@crates__fs_extra-1.3.0//:fs_extra\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fs_extra\",\n actual = \"@crates__fs_extra-1.3.0//:fs_extra\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"futures-0.3.33\",\n actual = \"@crates__futures-0.3.33//:futures\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"futures\",\n actual = \"@crates__futures-0.3.33//:futures\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"getrandom-0.4.3\",\n actual = \"@crates__getrandom-0.4.3//:getrandom\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"getrandom\",\n actual = \"@crates__getrandom-0.4.3//:getrandom\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"glob-0.3.4\",\n actual = \"@crates__glob-0.3.4//:glob\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"glob\",\n actual = \"@crates__glob-0.3.4//:glob\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"globset-0.4.20\",\n actual = \"@crates__globset-0.4.20//:globset\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"globset\",\n actual = \"@crates__globset-0.4.20//:globset\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-cli-0.1.12\",\n actual = \"@crates__grep-cli-0.1.12//:grep_cli\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-cli\",\n actual = \"@crates__grep-cli-0.1.12//:grep_cli\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-matcher-0.1.9\",\n actual = \"@crates__grep-matcher-0.1.9//:grep_matcher\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-matcher\",\n actual = \"@crates__grep-matcher-0.1.9//:grep_matcher\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-pcre2-0.1.10\",\n actual = \"@crates__grep-pcre2-0.1.10//:grep_pcre2\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-pcre2\",\n actual = \"@crates__grep-pcre2-0.1.10//:grep_pcre2\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-printer-0.3.1\",\n actual = \"@crates__grep-printer-0.3.1//:grep_printer\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-printer\",\n actual = \"@crates__grep-printer-0.3.1//:grep_printer\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-regex-0.1.14\",\n actual = \"@crates__grep-regex-0.1.14//:grep_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-regex\",\n actual = \"@crates__grep-regex-0.1.14//:grep_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-searcher-0.1.17\",\n actual = \"@crates__grep-searcher-0.1.17//:grep_searcher\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-searcher\",\n actual = \"@crates__grep-searcher-0.1.17//:grep_searcher\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hex-0.4.3\",\n actual = \"@crates__hex-0.4.3//:hex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hex\",\n actual = \"@crates__hex-0.4.3//:hex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hifijson-0.2.3\",\n actual = \"@crates__hifijson-0.2.3//:hifijson\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hifijson\",\n actual = \"@crates__hifijson-0.2.3//:hifijson\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hostname-0.4.2\",\n actual = \"@crates__hostname-0.4.2//:hostname\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hostname\",\n actual = \"@crates__hostname-0.4.2//:hostname\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"html-to-markdown-rs-3.10.6\",\n actual = \"@crates__html-to-markdown-rs-3.10.6//:html_to_markdown_rs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"html-to-markdown-rs\",\n actual = \"@crates__html-to-markdown-rs-3.10.6//:html_to_markdown_rs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"icy_sixel-0.5.0\",\n actual = \"@crates__icy_sixel-0.5.0//:icy_sixel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"icy_sixel\",\n actual = \"@crates__icy_sixel-0.5.0//:icy_sixel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ignore-0.4.33\",\n actual = \"@crates__ignore-0.4.33//:ignore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ignore\",\n actual = \"@crates__ignore-0.4.33//:ignore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"image-0.25.10\",\n actual = \"@crates__image-0.25.10//:image\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"image\",\n actual = \"@crates__image-0.25.10//:image\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"indicatif-0.18.6\",\n actual = \"@crates__indicatif-0.18.6//:indicatif\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"indicatif\",\n actual = \"@crates__indicatif-0.18.6//:indicatif\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"inferno-0.12.8\",\n actual = \"@crates__inferno-0.12.8//:inferno\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"inferno\",\n actual = \"@crates__inferno-0.12.8//:inferno\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"inherent-1.0.14\",\n actual = \"@crates__inherent-1.0.14//:inherent\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"inherent\",\n actual = \"@crates__inherent-1.0.14//:inherent\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"itertools-0.14.0\",\n actual = \"@crates__itertools-0.14.0//:itertools\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"itertools\",\n actual = \"@crates__itertools-0.14.0//:itertools\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-core-2.2.1\",\n actual = \"@crates__jaq-core-2.2.1//:jaq_core\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-core\",\n actual = \"@crates__jaq-core-2.2.1//:jaq_core\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-json-1.1.3\",\n actual = \"@crates__jaq-json-1.1.3//:jaq_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-json\",\n actual = \"@crates__jaq-json-1.1.3//:jaq_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-std-2.1.2\",\n actual = \"@crates__jaq-std-2.1.2//:jaq_std\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-std\",\n actual = \"@crates__jaq-std-2.1.2//:jaq_std\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jiff-0.2.35\",\n actual = \"@crates__jiff-0.2.35//:jiff\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jiff\",\n actual = \"@crates__jiff-0.2.35//:jiff\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"libc-0.2.189\",\n actual = \"@crates__libc-0.2.189//:libc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"libc\",\n actual = \"@crates__libc-0.2.189//:libc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"lscolors-0.21.0\",\n actual = \"@crates__lscolors-0.21.0//:lscolors\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"lscolors\",\n actual = \"@crates__lscolors-0.21.0//:lscolors\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"memchr-2.8.3\",\n actual = \"@crates__memchr-2.8.3//:memchr\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"memchr\",\n actual = \"@crates__memchr-2.8.3//:memchr\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"memmap2-0.9.11\",\n actual = \"@crates__memmap2-0.9.11//:memmap2\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"memmap2\",\n actual = \"@crates__memmap2-0.9.11//:memmap2\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-3.12.0\",\n actual = \"@crates__napi-3.12.0//:napi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi\",\n actual = \"@crates__napi-3.12.0//:napi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-build-2.4.0\",\n actual = \"@crates__napi-build-2.4.0//:napi_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-build\",\n actual = \"@crates__napi-build-2.4.0//:napi_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-derive-3.6.2\",\n actual = \"@crates__napi-derive-3.6.2//:napi_derive\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-derive\",\n actual = \"@crates__napi-derive-3.6.2//:napi_derive\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"nix-0.29.0\",\n actual = \"@crates__nix-0.29.0//:nix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"nix-0.31.3\",\n actual = \"@crates__nix-0.31.3//:nix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"nom-8.0.0\",\n actual = \"@crates__nom-8.0.0//:nom\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"nom\",\n actual = \"@crates__nom-8.0.0//:nom\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"normalize-path-0.2.1\",\n actual = \"@crates__normalize-path-0.2.1//:normalize_path\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"normalize-path\",\n actual = \"@crates__normalize-path-0.2.1//:normalize_path\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"notify-8.2.0\",\n actual = \"@crates__notify-8.2.0//:notify\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"notify\",\n actual = \"@crates__notify-8.2.0//:notify\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num-bigint-0.4.8\",\n actual = \"@crates__num-bigint-0.4.8//:num_bigint\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num-bigint\",\n actual = \"@crates__num-bigint-0.4.8//:num_bigint\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num-traits-0.2.19\",\n actual = \"@crates__num-traits-0.2.19//:num_traits\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num-traits\",\n actual = \"@crates__num-traits-0.2.19//:num_traits\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-app-kit-0.3.2\",\n actual = \"@crates__objc2-app-kit-0.3.2//:objc2_app_kit\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-app-kit\",\n actual = \"@crates__objc2-app-kit-0.3.2//:objc2_app_kit\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-application-services-0.3.2\",\n actual = \"@crates__objc2-application-services-0.3.2//:objc2_application_services\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-application-services\",\n actual = \"@crates__objc2-application-services-0.3.2//:objc2_application_services\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-core-foundation-0.3.2\",\n actual = \"@crates__objc2-core-foundation-0.3.2//:objc2_core_foundation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-core-foundation\",\n actual = \"@crates__objc2-core-foundation-0.3.2//:objc2_core_foundation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-core-graphics-0.3.2\",\n actual = \"@crates__objc2-core-graphics-0.3.2//:objc2_core_graphics\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-core-graphics\",\n actual = \"@crates__objc2-core-graphics-0.3.2//:objc2_core_graphics\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-foundation-0.3.2\",\n actual = \"@crates__objc2-foundation-0.3.2//:objc2_foundation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-foundation\",\n actual = \"@crates__objc2-foundation-0.3.2//:objc2_foundation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"onig-6.5.3\",\n actual = \"@crates__onig-6.5.3//:onig\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"onig\",\n actual = \"@crates__onig-6.5.3//:onig\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"opus-0.3.1\",\n actual = \"@crates__opus-0.3.1//:opus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"opus\",\n actual = \"@crates__opus-0.3.1//:opus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"os_display-0.1.4\",\n actual = \"@crates__os_display-0.1.4//:os_display\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"os_display\",\n actual = \"@crates__os_display-0.1.4//:os_display\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"os_pipe-1.2.3\",\n actual = \"@crates__os_pipe-1.2.3//:os_pipe\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"os_pipe\",\n actual = \"@crates__os_pipe-1.2.3//:os_pipe\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"parking_lot-0.12.5\",\n actual = \"@crates__parking_lot-0.12.5//:parking_lot\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"parking_lot\",\n actual = \"@crates__parking_lot-0.12.5//:parking_lot\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"parse_datetime-0.14.0\",\n actual = \"@crates__parse_datetime-0.14.0//:parse_datetime\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"parse_datetime\",\n actual = \"@crates__parse_datetime-0.14.0//:parse_datetime\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"phf-0.13.1\",\n actual = \"@crates__phf-0.13.1//:phf\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"phf\",\n actual = \"@crates__phf-0.13.1//:phf\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pi-shell-17.2.11\",\n actual = \"@crates__pi-shell-17.2.11//:pi_shell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pi-shell\",\n actual = \"@crates__pi-shell-17.2.11//:pi_shell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"platform-info-2.1.0\",\n actual = \"@crates__platform-info-2.1.0//:platform_info\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"platform-info\",\n actual = \"@crates__platform-info-2.1.0//:platform_info\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"png-0.18.1\",\n actual = \"@crates__png-0.18.1//:png\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"png\",\n actual = \"@crates__png-0.18.1//:png\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"portable-pty-0.9.0\",\n actual = \"@crates__portable-pty-0.9.0//:portable_pty\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"portable-pty\",\n actual = \"@crates__portable-pty-0.9.0//:portable_pty\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pretty_assertions-1.4.1\",\n actual = \"@crates__pretty_assertions-1.4.1//:pretty_assertions\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pretty_assertions\",\n actual = \"@crates__pretty_assertions-1.4.1//:pretty_assertions\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"procfs-0.18.0\",\n actual = \"@crates__procfs-0.18.0//:procfs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"procfs\",\n actual = \"@crates__procfs-0.18.0//:procfs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rand-0.10.2\",\n actual = \"@crates__rand-0.10.2//:rand\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rand\",\n actual = \"@crates__rand-0.10.2//:rand\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rayon-1.12.0\",\n actual = \"@crates__rayon-1.12.0//:rayon\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rayon\",\n actual = \"@crates__rayon-1.12.0//:rayon\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"regex-1.13.1\",\n actual = \"@crates__regex-1.13.1//:regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"regex\",\n actual = \"@crates__regex-1.13.1//:regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"reis-0.5.0\",\n actual = \"@crates__reis-0.5.0//:reis\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"reis\",\n actual = \"@crates__reis-0.5.0//:reis\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rlimit-0.11.0\",\n actual = \"@crates__rlimit-0.11.0//:rlimit\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rlimit\",\n actual = \"@crates__rlimit-0.11.0//:rlimit\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rpds-1.2.1\",\n actual = \"@crates__rpds-1.2.1//:rpds\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rpds\",\n actual = \"@crates__rpds-1.2.1//:rpds\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rstest-0.26.1\",\n actual = \"@crates__rstest-0.26.1//:rstest\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rstest\",\n actual = \"@crates__rstest-0.26.1//:rstest\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rustc-hash-2.1.3\",\n actual = \"@crates__rustc-hash-2.1.3//:rustc_hash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rustc-hash\",\n actual = \"@crates__rustc-hash-2.1.3//:rustc_hash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rustix-1.1.4\",\n actual = \"@crates__rustix-1.1.4//:rustix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rustix\",\n actual = \"@crates__rustix-1.1.4//:rustix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"self_cell-1.3.0\",\n actual = \"@crates__self_cell-1.3.0//:self_cell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"self_cell\",\n actual = \"@crates__self_cell-1.3.0//:self_cell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde-1.0.229\",\n actual = \"@crates__serde-1.0.229//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde\",\n actual = \"@crates__serde-1.0.229//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json-1.0.151\",\n actual = \"@crates__serde_json-1.0.151//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json\",\n actual = \"@crates__serde_json-1.0.151//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"similar-3.1.2\",\n actual = \"@crates__similar-3.1.2//:similar\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"similar\",\n actual = \"@crates__similar-3.1.2//:similar\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"smallvec-1.15.2\",\n actual = \"@crates__smallvec-1.15.2//:smallvec\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"smallvec\",\n actual = \"@crates__smallvec-1.15.2//:smallvec\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"strum-0.28.0\",\n actual = \"@crates__strum-0.28.0//:strum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"strum\",\n actual = \"@crates__strum-0.28.0//:strum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"strum_macros-0.28.0\",\n actual = \"@crates__strum_macros-0.28.0//:strum_macros\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"strum_macros\",\n actual = \"@crates__strum_macros-0.28.0//:strum_macros\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"syntect-5.3.0\",\n actual = \"@crates__syntect-5.3.0//:syntect\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"syntect\",\n actual = \"@crates__syntect-5.3.0//:syntect\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile-3.27.0\",\n actual = \"@crates__tempfile-3.27.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile\",\n actual = \"@crates__tempfile-3.27.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"terminfo-0.9.0\",\n actual = \"@crates__terminfo-0.9.0//:terminfo\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"terminfo\",\n actual = \"@crates__terminfo-0.9.0//:terminfo\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"thiserror-2.0.19\",\n actual = \"@crates__thiserror-2.0.19//:thiserror\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"thiserror\",\n actual = \"@crates__thiserror-2.0.19//:thiserror\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tiktoken-rs-0.11.0\",\n actual = \"@crates__tiktoken-rs-0.11.0//:tiktoken_rs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tiktoken-rs\",\n actual = \"@crates__tiktoken-rs-0.11.0//:tiktoken_rs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-1.53.1\",\n actual = \"@crates__tokio-1.53.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio\",\n actual = \"@crates__tokio-1.53.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-util-0.7.19\",\n actual = \"@crates__tokio-util-0.7.19//:tokio_util\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-util\",\n actual = \"@crates__tokio-util-0.7.19//:tokio_util\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"toml-1.1.4+spec-1.1.0\",\n actual = \"@crates__toml-1.1.4-spec-1.1.0//:toml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"toml\",\n actual = \"@crates__toml-1.1.4-spec-1.1.0//:toml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tracing-0.1.44\",\n actual = \"@crates__tracing-0.1.44//:tracing\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tracing\",\n actual = \"@crates__tracing-0.1.44//:tracing\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-0.25.10\",\n actual = \"@crates__tree-sitter-0.25.10//:tree_sitter\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter\",\n actual = \"@crates__tree-sitter-0.25.10//:tree_sitter\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-astro-next-0.1.1\",\n actual = \"@crates__tree-sitter-astro-next-0.1.1//:tree_sitter_astro_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_astro-0.1.1\",\n actual = \"@crates__tree-sitter-astro-next-0.1.1//:tree_sitter_astro_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_astro\",\n actual = \"@crates__tree-sitter-astro-next-0.1.1//:tree_sitter_astro_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-bash-0.25.1\",\n actual = \"@crates__tree-sitter-bash-0.25.1//:tree_sitter_bash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-bash\",\n actual = \"@crates__tree-sitter-bash-0.25.1//:tree_sitter_bash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-c-0.24.2\",\n actual = \"@crates__tree-sitter-c-0.24.2//:tree_sitter_c\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-c\",\n actual = \"@crates__tree-sitter-c-0.24.2//:tree_sitter_c\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-c-sharp-0.23.5\",\n actual = \"@crates__tree-sitter-c-sharp-0.23.5//:tree_sitter_c_sharp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-c-sharp\",\n actual = \"@crates__tree-sitter-c-sharp-0.23.5//:tree_sitter_c_sharp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-clojure-0.1.0\",\n actual = \"@crates__tree-sitter-clojure-0.1.0//:tree_sitter_clojure\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-clojure\",\n actual = \"@crates__tree-sitter-clojure-0.1.0//:tree_sitter_clojure\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-cmake-0.7.4\",\n actual = \"@crates__tree-sitter-cmake-0.7.4//:tree_sitter_cmake\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-cmake\",\n actual = \"@crates__tree-sitter-cmake-0.7.4//:tree_sitter_cmake\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-cpp-0.23.4\",\n actual = \"@crates__tree-sitter-cpp-0.23.4//:tree_sitter_cpp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-cpp\",\n actual = \"@crates__tree-sitter-cpp-0.23.4//:tree_sitter_cpp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-css-0.25.0\",\n actual = \"@crates__tree-sitter-css-0.25.0//:tree_sitter_css\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-css\",\n actual = \"@crates__tree-sitter-css-0.25.0//:tree_sitter_css\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-dart-0.2.0\",\n actual = \"@crates__tree-sitter-dart-0.2.0//:tree_sitter_dart\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-dart\",\n actual = \"@crates__tree-sitter-dart-0.2.0//:tree_sitter_dart\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-diff-0.1.0\",\n actual = \"@crates__tree-sitter-diff-0.1.0//:tree_sitter_diff\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-diff\",\n actual = \"@crates__tree-sitter-diff-0.1.0//:tree_sitter_diff\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-dockerfile-updated-0.2.0\",\n actual = \"@crates__tree-sitter-dockerfile-updated-0.2.0//:tree_sitter_dockerfile_updated\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_dockerfile-0.2.0\",\n actual = \"@crates__tree-sitter-dockerfile-updated-0.2.0//:tree_sitter_dockerfile_updated\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_dockerfile\",\n actual = \"@crates__tree-sitter-dockerfile-updated-0.2.0//:tree_sitter_dockerfile_updated\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-elisp-1.7.2\",\n actual = \"@crates__tree-sitter-elisp-1.7.2//:tree_sitter_elisp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-elisp\",\n actual = \"@crates__tree-sitter-elisp-1.7.2//:tree_sitter_elisp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-elixir-0.3.5\",\n actual = \"@crates__tree-sitter-elixir-0.3.5//:tree_sitter_elixir\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-elixir\",\n actual = \"@crates__tree-sitter-elixir-0.3.5//:tree_sitter_elixir\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-erlang-0.16.0\",\n actual = \"@crates__tree-sitter-erlang-0.16.0//:tree_sitter_erlang\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-erlang\",\n actual = \"@crates__tree-sitter-erlang-0.16.0//:tree_sitter_erlang\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-fortran-0.6.0\",\n actual = \"@crates__tree-sitter-fortran-0.6.0//:tree_sitter_fortran\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-fortran\",\n actual = \"@crates__tree-sitter-fortran-0.6.0//:tree_sitter_fortran\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-go-0.25.0\",\n actual = \"@crates__tree-sitter-go-0.25.0//:tree_sitter_go\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-go\",\n actual = \"@crates__tree-sitter-go-0.25.0//:tree_sitter_go\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-graphql-0.1.0\",\n actual = \"@crates__tree-sitter-graphql-0.1.0//:tree_sitter_graphql\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-graphql\",\n actual = \"@crates__tree-sitter-graphql-0.1.0//:tree_sitter_graphql\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-haskell-0.23.1\",\n actual = \"@crates__tree-sitter-haskell-0.23.1//:tree_sitter_haskell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-haskell\",\n actual = \"@crates__tree-sitter-haskell-0.23.1//:tree_sitter_haskell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-hcl-1.1.0\",\n actual = \"@crates__tree-sitter-hcl-1.1.0//:tree_sitter_hcl\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-hcl\",\n actual = \"@crates__tree-sitter-hcl-1.1.0//:tree_sitter_hcl\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-html-0.23.2\",\n actual = \"@crates__tree-sitter-html-0.23.2//:tree_sitter_html\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-html\",\n actual = \"@crates__tree-sitter-html-0.23.2//:tree_sitter_html\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ini-1.4.0\",\n actual = \"@crates__tree-sitter-ini-1.4.0//:tree_sitter_ini\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ini\",\n actual = \"@crates__tree-sitter-ini-1.4.0//:tree_sitter_ini\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-java-0.23.5\",\n actual = \"@crates__tree-sitter-java-0.23.5//:tree_sitter_java\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-java\",\n actual = \"@crates__tree-sitter-java-0.23.5//:tree_sitter_java\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-javascript-0.25.0\",\n actual = \"@crates__tree-sitter-javascript-0.25.0//:tree_sitter_javascript\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-javascript\",\n actual = \"@crates__tree-sitter-javascript-0.25.0//:tree_sitter_javascript\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-json-0.24.8\",\n actual = \"@crates__tree-sitter-json-0.24.8//:tree_sitter_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-json\",\n actual = \"@crates__tree-sitter-json-0.24.8//:tree_sitter_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-julia-0.23.1\",\n actual = \"@crates__tree-sitter-julia-0.23.1//:tree_sitter_julia\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-julia\",\n actual = \"@crates__tree-sitter-julia-0.23.1//:tree_sitter_julia\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-just-0.2.0\",\n actual = \"@crates__tree-sitter-just-0.2.0//:tree_sitter_just\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-just\",\n actual = \"@crates__tree-sitter-just-0.2.0//:tree_sitter_just\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-kotlin-sg-0.4.1\",\n actual = \"@crates__tree-sitter-kotlin-sg-0.4.1//:tree_sitter_kotlin_sg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_kotlin-0.4.1\",\n actual = \"@crates__tree-sitter-kotlin-sg-0.4.1//:tree_sitter_kotlin_sg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_kotlin\",\n actual = \"@crates__tree-sitter-kotlin-sg-0.4.1//:tree_sitter_kotlin_sg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-lua-0.5.0\",\n actual = \"@crates__tree-sitter-lua-0.5.0//:tree_sitter_lua\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-lua\",\n actual = \"@crates__tree-sitter-lua-0.5.0//:tree_sitter_lua\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-make-1.1.1\",\n actual = \"@crates__tree-sitter-make-1.1.1//:tree_sitter_make\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-make\",\n actual = \"@crates__tree-sitter-make-1.1.1//:tree_sitter_make\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-md-0.5.3\",\n actual = \"@crates__tree-sitter-md-0.5.3//:tree_sitter_md\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-md\",\n actual = \"@crates__tree-sitter-md-0.5.3//:tree_sitter_md\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-nix-0.3.0\",\n actual = \"@crates__tree-sitter-nix-0.3.0//:tree_sitter_nix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-nix\",\n actual = \"@crates__tree-sitter-nix-0.3.0//:tree_sitter_nix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-objc-3.0.2\",\n actual = \"@crates__tree-sitter-objc-3.0.2//:tree_sitter_objc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-objc\",\n actual = \"@crates__tree-sitter-objc-3.0.2//:tree_sitter_objc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ocaml-0.24.2\",\n actual = \"@crates__tree-sitter-ocaml-0.24.2//:tree_sitter_ocaml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ocaml\",\n actual = \"@crates__tree-sitter-ocaml-0.24.2//:tree_sitter_ocaml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-odin-1.3.0\",\n actual = \"@crates__tree-sitter-odin-1.3.0//:tree_sitter_odin\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-odin\",\n actual = \"@crates__tree-sitter-odin-1.3.0//:tree_sitter_odin\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-php-0.24.2\",\n actual = \"@crates__tree-sitter-php-0.24.2//:tree_sitter_php\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-php\",\n actual = \"@crates__tree-sitter-php-0.24.2//:tree_sitter_php\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-powershell-0.26.4\",\n actual = \"@crates__tree-sitter-powershell-0.26.4//:tree_sitter_powershell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-powershell\",\n actual = \"@crates__tree-sitter-powershell-0.26.4//:tree_sitter_powershell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-proto-0.4.0\",\n actual = \"@crates__tree-sitter-proto-0.4.0//:tree_sitter_proto\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-proto\",\n actual = \"@crates__tree-sitter-proto-0.4.0//:tree_sitter_proto\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-python-0.25.0\",\n actual = \"@crates__tree-sitter-python-0.25.0//:tree_sitter_python\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-python\",\n actual = \"@crates__tree-sitter-python-0.25.0//:tree_sitter_python\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-r-1.3.0\",\n actual = \"@crates__tree-sitter-r-1.3.0//:tree_sitter_r\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-r\",\n actual = \"@crates__tree-sitter-r-1.3.0//:tree_sitter_r\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-regex-0.25.0\",\n actual = \"@crates__tree-sitter-regex-0.25.0//:tree_sitter_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-regex\",\n actual = \"@crates__tree-sitter-regex-0.25.0//:tree_sitter_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ruby-0.23.1\",\n actual = \"@crates__tree-sitter-ruby-0.23.1//:tree_sitter_ruby\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ruby\",\n actual = \"@crates__tree-sitter-ruby-0.23.1//:tree_sitter_ruby\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-rust-0.24.2\",\n actual = \"@crates__tree-sitter-rust-0.24.2//:tree_sitter_rust\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-rust\",\n actual = \"@crates__tree-sitter-rust-0.24.2//:tree_sitter_rust\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-scala-0.26.0\",\n actual = \"@crates__tree-sitter-scala-0.26.0//:tree_sitter_scala\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-scala\",\n actual = \"@crates__tree-sitter-scala-0.26.0//:tree_sitter_scala\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-sequel-0.3.11\",\n actual = \"@crates__tree-sitter-sequel-0.3.11//:tree_sitter_sequel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_sql-0.3.11\",\n actual = \"@crates__tree-sitter-sequel-0.3.11//:tree_sitter_sequel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_sql\",\n actual = \"@crates__tree-sitter-sequel-0.3.11//:tree_sitter_sequel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-solidity-1.2.13\",\n actual = \"@crates__tree-sitter-solidity-1.2.13//:tree_sitter_solidity\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-solidity\",\n actual = \"@crates__tree-sitter-solidity-1.2.13//:tree_sitter_solidity\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-starlark-1.3.0\",\n actual = \"@crates__tree-sitter-starlark-1.3.0//:tree_sitter_starlark\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-starlark\",\n actual = \"@crates__tree-sitter-starlark-1.3.0//:tree_sitter_starlark\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-svelte-next-0.1.1\",\n actual = \"@crates__tree-sitter-svelte-next-0.1.1//:tree_sitter_svelte_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_svelte-0.1.1\",\n actual = \"@crates__tree-sitter-svelte-next-0.1.1//:tree_sitter_svelte_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_svelte\",\n actual = \"@crates__tree-sitter-svelte-next-0.1.1//:tree_sitter_svelte_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-swift-0.7.3\",\n actual = \"@crates__tree-sitter-swift-0.7.3//:tree_sitter_swift\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-swift\",\n actual = \"@crates__tree-sitter-swift-0.7.3//:tree_sitter_swift\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-tlaplus-1.5.0\",\n actual = \"@crates__tree-sitter-tlaplus-1.5.0//:tree_sitter_tlaplus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-tlaplus\",\n actual = \"@crates__tree-sitter-tlaplus-1.5.0//:tree_sitter_tlaplus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-toml-ng-0.7.0\",\n actual = \"@crates__tree-sitter-toml-ng-0.7.0//:tree_sitter_toml_ng\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-toml-ng\",\n actual = \"@crates__tree-sitter-toml-ng-0.7.0//:tree_sitter_toml_ng\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-typescript-0.23.2\",\n actual = \"@crates__tree-sitter-typescript-0.23.2//:tree_sitter_typescript\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-typescript\",\n actual = \"@crates__tree-sitter-typescript-0.23.2//:tree_sitter_typescript\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-verilog-1.0.3\",\n actual = \"@crates__tree-sitter-verilog-1.0.3//:tree_sitter_verilog\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-verilog\",\n actual = \"@crates__tree-sitter-verilog-1.0.3//:tree_sitter_verilog\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-vue-next-0.1.0\",\n actual = \"@crates__tree-sitter-vue-next-0.1.0//:tree_sitter_vue_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_vue-0.1.0\",\n actual = \"@crates__tree-sitter-vue-next-0.1.0//:tree_sitter_vue_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_vue\",\n actual = \"@crates__tree-sitter-vue-next-0.1.0//:tree_sitter_vue_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-xml-0.7.0\",\n actual = \"@crates__tree-sitter-xml-0.7.0//:tree_sitter_xml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-xml\",\n actual = \"@crates__tree-sitter-xml-0.7.0//:tree_sitter_xml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-yaml-0.7.2\",\n actual = \"@crates__tree-sitter-yaml-0.7.2//:tree_sitter_yaml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-yaml\",\n actual = \"@crates__tree-sitter-yaml-0.7.2//:tree_sitter_yaml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-zig-1.1.2\",\n actual = \"@crates__tree-sitter-zig-1.1.2//:tree_sitter_zig\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-zig\",\n actual = \"@crates__tree-sitter-zig-1.1.2//:tree_sitter_zig\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uiautomation-0.25.0\",\n actual = \"@crates__uiautomation-0.25.0//:uiautomation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uiautomation\",\n actual = \"@crates__uiautomation-0.25.0//:uiautomation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"unicode-segmentation-1.13.3\",\n actual = \"@crates__unicode-segmentation-1.13.3//:unicode_segmentation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"unicode-segmentation\",\n actual = \"@crates__unicode-segmentation-1.13.3//:unicode_segmentation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"unicode-width-0.1.14\",\n actual = \"@crates__unicode-width-0.1.14//:unicode_width\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"unicode-width-0.2.2\",\n actual = \"@crates__unicode-width-0.2.2//:unicode_width\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uucore-0.0.30\",\n actual = \"@crates__uucore-0.0.30//:uucore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uucore-0.8.0\",\n actual = \"@crates__uucore-0.8.0//:uucore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uucore-0.9.0\",\n actual = \"@crates__uucore-0.9.0//:uucore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid-1.24.0\",\n actual = \"@crates__uuid-1.24.0//:uuid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid\",\n actual = \"@crates__uuid-1.24.0//:uuid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uutils_term_grid-0.8.0\",\n actual = \"@crates__uutils_term_grid-0.8.0//:term_grid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uutils_term_grid\",\n actual = \"@crates__uutils_term_grid-0.8.0//:term_grid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uzers-0.12.2\",\n actual = \"@crates__uzers-0.12.2//:uzers\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uzers\",\n actual = \"@crates__uzers-0.12.2//:uzers\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"webrtc-0.17.2\",\n actual = \"@crates__webrtc-0.17.2//:webrtc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"webrtc\",\n actual = \"@crates__webrtc-0.17.2//:webrtc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"whoami-2.1.2\",\n actual = \"@crates__whoami-2.1.2//:whoami\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"whoami\",\n actual = \"@crates__whoami-2.1.2//:whoami\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"windows-sys-0.59.0\",\n actual = \"@crates__windows-sys-0.59.0//:windows_sys\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"windows-sys-0.61.2\",\n actual = \"@crates__windows-sys-0.61.2//:windows_sys\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"winreg-0.56.0\",\n actual = \"@crates__winreg-0.56.0//:winreg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"winreg\",\n actual = \"@crates__winreg-0.56.0//:winreg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"x11rb-0.13.2\",\n actual = \"@crates__x11rb-0.13.2//:x11rb\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"x11rb\",\n actual = \"@crates__x11rb-0.13.2//:x11rb\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xcap-0.9.6\",\n actual = \"@crates__xcap-0.9.6//:xcap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xcap\",\n actual = \"@crates__xcap-0.9.6//:xcap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xkeysym-0.2.1\",\n actual = \"@crates__xkeysym-0.2.1//:xkeysym\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xkeysym\",\n actual = \"@crates__xkeysym-0.2.1//:xkeysym\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xxhash-rust-0.8.18\",\n actual = \"@crates__xxhash-rust-0.8.18//:xxhash_rust\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xxhash-rust\",\n actual = \"@crates__xxhash-rust-0.8.18//:xxhash_rust\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"yansi-1.0.1\",\n actual = \"@crates__yansi-1.0.1//:yansi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"yansi\",\n actual = \"@crates__yansi-1.0.1//:yansi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"zune-jpeg-0.5.15\",\n actual = \"@crates__zune-jpeg-0.5.15//:zune_jpeg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"zune-jpeg\",\n actual = \"@crates__zune-jpeg-0.5.15//:zune_jpeg\",\n tags = [\"manual\"],\n)\n", + "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n [\n \"cargo-bazel.json\",\n \"crates.bzl\",\n \"defs.bzl\",\n ] + glob(\n allow_empty = True,\n include = [\"*.bazel\"],\n ),\n)\n\nfilegroup(\n name = \"srcs\",\n srcs = glob(\n allow_empty = True,\n include = [\n \"*.bazel\",\n \"*.bzl\",\n ],\n ),\n)\n\n# Workspace Member Dependencies\nalias(\n name = \"ansi-width-0.1.0\",\n actual = \"@crates__ansi-width-0.1.0//:ansi_width\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ansi-width\",\n actual = \"@crates__ansi-width-0.1.0//:ansi_width\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"anyhow-1.0.104\",\n actual = \"@crates__anyhow-1.0.104//:anyhow\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"anyhow\",\n actual = \"@crates__anyhow-1.0.104//:anyhow\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"arboard-3.6.1\",\n actual = \"@crates__arboard-3.6.1//:arboard\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"arboard\",\n actual = \"@crates__arboard-3.6.1//:arboard\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"argmax-0.3.1\",\n actual = \"@crates__argmax-0.3.1//:argmax\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"argmax\",\n actual = \"@crates__argmax-0.3.1//:argmax\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ashpd-0.11.1\",\n actual = \"@crates__ashpd-0.11.1//:ashpd\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ashpd\",\n actual = \"@crates__ashpd-0.11.1//:ashpd\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ast-grep-core-0.39.9\",\n actual = \"@crates__ast-grep-core-0.39.9//:ast_grep_core\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ast-grep-core\",\n actual = \"@crates__ast-grep-core-0.39.9//:ast_grep_core\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-recursion-1.1.1\",\n actual = \"@crates__async-recursion-1.1.1//:async_recursion\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-recursion\",\n actual = \"@crates__async-recursion-1.1.1//:async_recursion\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait-0.1.91\",\n actual = \"@crates__async-trait-0.1.91//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait\",\n actual = \"@crates__async-trait-0.1.91//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"atspi-0.30.0\",\n actual = \"@crates__atspi-0.30.0//:atspi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"atspi\",\n actual = \"@crates__atspi-0.30.0//:atspi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"audiopus_sys-0.2.2\",\n actual = \"@crates__audiopus_sys-0.2.2//:audiopus_sys\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"audiopus_sys\",\n actual = \"@crates__audiopus_sys-0.2.2//:audiopus_sys\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"base64-0.22.1\",\n actual = \"@crates__base64-0.22.1//:base64\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"base64\",\n actual = \"@crates__base64-0.22.1//:base64\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bigdecimal-0.4.10\",\n actual = \"@crates__bigdecimal-0.4.10//:bigdecimal\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bigdecimal\",\n actual = \"@crates__bigdecimal-0.4.10//:bigdecimal\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"binary-heap-plus-0.5.0\",\n actual = \"@crates__binary-heap-plus-0.5.0//:binary_heap_plus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"binary-heap-plus\",\n actual = \"@crates__binary-heap-plus-0.5.0//:binary_heap_plus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bon-3.9.3\",\n actual = \"@crates__bon-3.9.3//:bon\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bon\",\n actual = \"@crates__bon-3.9.3//:bon\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"brush-parser-0.3.0\",\n actual = \"@crates__brush-parser-0.3.0//:brush_parser\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"brush-parser-0.4.0\",\n actual = \"@crates__brush-parser-0.4.0//:brush_parser\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bstr-1.13.0\",\n actual = \"@crates__bstr-1.13.0//:bstr\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bstr\",\n actual = \"@crates__bstr-1.13.0//:bstr\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bytecount-0.6.9\",\n actual = \"@crates__bytecount-0.6.9//:bytecount\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bytecount\",\n actual = \"@crates__bytecount-0.6.9//:bytecount\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bytes-1.12.1\",\n actual = \"@crates__bytes-1.12.1//:bytes\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bytes\",\n actual = \"@crates__bytes-1.12.1//:bytes\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"cached-0.59.0\",\n actual = \"@crates__cached-0.59.0//:cached\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"cached\",\n actual = \"@crates__cached-0.59.0//:cached\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"cfg-if-1.0.4\",\n actual = \"@crates__cfg-if-1.0.4//:cfg_if\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"cfg-if\",\n actual = \"@crates__cfg-if-1.0.4//:cfg_if\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"check_elevation-0.2.7\",\n actual = \"@crates__check_elevation-0.2.7//:check_elevation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"check_elevation\",\n actual = \"@crates__check_elevation-0.2.7//:check_elevation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"chrono-0.4.45\",\n actual = \"@crates__chrono-0.4.45//:chrono\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"chrono\",\n actual = \"@crates__chrono-0.4.45//:chrono\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap-4.6.6\",\n actual = \"@crates__clap-4.6.6//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap\",\n actual = \"@crates__clap-4.6.6//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clipboard-win-5.4.1\",\n actual = \"@crates__clipboard-win-5.4.1//:clipboard_win\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clipboard-win\",\n actual = \"@crates__clipboard-win-5.4.1//:clipboard_win\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"codesnake-0.2.1\",\n actual = \"@crates__codesnake-0.2.1//:codesnake\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"codesnake\",\n actual = \"@crates__codesnake-0.2.1//:codesnake\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"color-print-0.3.7\",\n actual = \"@crates__color-print-0.3.7//:color_print\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"color-print\",\n actual = \"@crates__color-print-0.3.7//:color_print\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"command-fds-0.3.3\",\n actual = \"@crates__command-fds-0.3.3//:command_fds\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"command-fds\",\n actual = \"@crates__command-fds-0.3.3//:command_fds\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"compare-0.1.0\",\n actual = \"@crates__compare-0.1.0//:compare\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"compare\",\n actual = \"@crates__compare-0.1.0//:compare\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"core-graphics-0.25.0\",\n actual = \"@crates__core-graphics-0.25.0//:core_graphics\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"core-graphics\",\n actual = \"@crates__core-graphics-0.25.0//:core_graphics\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"dashmap-6.2.1\",\n actual = \"@crates__dashmap-6.2.1//:dashmap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"dashmap\",\n actual = \"@crates__dashmap-6.2.1//:dashmap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"dns-lookup-3.0.1\",\n actual = \"@crates__dns-lookup-3.0.1//:dns_lookup\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"dns-lookup\",\n actual = \"@crates__dns-lookup-3.0.1//:dns_lookup\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"enigo-0.6.1\",\n actual = \"@crates__enigo-0.6.1//:enigo\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"enigo\",\n actual = \"@crates__enigo-0.6.1//:enigo\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"faccess-0.2.4\",\n actual = \"@crates__faccess-0.2.4//:faccess\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"faccess\",\n actual = \"@crates__faccess-0.2.4//:faccess\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fancy-regex-0.17.0\",\n actual = \"@crates__fancy-regex-0.17.0//:fancy_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fancy-regex\",\n actual = \"@crates__fancy-regex-0.17.0//:fancy_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"filetime-0.2.29\",\n actual = \"@crates__filetime-0.2.29//:filetime\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"filetime\",\n actual = \"@crates__filetime-0.2.29//:filetime\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"flume-0.11.1\",\n actual = \"@crates__flume-0.11.1//:flume\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"flume\",\n actual = \"@crates__flume-0.11.1//:flume\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"foldhash-0.2.0\",\n actual = \"@crates__foldhash-0.2.0//:foldhash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"foldhash\",\n actual = \"@crates__foldhash-0.2.0//:foldhash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fontdue-0.9.4\",\n actual = \"@crates__fontdue-0.9.4//:fontdue\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fontdue\",\n actual = \"@crates__fontdue-0.9.4//:fontdue\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"foreign-types-0.5.0\",\n actual = \"@crates__foreign-types-0.5.0//:foreign_types\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"foreign-types\",\n actual = \"@crates__foreign-types-0.5.0//:foreign_types\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fs_extra-1.3.0\",\n actual = \"@crates__fs_extra-1.3.0//:fs_extra\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fs_extra\",\n actual = \"@crates__fs_extra-1.3.0//:fs_extra\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"futures-0.3.33\",\n actual = \"@crates__futures-0.3.33//:futures\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"futures\",\n actual = \"@crates__futures-0.3.33//:futures\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"getrandom-0.4.3\",\n actual = \"@crates__getrandom-0.4.3//:getrandom\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"getrandom\",\n actual = \"@crates__getrandom-0.4.3//:getrandom\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"glob-0.3.4\",\n actual = \"@crates__glob-0.3.4//:glob\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"glob\",\n actual = \"@crates__glob-0.3.4//:glob\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"globset-0.4.20\",\n actual = \"@crates__globset-0.4.20//:globset\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"globset\",\n actual = \"@crates__globset-0.4.20//:globset\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-cli-0.1.12\",\n actual = \"@crates__grep-cli-0.1.12//:grep_cli\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-cli\",\n actual = \"@crates__grep-cli-0.1.12//:grep_cli\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-matcher-0.1.9\",\n actual = \"@crates__grep-matcher-0.1.9//:grep_matcher\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-matcher\",\n actual = \"@crates__grep-matcher-0.1.9//:grep_matcher\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-pcre2-0.1.10\",\n actual = \"@crates__grep-pcre2-0.1.10//:grep_pcre2\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-pcre2\",\n actual = \"@crates__grep-pcre2-0.1.10//:grep_pcre2\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-printer-0.3.1\",\n actual = \"@crates__grep-printer-0.3.1//:grep_printer\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-printer\",\n actual = \"@crates__grep-printer-0.3.1//:grep_printer\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-regex-0.1.14\",\n actual = \"@crates__grep-regex-0.1.14//:grep_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-regex\",\n actual = \"@crates__grep-regex-0.1.14//:grep_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-searcher-0.1.17\",\n actual = \"@crates__grep-searcher-0.1.17//:grep_searcher\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-searcher\",\n actual = \"@crates__grep-searcher-0.1.17//:grep_searcher\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hex-0.4.3\",\n actual = \"@crates__hex-0.4.3//:hex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hex\",\n actual = \"@crates__hex-0.4.3//:hex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hifijson-0.2.3\",\n actual = \"@crates__hifijson-0.2.3//:hifijson\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hifijson\",\n actual = \"@crates__hifijson-0.2.3//:hifijson\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hostname-0.4.2\",\n actual = \"@crates__hostname-0.4.2//:hostname\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hostname\",\n actual = \"@crates__hostname-0.4.2//:hostname\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"html-to-markdown-rs-3.10.6\",\n actual = \"@crates__html-to-markdown-rs-3.10.6//:html_to_markdown_rs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"html-to-markdown-rs\",\n actual = \"@crates__html-to-markdown-rs-3.10.6//:html_to_markdown_rs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"icy_sixel-0.5.0\",\n actual = \"@crates__icy_sixel-0.5.0//:icy_sixel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"icy_sixel\",\n actual = \"@crates__icy_sixel-0.5.0//:icy_sixel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ignore-0.4.33\",\n actual = \"@crates__ignore-0.4.33//:ignore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ignore\",\n actual = \"@crates__ignore-0.4.33//:ignore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"image-0.25.10\",\n actual = \"@crates__image-0.25.10//:image\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"image\",\n actual = \"@crates__image-0.25.10//:image\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"indicatif-0.18.6\",\n actual = \"@crates__indicatif-0.18.6//:indicatif\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"indicatif\",\n actual = \"@crates__indicatif-0.18.6//:indicatif\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"inferno-0.12.8\",\n actual = \"@crates__inferno-0.12.8//:inferno\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"inferno\",\n actual = \"@crates__inferno-0.12.8//:inferno\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"inherent-1.0.14\",\n actual = \"@crates__inherent-1.0.14//:inherent\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"inherent\",\n actual = \"@crates__inherent-1.0.14//:inherent\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"itertools-0.14.0\",\n actual = \"@crates__itertools-0.14.0//:itertools\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"itertools\",\n actual = \"@crates__itertools-0.14.0//:itertools\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-core-2.2.1\",\n actual = \"@crates__jaq-core-2.2.1//:jaq_core\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-core\",\n actual = \"@crates__jaq-core-2.2.1//:jaq_core\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-json-1.1.3\",\n actual = \"@crates__jaq-json-1.1.3//:jaq_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-json\",\n actual = \"@crates__jaq-json-1.1.3//:jaq_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-std-2.1.2\",\n actual = \"@crates__jaq-std-2.1.2//:jaq_std\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-std\",\n actual = \"@crates__jaq-std-2.1.2//:jaq_std\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jiff-0.2.35\",\n actual = \"@crates__jiff-0.2.35//:jiff\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jiff\",\n actual = \"@crates__jiff-0.2.35//:jiff\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"libc-0.2.189\",\n actual = \"@crates__libc-0.2.189//:libc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"libc\",\n actual = \"@crates__libc-0.2.189//:libc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"lscolors-0.21.0\",\n actual = \"@crates__lscolors-0.21.0//:lscolors\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"lscolors\",\n actual = \"@crates__lscolors-0.21.0//:lscolors\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"memchr-2.8.3\",\n actual = \"@crates__memchr-2.8.3//:memchr\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"memchr\",\n actual = \"@crates__memchr-2.8.3//:memchr\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"memmap2-0.9.11\",\n actual = \"@crates__memmap2-0.9.11//:memmap2\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"memmap2\",\n actual = \"@crates__memmap2-0.9.11//:memmap2\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-3.12.0\",\n actual = \"@crates__napi-3.12.0//:napi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi\",\n actual = \"@crates__napi-3.12.0//:napi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-build-2.4.0\",\n actual = \"@crates__napi-build-2.4.0//:napi_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-build\",\n actual = \"@crates__napi-build-2.4.0//:napi_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-derive-3.6.2\",\n actual = \"@crates__napi-derive-3.6.2//:napi_derive\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-derive\",\n actual = \"@crates__napi-derive-3.6.2//:napi_derive\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"nix-0.31.3\",\n actual = \"@crates__nix-0.31.3//:nix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"nix\",\n actual = \"@crates__nix-0.31.3//:nix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"nom-8.0.0\",\n actual = \"@crates__nom-8.0.0//:nom\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"nom\",\n actual = \"@crates__nom-8.0.0//:nom\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"normalize-path-0.2.1\",\n actual = \"@crates__normalize-path-0.2.1//:normalize_path\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"normalize-path\",\n actual = \"@crates__normalize-path-0.2.1//:normalize_path\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"notify-8.2.0\",\n actual = \"@crates__notify-8.2.0//:notify\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"notify\",\n actual = \"@crates__notify-8.2.0//:notify\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num-bigint-0.4.8\",\n actual = \"@crates__num-bigint-0.4.8//:num_bigint\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num-bigint\",\n actual = \"@crates__num-bigint-0.4.8//:num_bigint\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num-traits-0.2.19\",\n actual = \"@crates__num-traits-0.2.19//:num_traits\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num-traits\",\n actual = \"@crates__num-traits-0.2.19//:num_traits\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-app-kit-0.3.2\",\n actual = \"@crates__objc2-app-kit-0.3.2//:objc2_app_kit\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-app-kit\",\n actual = \"@crates__objc2-app-kit-0.3.2//:objc2_app_kit\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-application-services-0.3.2\",\n actual = \"@crates__objc2-application-services-0.3.2//:objc2_application_services\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-application-services\",\n actual = \"@crates__objc2-application-services-0.3.2//:objc2_application_services\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-core-foundation-0.3.2\",\n actual = \"@crates__objc2-core-foundation-0.3.2//:objc2_core_foundation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-core-foundation\",\n actual = \"@crates__objc2-core-foundation-0.3.2//:objc2_core_foundation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-core-graphics-0.3.2\",\n actual = \"@crates__objc2-core-graphics-0.3.2//:objc2_core_graphics\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-core-graphics\",\n actual = \"@crates__objc2-core-graphics-0.3.2//:objc2_core_graphics\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-foundation-0.3.2\",\n actual = \"@crates__objc2-foundation-0.3.2//:objc2_foundation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"objc2-foundation\",\n actual = \"@crates__objc2-foundation-0.3.2//:objc2_foundation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"onig-6.5.3\",\n actual = \"@crates__onig-6.5.3//:onig\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"onig\",\n actual = \"@crates__onig-6.5.3//:onig\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"opus-0.3.1\",\n actual = \"@crates__opus-0.3.1//:opus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"opus\",\n actual = \"@crates__opus-0.3.1//:opus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"os_display-0.1.4\",\n actual = \"@crates__os_display-0.1.4//:os_display\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"os_display\",\n actual = \"@crates__os_display-0.1.4//:os_display\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"os_pipe-1.2.3\",\n actual = \"@crates__os_pipe-1.2.3//:os_pipe\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"os_pipe\",\n actual = \"@crates__os_pipe-1.2.3//:os_pipe\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"parking_lot-0.12.5\",\n actual = \"@crates__parking_lot-0.12.5//:parking_lot\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"parking_lot\",\n actual = \"@crates__parking_lot-0.12.5//:parking_lot\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"parse_datetime-0.14.0\",\n actual = \"@crates__parse_datetime-0.14.0//:parse_datetime\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"parse_datetime\",\n actual = \"@crates__parse_datetime-0.14.0//:parse_datetime\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"phf-0.13.1\",\n actual = \"@crates__phf-0.13.1//:phf\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"phf\",\n actual = \"@crates__phf-0.13.1//:phf\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pi-shell-17.2.11\",\n actual = \"@crates__pi-shell-17.2.11//:pi_shell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pi-shell\",\n actual = \"@crates__pi-shell-17.2.11//:pi_shell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"platform-info-2.1.0\",\n actual = \"@crates__platform-info-2.1.0//:platform_info\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"platform-info\",\n actual = \"@crates__platform-info-2.1.0//:platform_info\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"png-0.18.1\",\n actual = \"@crates__png-0.18.1//:png\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"png\",\n actual = \"@crates__png-0.18.1//:png\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"portable-pty-0.9.0\",\n actual = \"@crates__portable-pty-0.9.0//:portable_pty\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"portable-pty\",\n actual = \"@crates__portable-pty-0.9.0//:portable_pty\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pretty_assertions-1.4.1\",\n actual = \"@crates__pretty_assertions-1.4.1//:pretty_assertions\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pretty_assertions\",\n actual = \"@crates__pretty_assertions-1.4.1//:pretty_assertions\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"procfs-0.18.0\",\n actual = \"@crates__procfs-0.18.0//:procfs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"procfs\",\n actual = \"@crates__procfs-0.18.0//:procfs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rand-0.10.2\",\n actual = \"@crates__rand-0.10.2//:rand\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rand\",\n actual = \"@crates__rand-0.10.2//:rand\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rayon-1.12.0\",\n actual = \"@crates__rayon-1.12.0//:rayon\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rayon\",\n actual = \"@crates__rayon-1.12.0//:rayon\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"regex-1.13.1\",\n actual = \"@crates__regex-1.13.1//:regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"regex\",\n actual = \"@crates__regex-1.13.1//:regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"reis-0.5.0\",\n actual = \"@crates__reis-0.5.0//:reis\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"reis\",\n actual = \"@crates__reis-0.5.0//:reis\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rlimit-0.11.0\",\n actual = \"@crates__rlimit-0.11.0//:rlimit\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rlimit\",\n actual = \"@crates__rlimit-0.11.0//:rlimit\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rpds-1.2.1\",\n actual = \"@crates__rpds-1.2.1//:rpds\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rpds\",\n actual = \"@crates__rpds-1.2.1//:rpds\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rustc-hash-2.1.3\",\n actual = \"@crates__rustc-hash-2.1.3//:rustc_hash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rustc-hash\",\n actual = \"@crates__rustc-hash-2.1.3//:rustc_hash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rustix-1.1.4\",\n actual = \"@crates__rustix-1.1.4//:rustix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rustix\",\n actual = \"@crates__rustix-1.1.4//:rustix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"self_cell-1.3.0\",\n actual = \"@crates__self_cell-1.3.0//:self_cell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"self_cell\",\n actual = \"@crates__self_cell-1.3.0//:self_cell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde-1.0.229\",\n actual = \"@crates__serde-1.0.229//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde\",\n actual = \"@crates__serde-1.0.229//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json-1.0.151\",\n actual = \"@crates__serde_json-1.0.151//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json\",\n actual = \"@crates__serde_json-1.0.151//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"similar-3.1.2\",\n actual = \"@crates__similar-3.1.2//:similar\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"similar\",\n actual = \"@crates__similar-3.1.2//:similar\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"smallvec-1.15.2\",\n actual = \"@crates__smallvec-1.15.2//:smallvec\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"smallvec\",\n actual = \"@crates__smallvec-1.15.2//:smallvec\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"strum-0.28.0\",\n actual = \"@crates__strum-0.28.0//:strum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"strum\",\n actual = \"@crates__strum-0.28.0//:strum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"strum_macros-0.28.0\",\n actual = \"@crates__strum_macros-0.28.0//:strum_macros\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"strum_macros\",\n actual = \"@crates__strum_macros-0.28.0//:strum_macros\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"syntect-5.3.0\",\n actual = \"@crates__syntect-5.3.0//:syntect\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"syntect\",\n actual = \"@crates__syntect-5.3.0//:syntect\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile-3.27.0\",\n actual = \"@crates__tempfile-3.27.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile\",\n actual = \"@crates__tempfile-3.27.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"terminfo-0.9.0\",\n actual = \"@crates__terminfo-0.9.0//:terminfo\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"terminfo\",\n actual = \"@crates__terminfo-0.9.0//:terminfo\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"thiserror-2.0.19\",\n actual = \"@crates__thiserror-2.0.19//:thiserror\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"thiserror\",\n actual = \"@crates__thiserror-2.0.19//:thiserror\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tiktoken-rs-0.11.0\",\n actual = \"@crates__tiktoken-rs-0.11.0//:tiktoken_rs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tiktoken-rs\",\n actual = \"@crates__tiktoken-rs-0.11.0//:tiktoken_rs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-1.53.1\",\n actual = \"@crates__tokio-1.53.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio\",\n actual = \"@crates__tokio-1.53.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-util-0.7.19\",\n actual = \"@crates__tokio-util-0.7.19//:tokio_util\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-util\",\n actual = \"@crates__tokio-util-0.7.19//:tokio_util\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"toml-1.1.4+spec-1.1.0\",\n actual = \"@crates__toml-1.1.4-spec-1.1.0//:toml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"toml\",\n actual = \"@crates__toml-1.1.4-spec-1.1.0//:toml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tracing-0.1.44\",\n actual = \"@crates__tracing-0.1.44//:tracing\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tracing\",\n actual = \"@crates__tracing-0.1.44//:tracing\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-0.25.10\",\n actual = \"@crates__tree-sitter-0.25.10//:tree_sitter\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter\",\n actual = \"@crates__tree-sitter-0.25.10//:tree_sitter\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-astro-next-0.1.1\",\n actual = \"@crates__tree-sitter-astro-next-0.1.1//:tree_sitter_astro_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_astro-0.1.1\",\n actual = \"@crates__tree-sitter-astro-next-0.1.1//:tree_sitter_astro_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_astro\",\n actual = \"@crates__tree-sitter-astro-next-0.1.1//:tree_sitter_astro_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-bash-0.25.1\",\n actual = \"@crates__tree-sitter-bash-0.25.1//:tree_sitter_bash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-bash\",\n actual = \"@crates__tree-sitter-bash-0.25.1//:tree_sitter_bash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-c-0.24.2\",\n actual = \"@crates__tree-sitter-c-0.24.2//:tree_sitter_c\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-c\",\n actual = \"@crates__tree-sitter-c-0.24.2//:tree_sitter_c\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-c-sharp-0.23.5\",\n actual = \"@crates__tree-sitter-c-sharp-0.23.5//:tree_sitter_c_sharp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-c-sharp\",\n actual = \"@crates__tree-sitter-c-sharp-0.23.5//:tree_sitter_c_sharp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-clojure-0.1.0\",\n actual = \"@crates__tree-sitter-clojure-0.1.0//:tree_sitter_clojure\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-clojure\",\n actual = \"@crates__tree-sitter-clojure-0.1.0//:tree_sitter_clojure\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-cmake-0.7.4\",\n actual = \"@crates__tree-sitter-cmake-0.7.4//:tree_sitter_cmake\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-cmake\",\n actual = \"@crates__tree-sitter-cmake-0.7.4//:tree_sitter_cmake\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-cpp-0.23.4\",\n actual = \"@crates__tree-sitter-cpp-0.23.4//:tree_sitter_cpp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-cpp\",\n actual = \"@crates__tree-sitter-cpp-0.23.4//:tree_sitter_cpp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-css-0.25.0\",\n actual = \"@crates__tree-sitter-css-0.25.0//:tree_sitter_css\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-css\",\n actual = \"@crates__tree-sitter-css-0.25.0//:tree_sitter_css\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-dart-0.2.0\",\n actual = \"@crates__tree-sitter-dart-0.2.0//:tree_sitter_dart\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-dart\",\n actual = \"@crates__tree-sitter-dart-0.2.0//:tree_sitter_dart\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-diff-0.1.0\",\n actual = \"@crates__tree-sitter-diff-0.1.0//:tree_sitter_diff\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-diff\",\n actual = \"@crates__tree-sitter-diff-0.1.0//:tree_sitter_diff\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-dockerfile-updated-0.2.0\",\n actual = \"@crates__tree-sitter-dockerfile-updated-0.2.0//:tree_sitter_dockerfile_updated\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_dockerfile-0.2.0\",\n actual = \"@crates__tree-sitter-dockerfile-updated-0.2.0//:tree_sitter_dockerfile_updated\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_dockerfile\",\n actual = \"@crates__tree-sitter-dockerfile-updated-0.2.0//:tree_sitter_dockerfile_updated\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-elisp-1.7.2\",\n actual = \"@crates__tree-sitter-elisp-1.7.2//:tree_sitter_elisp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-elisp\",\n actual = \"@crates__tree-sitter-elisp-1.7.2//:tree_sitter_elisp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-elixir-0.3.5\",\n actual = \"@crates__tree-sitter-elixir-0.3.5//:tree_sitter_elixir\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-elixir\",\n actual = \"@crates__tree-sitter-elixir-0.3.5//:tree_sitter_elixir\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-erlang-0.16.0\",\n actual = \"@crates__tree-sitter-erlang-0.16.0//:tree_sitter_erlang\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-erlang\",\n actual = \"@crates__tree-sitter-erlang-0.16.0//:tree_sitter_erlang\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-fortran-0.6.0\",\n actual = \"@crates__tree-sitter-fortran-0.6.0//:tree_sitter_fortran\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-fortran\",\n actual = \"@crates__tree-sitter-fortran-0.6.0//:tree_sitter_fortran\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-go-0.25.0\",\n actual = \"@crates__tree-sitter-go-0.25.0//:tree_sitter_go\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-go\",\n actual = \"@crates__tree-sitter-go-0.25.0//:tree_sitter_go\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-graphql-0.1.0\",\n actual = \"@crates__tree-sitter-graphql-0.1.0//:tree_sitter_graphql\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-graphql\",\n actual = \"@crates__tree-sitter-graphql-0.1.0//:tree_sitter_graphql\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-haskell-0.23.1\",\n actual = \"@crates__tree-sitter-haskell-0.23.1//:tree_sitter_haskell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-haskell\",\n actual = \"@crates__tree-sitter-haskell-0.23.1//:tree_sitter_haskell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-hcl-1.1.0\",\n actual = \"@crates__tree-sitter-hcl-1.1.0//:tree_sitter_hcl\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-hcl\",\n actual = \"@crates__tree-sitter-hcl-1.1.0//:tree_sitter_hcl\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-html-0.23.2\",\n actual = \"@crates__tree-sitter-html-0.23.2//:tree_sitter_html\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-html\",\n actual = \"@crates__tree-sitter-html-0.23.2//:tree_sitter_html\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ini-1.4.0\",\n actual = \"@crates__tree-sitter-ini-1.4.0//:tree_sitter_ini\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ini\",\n actual = \"@crates__tree-sitter-ini-1.4.0//:tree_sitter_ini\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-java-0.23.5\",\n actual = \"@crates__tree-sitter-java-0.23.5//:tree_sitter_java\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-java\",\n actual = \"@crates__tree-sitter-java-0.23.5//:tree_sitter_java\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-javascript-0.25.0\",\n actual = \"@crates__tree-sitter-javascript-0.25.0//:tree_sitter_javascript\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-javascript\",\n actual = \"@crates__tree-sitter-javascript-0.25.0//:tree_sitter_javascript\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-json-0.24.8\",\n actual = \"@crates__tree-sitter-json-0.24.8//:tree_sitter_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-json\",\n actual = \"@crates__tree-sitter-json-0.24.8//:tree_sitter_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-julia-0.23.1\",\n actual = \"@crates__tree-sitter-julia-0.23.1//:tree_sitter_julia\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-julia\",\n actual = \"@crates__tree-sitter-julia-0.23.1//:tree_sitter_julia\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-just-0.2.0\",\n actual = \"@crates__tree-sitter-just-0.2.0//:tree_sitter_just\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-just\",\n actual = \"@crates__tree-sitter-just-0.2.0//:tree_sitter_just\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-kotlin-sg-0.4.1\",\n actual = \"@crates__tree-sitter-kotlin-sg-0.4.1//:tree_sitter_kotlin_sg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_kotlin-0.4.1\",\n actual = \"@crates__tree-sitter-kotlin-sg-0.4.1//:tree_sitter_kotlin_sg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_kotlin\",\n actual = \"@crates__tree-sitter-kotlin-sg-0.4.1//:tree_sitter_kotlin_sg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-lua-0.5.0\",\n actual = \"@crates__tree-sitter-lua-0.5.0//:tree_sitter_lua\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-lua\",\n actual = \"@crates__tree-sitter-lua-0.5.0//:tree_sitter_lua\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-make-1.1.1\",\n actual = \"@crates__tree-sitter-make-1.1.1//:tree_sitter_make\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-make\",\n actual = \"@crates__tree-sitter-make-1.1.1//:tree_sitter_make\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-md-0.5.3\",\n actual = \"@crates__tree-sitter-md-0.5.3//:tree_sitter_md\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-md\",\n actual = \"@crates__tree-sitter-md-0.5.3//:tree_sitter_md\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-nix-0.3.0\",\n actual = \"@crates__tree-sitter-nix-0.3.0//:tree_sitter_nix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-nix\",\n actual = \"@crates__tree-sitter-nix-0.3.0//:tree_sitter_nix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-objc-3.0.2\",\n actual = \"@crates__tree-sitter-objc-3.0.2//:tree_sitter_objc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-objc\",\n actual = \"@crates__tree-sitter-objc-3.0.2//:tree_sitter_objc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ocaml-0.24.2\",\n actual = \"@crates__tree-sitter-ocaml-0.24.2//:tree_sitter_ocaml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ocaml\",\n actual = \"@crates__tree-sitter-ocaml-0.24.2//:tree_sitter_ocaml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-odin-1.3.0\",\n actual = \"@crates__tree-sitter-odin-1.3.0//:tree_sitter_odin\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-odin\",\n actual = \"@crates__tree-sitter-odin-1.3.0//:tree_sitter_odin\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-php-0.24.2\",\n actual = \"@crates__tree-sitter-php-0.24.2//:tree_sitter_php\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-php\",\n actual = \"@crates__tree-sitter-php-0.24.2//:tree_sitter_php\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-powershell-0.26.4\",\n actual = \"@crates__tree-sitter-powershell-0.26.4//:tree_sitter_powershell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-powershell\",\n actual = \"@crates__tree-sitter-powershell-0.26.4//:tree_sitter_powershell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-proto-0.4.0\",\n actual = \"@crates__tree-sitter-proto-0.4.0//:tree_sitter_proto\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-proto\",\n actual = \"@crates__tree-sitter-proto-0.4.0//:tree_sitter_proto\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-python-0.25.0\",\n actual = \"@crates__tree-sitter-python-0.25.0//:tree_sitter_python\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-python\",\n actual = \"@crates__tree-sitter-python-0.25.0//:tree_sitter_python\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-r-1.3.0\",\n actual = \"@crates__tree-sitter-r-1.3.0//:tree_sitter_r\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-r\",\n actual = \"@crates__tree-sitter-r-1.3.0//:tree_sitter_r\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-regex-0.25.0\",\n actual = \"@crates__tree-sitter-regex-0.25.0//:tree_sitter_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-regex\",\n actual = \"@crates__tree-sitter-regex-0.25.0//:tree_sitter_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ruby-0.23.1\",\n actual = \"@crates__tree-sitter-ruby-0.23.1//:tree_sitter_ruby\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ruby\",\n actual = \"@crates__tree-sitter-ruby-0.23.1//:tree_sitter_ruby\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-rust-0.24.2\",\n actual = \"@crates__tree-sitter-rust-0.24.2//:tree_sitter_rust\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-rust\",\n actual = \"@crates__tree-sitter-rust-0.24.2//:tree_sitter_rust\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-scala-0.26.0\",\n actual = \"@crates__tree-sitter-scala-0.26.0//:tree_sitter_scala\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-scala\",\n actual = \"@crates__tree-sitter-scala-0.26.0//:tree_sitter_scala\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-sequel-0.3.11\",\n actual = \"@crates__tree-sitter-sequel-0.3.11//:tree_sitter_sequel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_sql-0.3.11\",\n actual = \"@crates__tree-sitter-sequel-0.3.11//:tree_sitter_sequel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_sql\",\n actual = \"@crates__tree-sitter-sequel-0.3.11//:tree_sitter_sequel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-solidity-1.2.13\",\n actual = \"@crates__tree-sitter-solidity-1.2.13//:tree_sitter_solidity\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-solidity\",\n actual = \"@crates__tree-sitter-solidity-1.2.13//:tree_sitter_solidity\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-starlark-1.3.0\",\n actual = \"@crates__tree-sitter-starlark-1.3.0//:tree_sitter_starlark\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-starlark\",\n actual = \"@crates__tree-sitter-starlark-1.3.0//:tree_sitter_starlark\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-svelte-next-0.1.1\",\n actual = \"@crates__tree-sitter-svelte-next-0.1.1//:tree_sitter_svelte_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_svelte-0.1.1\",\n actual = \"@crates__tree-sitter-svelte-next-0.1.1//:tree_sitter_svelte_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_svelte\",\n actual = \"@crates__tree-sitter-svelte-next-0.1.1//:tree_sitter_svelte_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-swift-0.7.3\",\n actual = \"@crates__tree-sitter-swift-0.7.3//:tree_sitter_swift\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-swift\",\n actual = \"@crates__tree-sitter-swift-0.7.3//:tree_sitter_swift\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-tlaplus-1.5.0\",\n actual = \"@crates__tree-sitter-tlaplus-1.5.0//:tree_sitter_tlaplus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-tlaplus\",\n actual = \"@crates__tree-sitter-tlaplus-1.5.0//:tree_sitter_tlaplus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-toml-ng-0.7.0\",\n actual = \"@crates__tree-sitter-toml-ng-0.7.0//:tree_sitter_toml_ng\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-toml-ng\",\n actual = \"@crates__tree-sitter-toml-ng-0.7.0//:tree_sitter_toml_ng\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-typescript-0.23.2\",\n actual = \"@crates__tree-sitter-typescript-0.23.2//:tree_sitter_typescript\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-typescript\",\n actual = \"@crates__tree-sitter-typescript-0.23.2//:tree_sitter_typescript\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-verilog-1.0.3\",\n actual = \"@crates__tree-sitter-verilog-1.0.3//:tree_sitter_verilog\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-verilog\",\n actual = \"@crates__tree-sitter-verilog-1.0.3//:tree_sitter_verilog\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-vue-next-0.1.0\",\n actual = \"@crates__tree-sitter-vue-next-0.1.0//:tree_sitter_vue_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_vue-0.1.0\",\n actual = \"@crates__tree-sitter-vue-next-0.1.0//:tree_sitter_vue_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_vue\",\n actual = \"@crates__tree-sitter-vue-next-0.1.0//:tree_sitter_vue_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-xml-0.7.0\",\n actual = \"@crates__tree-sitter-xml-0.7.0//:tree_sitter_xml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-xml\",\n actual = \"@crates__tree-sitter-xml-0.7.0//:tree_sitter_xml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-yaml-0.7.2\",\n actual = \"@crates__tree-sitter-yaml-0.7.2//:tree_sitter_yaml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-yaml\",\n actual = \"@crates__tree-sitter-yaml-0.7.2//:tree_sitter_yaml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-zig-1.1.2\",\n actual = \"@crates__tree-sitter-zig-1.1.2//:tree_sitter_zig\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-zig\",\n actual = \"@crates__tree-sitter-zig-1.1.2//:tree_sitter_zig\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uiautomation-0.25.0\",\n actual = \"@crates__uiautomation-0.25.0//:uiautomation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uiautomation\",\n actual = \"@crates__uiautomation-0.25.0//:uiautomation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"unicode-segmentation-1.13.3\",\n actual = \"@crates__unicode-segmentation-1.13.3//:unicode_segmentation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"unicode-segmentation\",\n actual = \"@crates__unicode-segmentation-1.13.3//:unicode_segmentation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"unicode-width-0.2.2\",\n actual = \"@crates__unicode-width-0.2.2//:unicode_width\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"unicode-width\",\n actual = \"@crates__unicode-width-0.2.2//:unicode_width\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uucore-0.8.0\",\n actual = \"@crates__uucore-0.8.0//:uucore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uucore\",\n actual = \"@crates__uucore-0.8.0//:uucore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid-1.24.0\",\n actual = \"@crates__uuid-1.24.0//:uuid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid\",\n actual = \"@crates__uuid-1.24.0//:uuid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uutils_term_grid-0.8.0\",\n actual = \"@crates__uutils_term_grid-0.8.0//:term_grid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uutils_term_grid\",\n actual = \"@crates__uutils_term_grid-0.8.0//:term_grid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uzers-0.12.2\",\n actual = \"@crates__uzers-0.12.2//:uzers\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uzers\",\n actual = \"@crates__uzers-0.12.2//:uzers\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"webrtc-0.17.2\",\n actual = \"@crates__webrtc-0.17.2//:webrtc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"webrtc\",\n actual = \"@crates__webrtc-0.17.2//:webrtc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"whoami-2.1.2\",\n actual = \"@crates__whoami-2.1.2//:whoami\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"whoami\",\n actual = \"@crates__whoami-2.1.2//:whoami\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"windows-sys-0.59.0\",\n actual = \"@crates__windows-sys-0.59.0//:windows_sys\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"windows-sys-0.61.2\",\n actual = \"@crates__windows-sys-0.61.2//:windows_sys\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"winreg-0.56.0\",\n actual = \"@crates__winreg-0.56.0//:winreg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"winreg\",\n actual = \"@crates__winreg-0.56.0//:winreg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"x11rb-0.13.2\",\n actual = \"@crates__x11rb-0.13.2//:x11rb\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"x11rb\",\n actual = \"@crates__x11rb-0.13.2//:x11rb\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xcap-0.9.6\",\n actual = \"@crates__xcap-0.9.6//:xcap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xcap\",\n actual = \"@crates__xcap-0.9.6//:xcap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xkeysym-0.2.1\",\n actual = \"@crates__xkeysym-0.2.1//:xkeysym\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xkeysym\",\n actual = \"@crates__xkeysym-0.2.1//:xkeysym\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xxhash-rust-0.8.18\",\n actual = \"@crates__xxhash-rust-0.8.18//:xxhash_rust\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xxhash-rust\",\n actual = \"@crates__xxhash-rust-0.8.18//:xxhash_rust\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"yansi-1.0.1\",\n actual = \"@crates__yansi-1.0.1//:yansi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"yansi\",\n actual = \"@crates__yansi-1.0.1//:yansi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"zune-jpeg-0.5.15\",\n actual = \"@crates__zune-jpeg-0.5.15//:zune_jpeg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"zune-jpeg\",\n actual = \"@crates__zune-jpeg-0.5.15//:zune_jpeg\",\n tags = [\"manual\"],\n)\n", "alias_rules.bzl": "\"\"\"Alias that transitions its target to `compilation_mode=opt`. Use `transition_alias=\"opt\"` to enable.\"\"\"\n\nload(\"@rules_cc//cc:defs.bzl\", \"CcInfo\")\nload(\"@rules_rust//rust:rust_common.bzl\", \"COMMON_PROVIDERS\")\n\ndef _transition_alias_impl(ctx):\n # `ctx.attr.actual` is a list of 1 item due to the transition\n providers = [ctx.attr.actual[0][provider] for provider in COMMON_PROVIDERS]\n if CcInfo in ctx.attr.actual[0]:\n providers.append(ctx.attr.actual[0][CcInfo])\n return providers\n\ndef _change_compilation_mode(compilation_mode):\n def _change_compilation_mode_impl(_settings, _attr):\n return {\n \"//command_line_option:compilation_mode\": compilation_mode,\n }\n\n return transition(\n implementation = _change_compilation_mode_impl,\n inputs = [],\n outputs = [\n \"//command_line_option:compilation_mode\",\n ],\n )\n\ndef _transition_alias_rule(compilation_mode):\n return rule(\n implementation = _transition_alias_impl,\n provides = COMMON_PROVIDERS,\n attrs = {\n \"actual\": attr.label(\n mandatory = True,\n doc = \"`rust_library()` target to transition to `compilation_mode=opt`.\",\n providers = COMMON_PROVIDERS,\n cfg = _change_compilation_mode(compilation_mode),\n ),\n \"_allowlist_function_transition\": attr.label(\n default = \"@bazel_tools//tools/allowlists/function_transition_allowlist\",\n ),\n },\n doc = \"Transitions a Rust library crate to the `compilation_mode=opt`.\",\n )\n\ntransition_alias_dbg = _transition_alias_rule(\"dbg\")\ntransition_alias_fastbuild = _transition_alias_rule(\"fastbuild\")\ntransition_alias_opt = _transition_alias_rule(\"opt\")\n", - "crates.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_edition](#crate_edition)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe:defs.bzl\", \"crates_vendor_remote_repository\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n \"\"\"Flatten a list of dependency maps into one dictionary.\n\n Dependency maps have the following structure:\n\n ```python\n DEPENDENCIES_MAP = {\n # The first key in the map is a Bazel package\n # name of the workspace this file is defined in.\n \"workspace_member_package\": {\n\n # Not all dependencies are supported for all platforms.\n # the condition key is the condition required to be true\n # on the host platform.\n \"condition\": {\n\n # An alias to a crate target. # The label of the crate target the\n # Aliases are only crate names. # package name refers to.\n \"package_name\": \"@full//:label\",\n }\n }\n }\n ```\n\n Args:\n all_dependency_maps (list): A list of dicts as described above\n\n Returns:\n dict: A dictionary as described above\n \"\"\"\n dependencies = {}\n\n for workspace_deps_map in all_dependency_maps:\n for pkg_name, conditional_deps_map in workspace_deps_map.items():\n if pkg_name not in dependencies:\n non_frozen_map = dict()\n for key, values in conditional_deps_map.items():\n non_frozen_map.update({key: dict(values.items())})\n dependencies.setdefault(pkg_name, non_frozen_map)\n continue\n\n for condition, deps_map in conditional_deps_map.items():\n # If the condition has not been recorded, do so and continue\n if condition not in dependencies[pkg_name]:\n dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n continue\n\n # Alert on any miss-matched dependencies\n inconsistent_entries = []\n for crate_name, crate_label in deps_map.items():\n existing = dependencies[pkg_name][condition].get(crate_name)\n if existing and existing != crate_label:\n inconsistent_entries.append((crate_name, existing, crate_label))\n dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n return dependencies\n\ndef crate_deps(deps, package_name = None):\n \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n Args:\n deps (list): The desired list of crate targets.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()`.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if not deps:\n return []\n\n if package_name == None:\n package_name = native.package_name()\n\n # Join both sets of dependencies\n dependencies = _flatten_dependency_maps([\n _NORMAL_DEPENDENCIES,\n _NORMAL_DEV_DEPENDENCIES,\n _PROC_MACRO_DEPENDENCIES,\n _PROC_MACRO_DEV_DEPENDENCIES,\n _BUILD_DEPENDENCIES,\n _BUILD_PROC_MACRO_DEPENDENCIES,\n ]).pop(package_name, {})\n\n # Combine all conditional packages so we can easily index over a flat list\n # TODO: Perhaps this should actually return select statements and maintain\n # the conditionals of the dependencies\n flat_deps = {}\n for deps_set in dependencies.values():\n for crate_name, crate_label in deps_set.items():\n flat_deps.update({crate_name: crate_label})\n\n missing_crates = []\n crate_targets = []\n for crate_target in deps:\n if crate_target not in flat_deps:\n missing_crates.append(crate_target)\n else:\n crate_targets.append(flat_deps[crate_target])\n\n if missing_crates:\n fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n missing_crates,\n package_name,\n dependencies,\n ))\n\n return crate_targets\n\ndef crate_edition(package_name = None):\n \"\"\"Finds the Rust edition for the package where this macro is called.\n\n Args:\n package_name (str, optional): The package name whose edition should be\n looked up. Defaults to `native.package_name()` when unset.\n\n Returns:\n str: The Rust edition declared by the package's Cargo.toml file.\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n if package_name not in _CRATE_EDITIONS:\n fail(\"Tried to get crate_edition for package \" + package_name + \" but that package had no Cargo.toml file\")\n\n return _CRATE_EDITIONS[package_name]\n\ndef all_crate_deps(\n normal = False, \n normal_dev = False, \n proc_macro = False, \n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n for the package where this macro is called.\n\n If no parameters are set, all normal dependencies are returned. Setting any one flag will\n otherwise impact the contents of the returned list.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list.\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_dependency_maps = []\n if normal:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n if normal_dev:\n all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n if proc_macro:\n all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n if proc_macro_dev:\n all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n if build:\n all_dependency_maps.append(_BUILD_DEPENDENCIES)\n if build_proc_macro:\n all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n # Default to always using normal dependencies\n if not all_dependency_maps:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n if not dependencies:\n if dependencies == None:\n fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n else:\n return []\n\n crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n for condition, deps in dependencies.items():\n crate_deps += selects.with_or({\n tuple(_CONDITIONS[condition]): deps.values(),\n \"//conditions:default\": [],\n })\n\n return crate_deps\n\ndef aliases(\n normal = False,\n normal_dev = False,\n proc_macro = False,\n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Produces a map of Crate alias names to their original label\n\n If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n Setting any one flag will otherwise determine the contents of the returned dict.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n dict: The aliases of all associated packages\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_aliases_maps = []\n if normal:\n all_aliases_maps.append(_NORMAL_ALIASES)\n if normal_dev:\n all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n if proc_macro:\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n if proc_macro_dev:\n all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n if build:\n all_aliases_maps.append(_BUILD_ALIASES)\n if build_proc_macro:\n all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n # Default to always using normal aliases\n if not all_aliases_maps:\n all_aliases_maps.append(_NORMAL_ALIASES)\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n if not aliases:\n return dict()\n\n common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n # If there are only common items in the dictionary, immediately return them\n if not len(aliases.keys()) == 1:\n return dict(common_items)\n\n # Build a single select statement where each conditional has accounted for the\n # common set of aliases.\n crate_aliases = {\"//conditions:default\": dict(common_items)}\n for condition, deps in aliases.items():\n condition_triples = _CONDITIONS[condition]\n for triple in condition_triples:\n if triple in crate_aliases:\n crate_aliases[triple].update(deps)\n else:\n crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS, ALIASES, AND EDITIONS\n###############################################################################\n\n_CRATE_EDITIONS = {\n \"crates/vendor/brush-builtins\": \"2024\",\n \"crates/vendor/brush-core\": \"2024\",\n \"crates/vendor/jaq\": \"2024\",\n \"crates/pi-ast\": \"2024\",\n \"crates/pi-iso\": \"2024\",\n \"crates/pi-natives\": \"2024\",\n \"crates/pi-shell\": \"2024\",\n \"crates/pi-uutils-ctx\": \"2024\",\n \"crates/pi-voice\": \"2024\",\n \"crates/pi-walker\": \"2024\",\n \"crates/pi-uu-diff\": \"2024\",\n \"crates/pi-uu-grep\": \"2024\",\n \"crates/vendor/uu-b2sum\": \"2024\",\n \"crates/vendor/uu-base32\": \"2024\",\n \"crates/vendor/uu-base64\": \"2024\",\n \"crates/vendor/uu-basename\": \"2024\",\n \"crates/vendor/uu-cat\": \"2024\",\n \"crates/vendor/uu-checksum-common\": \"2024\",\n \"crates/vendor/uu-comm\": \"2024\",\n \"crates/vendor/uu-cut\": \"2024\",\n \"crates/vendor/uu-date\": \"2024\",\n \"crates/vendor/uu-dirname\": \"2024\",\n \"crates/vendor/uu-find\": \"2024\",\n \"crates/vendor/uu-head\": \"2024\",\n \"crates/vendor/uu-hostname\": \"2024\",\n \"crates/vendor/uu-ln\": \"2024\",\n \"crates/vendor/uu-ls\": \"2024\",\n \"crates/vendor/uu-md5sum\": \"2024\",\n \"crates/vendor/uu-mkdir\": \"2024\",\n \"crates/vendor/uu-mktemp\": \"2024\",\n \"crates/vendor/uu-mv\": \"2024\",\n \"crates/vendor/uu-nproc\": \"2024\",\n \"crates/vendor/uu-paste\": \"2024\",\n \"crates/vendor/uu-printenv\": \"2024\",\n \"crates/vendor/uu-readlink\": \"2024\",\n \"crates/vendor/uu-realpath\": \"2024\",\n \"crates/vendor/uu-rm\": \"2024\",\n \"crates/vendor/uu-sed\": \"2024\",\n \"crates/vendor/uu-seq\": \"2024\",\n \"crates/vendor/uu-sha1sum\": \"2024\",\n \"crates/vendor/uu-sha224sum\": \"2024\",\n \"crates/vendor/uu-sha256sum\": \"2024\",\n \"crates/vendor/uu-sha384sum\": \"2024\",\n \"crates/vendor/uu-sha512sum\": \"2024\",\n \"crates/vendor/uu-sort\": \"2024\",\n \"crates/vendor/uu-stat\": \"2024\",\n \"crates/vendor/uu-tac\": \"2024\",\n \"crates/vendor/uu-tail\": \"2024\",\n \"crates/vendor/uu-tee\": \"2024\",\n \"crates/vendor/uu-touch\": \"2024\",\n \"crates/vendor/uu-tr\": \"2024\",\n \"crates/vendor/uu-truncate\": \"2024\",\n \"crates/vendor/uu-uname\": \"2024\",\n \"crates/vendor/uu-uniq\": \"2024\",\n \"crates/vendor/uu-wc\": \"2024\",\n \"crates/vendor/uu-whoami\": \"2024\",\n \"crates/vendor/uu-xargs\": \"2024\",\n \"crates/vendor/uu-yes\": \"2024\",\n}\n\n_NORMAL_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n \"brush-parser\": Label(\"//brush-parser-0.4.0\"),\n \"cfg-if\": Label(\"//cfg-if-1.0.4\"),\n \"chrono\": Label(\"//chrono-0.4.45\"),\n \"clap\": Label(\"//clap-4.6.6\"),\n \"fancy-regex\": Label(\"//fancy-regex-0.17.0\"),\n \"futures\": Label(\"//futures-0.3.33\"),\n \"itertools\": Label(\"//itertools-0.14.0\"),\n \"strum\": Label(\"//strum-0.28.0\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"tracing\": Label(\"//tracing-0.1.44\"),\n },\n \"cfg(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"))\": {\n \"procfs\": Label(\"//procfs-0.18.0\"),\n },\n \"cfg(any(unix, windows))\": {\n \"tokio\": Label(\"//tokio-1.53.1\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(target_family = \\\"wasm\\\")\": {\n \"tokio\": Label(\"//tokio-1.53.1\"),\n },\n \"cfg(unix)\": {\n \"nix\": Label(\"//nix-0.31.3\"),\n \"rlimit\": Label(\"//rlimit-0.11.0\"),\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n \"bon\": Label(\"//bon-3.9.3\"),\n \"brush-parser\": Label(\"//brush-parser-0.4.0\"),\n \"cached\": Label(\"//cached-0.59.0\"),\n \"cfg-if\": Label(\"//cfg-if-1.0.4\"),\n \"chrono\": Label(\"//chrono-0.4.45\"),\n \"clap\": Label(\"//clap-4.6.6\"),\n \"color-print\": Label(\"//color-print-0.3.7\"),\n \"fancy-regex\": Label(\"//fancy-regex-0.17.0\"),\n \"futures\": Label(\"//futures-0.3.33\"),\n \"itertools\": Label(\"//itertools-0.14.0\"),\n \"normalize-path\": Label(\"//normalize-path-0.2.1\"),\n \"rand\": Label(\"//rand-0.10.2\"),\n \"rpds\": Label(\"//rpds-1.2.1\"),\n \"strum\": Label(\"//strum-0.28.0\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"tokio-util\": Label(\"//tokio-util-0.7.19\"),\n \"tracing\": Label(\"//tracing-0.1.44\"),\n },\n \"cfg(any(unix, windows))\": {\n \"hostname\": Label(\"//hostname-0.4.2\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n },\n \"cfg(target_family = \\\"wasm\\\")\": {\n \"tokio\": Label(\"//tokio-1.53.1\"),\n },\n \"cfg(unix)\": {\n \"command-fds\": Label(\"//command-fds-0.3.3\"),\n \"libc\": Label(\"//libc-0.2.189\"),\n \"nix\": Label(\"//nix-0.31.3\"),\n \"terminfo\": Label(\"//terminfo-0.9.0\"),\n \"uzers\": Label(\"//uzers-0.12.2\"),\n },\n \"cfg(windows)\": {\n \"check_elevation\": Label(\"//check_elevation-0.2.7\"),\n \"whoami\": Label(\"//whoami-2.1.2\"),\n \"windows-sys\": Label(\"//windows-sys-0.59.0\"),\n },\n \"wasm32-unknown-unknown\": {\n \"getrandom\": Label(\"//getrandom-0.4.3\"),\n \"uuid\": Label(\"//uuid-1.24.0\"),\n },\n },\n \"crates/vendor/jaq\": {\n _COMMON_CONDITION: {\n \"codesnake\": Label(\"//codesnake-0.2.1\"),\n \"hifijson\": Label(\"//hifijson-0.2.3\"),\n \"jaq-core\": Label(\"//jaq-core-2.2.1\"),\n \"jaq-json\": Label(\"//jaq-json-1.1.3\"),\n \"jaq-std\": Label(\"//jaq-std-2.1.2\"),\n \"memmap2\": Label(\"//memmap2-0.9.11\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n \"unicode-width\": Label(\"//unicode-width-0.1.14\"),\n \"yansi\": Label(\"//yansi-1.0.1\"),\n },\n },\n \"crates/pi-ast\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"ast-grep-core\": Label(\"//ast-grep-core-0.39.9\"),\n \"globset\": Label(\"//globset-0.4.20\"),\n \"ignore\": Label(\"//ignore-0.4.33\"),\n \"phf\": Label(\"//phf-0.13.1\"),\n \"serde\": Label(\"//serde-1.0.229\"),\n \"tree-sitter\": Label(\"//tree-sitter-0.25.10\"),\n \"tree_sitter_astro\": Label(\"//tree-sitter-astro-next-0.1.1\"),\n \"tree-sitter-bash\": Label(\"//tree-sitter-bash-0.25.1\"),\n \"tree-sitter-c\": Label(\"//tree-sitter-c-0.24.2\"),\n \"tree-sitter-c-sharp\": Label(\"//tree-sitter-c-sharp-0.23.5\"),\n \"tree-sitter-clojure\": Label(\"//tree-sitter-clojure-0.1.0\"),\n \"tree-sitter-cmake\": Label(\"//tree-sitter-cmake-0.7.4\"),\n \"tree-sitter-cpp\": Label(\"//tree-sitter-cpp-0.23.4\"),\n \"tree-sitter-css\": Label(\"//tree-sitter-css-0.25.0\"),\n \"tree-sitter-dart\": Label(\"//tree-sitter-dart-0.2.0\"),\n \"tree-sitter-diff\": Label(\"//tree-sitter-diff-0.1.0\"),\n \"tree_sitter_dockerfile\": Label(\"//tree-sitter-dockerfile-updated-0.2.0\"),\n \"tree-sitter-elisp\": Label(\"//tree-sitter-elisp-1.7.2\"),\n \"tree-sitter-elixir\": Label(\"//tree-sitter-elixir-0.3.5\"),\n \"tree-sitter-erlang\": Label(\"//tree-sitter-erlang-0.16.0\"),\n \"tree-sitter-fortran\": Label(\"//tree-sitter-fortran-0.6.0\"),\n \"tree-sitter-go\": Label(\"//tree-sitter-go-0.25.0\"),\n \"tree-sitter-graphql\": Label(\"//tree-sitter-graphql-0.1.0\"),\n \"tree-sitter-haskell\": Label(\"//tree-sitter-haskell-0.23.1\"),\n \"tree-sitter-hcl\": Label(\"//tree-sitter-hcl-1.1.0\"),\n \"tree-sitter-html\": Label(\"//tree-sitter-html-0.23.2\"),\n \"tree-sitter-ini\": Label(\"//tree-sitter-ini-1.4.0\"),\n \"tree-sitter-java\": Label(\"//tree-sitter-java-0.23.5\"),\n \"tree-sitter-javascript\": Label(\"//tree-sitter-javascript-0.25.0\"),\n \"tree-sitter-json\": Label(\"//tree-sitter-json-0.24.8\"),\n \"tree-sitter-julia\": Label(\"//tree-sitter-julia-0.23.1\"),\n \"tree-sitter-just\": Label(\"//tree-sitter-just-0.2.0\"),\n \"tree_sitter_kotlin\": Label(\"//tree-sitter-kotlin-sg-0.4.1\"),\n \"tree-sitter-lua\": Label(\"//tree-sitter-lua-0.5.0\"),\n \"tree-sitter-make\": Label(\"//tree-sitter-make-1.1.1\"),\n \"tree-sitter-md\": Label(\"//tree-sitter-md-0.5.3\"),\n \"tree-sitter-nix\": Label(\"//tree-sitter-nix-0.3.0\"),\n \"tree-sitter-objc\": Label(\"//tree-sitter-objc-3.0.2\"),\n \"tree-sitter-ocaml\": Label(\"//tree-sitter-ocaml-0.24.2\"),\n \"tree-sitter-odin\": Label(\"//tree-sitter-odin-1.3.0\"),\n \"tree-sitter-php\": Label(\"//tree-sitter-php-0.24.2\"),\n \"tree-sitter-powershell\": Label(\"//tree-sitter-powershell-0.26.4\"),\n \"tree-sitter-proto\": Label(\"//tree-sitter-proto-0.4.0\"),\n \"tree-sitter-python\": Label(\"//tree-sitter-python-0.25.0\"),\n \"tree-sitter-r\": Label(\"//tree-sitter-r-1.3.0\"),\n \"tree-sitter-regex\": Label(\"//tree-sitter-regex-0.25.0\"),\n \"tree-sitter-ruby\": Label(\"//tree-sitter-ruby-0.23.1\"),\n \"tree-sitter-rust\": Label(\"//tree-sitter-rust-0.24.2\"),\n \"tree-sitter-scala\": Label(\"//tree-sitter-scala-0.26.0\"),\n \"tree_sitter_sql\": Label(\"//tree-sitter-sequel-0.3.11\"),\n \"tree-sitter-solidity\": Label(\"//tree-sitter-solidity-1.2.13\"),\n \"tree-sitter-starlark\": Label(\"//tree-sitter-starlark-1.3.0\"),\n \"tree_sitter_svelte\": Label(\"//tree-sitter-svelte-next-0.1.1\"),\n \"tree-sitter-swift\": Label(\"//tree-sitter-swift-0.7.3\"),\n \"tree-sitter-tlaplus\": Label(\"//tree-sitter-tlaplus-1.5.0\"),\n \"tree-sitter-toml-ng\": Label(\"//tree-sitter-toml-ng-0.7.0\"),\n \"tree-sitter-typescript\": Label(\"//tree-sitter-typescript-0.23.2\"),\n \"tree-sitter-verilog\": Label(\"//tree-sitter-verilog-1.0.3\"),\n \"tree_sitter_vue\": Label(\"//tree-sitter-vue-next-0.1.0\"),\n \"tree-sitter-xml\": Label(\"//tree-sitter-xml-0.7.0\"),\n \"tree-sitter-yaml\": Label(\"//tree-sitter-yaml-0.7.2\"),\n \"tree-sitter-zig\": Label(\"//tree-sitter-zig-1.1.2\"),\n },\n },\n \"crates/pi-iso\": {\n _COMMON_CONDITION: {\n \"similar\": Label(\"//similar-3.1.2\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"arboard\": Label(\"//arboard-3.6.1\"),\n \"ast-grep-core\": Label(\"//ast-grep-core-0.39.9\"),\n \"base64\": Label(\"//base64-0.22.1\"),\n \"clap\": Label(\"//clap-4.6.6\"),\n \"flume\": Label(\"//flume-0.11.1\"),\n \"fontdue\": Label(\"//fontdue-0.9.4\"),\n \"futures\": Label(\"//futures-0.3.33\"),\n \"globset\": Label(\"//globset-0.4.20\"),\n \"grep-matcher\": Label(\"//grep-matcher-0.1.9\"),\n \"grep-pcre2\": Label(\"//grep-pcre2-0.1.10\"),\n \"grep-regex\": Label(\"//grep-regex-0.1.14\"),\n \"grep-searcher\": Label(\"//grep-searcher-0.1.17\"),\n \"html-to-markdown-rs\": Label(\"//html-to-markdown-rs-3.10.6\"),\n \"icy_sixel\": Label(\"//icy_sixel-0.5.0\"),\n \"ignore\": Label(\"//ignore-0.4.33\"),\n \"image\": Label(\"//image-0.25.10\"),\n \"inferno\": Label(\"//inferno-0.12.8\"),\n \"napi\": Label(\"//napi-3.12.0\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"phf\": Label(\"//phf-0.13.1\"),\n \"png\": Label(\"//png-0.18.1\"),\n \"portable-pty\": Label(\"//portable-pty-0.9.0\"),\n \"rayon\": Label(\"//rayon-1.12.0\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"serde\": Label(\"//serde-1.0.229\"),\n \"serde_json\": Label(\"//serde_json-1.0.151\"),\n \"smallvec\": Label(\"//smallvec-1.15.2\"),\n \"syntect\": Label(\"//syntect-5.3.0\"),\n \"tiktoken-rs\": Label(\"//tiktoken-rs-0.11.0\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n \"tokio-util\": Label(\"//tokio-util-0.7.19\"),\n \"toml\": Label(\"//toml-1.1.4+spec-1.1.0\"),\n \"unicode-segmentation\": Label(\"//unicode-segmentation-1.13.3\"),\n \"unicode-width\": Label(\"//unicode-width-0.2.2\"),\n \"xxhash-rust\": Label(\"//xxhash-rust-0.8.18\"),\n \"zune-jpeg\": Label(\"//zune-jpeg-0.5.15\"),\n },\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"windows\\\"))\": {\n \"enigo\": Label(\"//enigo-0.6.1\"),\n \"xcap\": Label(\"//xcap-0.9.6\"),\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n \"ashpd\": Label(\"//ashpd-0.11.1\"),\n \"atspi\": Label(\"//atspi-0.30.0\"),\n \"reis\": Label(\"//reis-0.5.0\"),\n \"x11rb\": Label(\"//x11rb-0.13.2\"),\n \"xkeysym\": Label(\"//xkeysym-0.2.1\"),\n },\n \"cfg(target_os = \\\"macos\\\")\": {\n \"core-graphics\": Label(\"//core-graphics-0.25.0\"),\n \"foreign-types\": Label(\"//foreign-types-0.5.0\"),\n \"objc2-app-kit\": Label(\"//objc2-app-kit-0.3.2\"),\n \"objc2-application-services\": Label(\"//objc2-application-services-0.3.2\"),\n \"objc2-core-foundation\": Label(\"//objc2-core-foundation-0.3.2\"),\n \"objc2-core-graphics\": Label(\"//objc2-core-graphics-0.3.2\"),\n \"objc2-foundation\": Label(\"//objc2-foundation-0.3.2\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"clipboard-win\": Label(\"//clipboard-win-5.4.1\"),\n \"uiautomation\": Label(\"//uiautomation-0.25.0\"),\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n \"winreg\": Label(\"//winreg-0.56.0\"),\n },\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"brush-parser\": Label(\"//brush-parser-0.3.0\"),\n \"bytes\": Label(\"//bytes-1.12.1\"),\n \"clap\": Label(\"//clap-4.6.6\"),\n \"flume\": Label(\"//flume-0.11.1\"),\n \"globset\": Label(\"//globset-0.4.20\"),\n \"ignore\": Label(\"//ignore-0.4.33\"),\n \"jiff\": Label(\"//jiff-0.2.35\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"os_pipe\": Label(\"//os_pipe-1.2.3\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"serde\": Label(\"//serde-1.0.229\"),\n \"serde_json\": Label(\"//serde_json-1.0.151\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n \"tokio-util\": Label(\"//tokio-util-0.7.19\"),\n \"toml\": Label(\"//toml-1.1.4+spec-1.1.0\"),\n \"xxhash-rust\": Label(\"//xxhash-rust-0.8.18\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"smallvec\": Label(\"//smallvec-1.15.2\"),\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n \"winreg\": Label(\"//winreg-0.56.0\"),\n },\n },\n \"crates/pi-uutils-ctx\": {\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n },\n \"crates/pi-voice\": {\n _COMMON_CONDITION: {\n \"audiopus_sys\": Label(\"//audiopus_sys-0.2.2\"),\n \"bytes\": Label(\"//bytes-1.12.1\"),\n \"flume\": Label(\"//flume-0.11.1\"),\n \"opus\": Label(\"//opus-0.3.1\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n \"webrtc\": Label(\"//webrtc-0.17.2\"),\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(target_os = \\\"windows\\\")\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/pi-walker\": {\n _COMMON_CONDITION: {\n \"dashmap\": Label(\"//dashmap-6.2.1\"),\n \"globset\": Label(\"//globset-0.4.20\"),\n \"ignore\": Label(\"//ignore-0.4.33\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"rayon\": Label(\"//rayon-1.12.0\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/pi-uu-diff\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"similar\": Label(\"//similar-3.1.2\"),\n },\n },\n \"crates/pi-uu-grep\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"globset\": Label(\"//globset-0.4.20\"),\n \"grep-cli\": Label(\"//grep-cli-0.1.12\"),\n \"grep-matcher\": Label(\"//grep-matcher-0.1.9\"),\n \"grep-pcre2\": Label(\"//grep-pcre2-0.1.10\"),\n \"grep-printer\": Label(\"//grep-printer-0.3.1\"),\n \"grep-regex\": Label(\"//grep-regex-0.1.14\"),\n \"grep-searcher\": Label(\"//grep-searcher-0.1.17\"),\n \"ignore\": Label(\"//ignore-0.4.33\"),\n \"serde_json\": Label(\"//serde_json-1.0.151\"),\n },\n },\n \"crates/vendor/uu-b2sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-base32\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-base64\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-basename\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-cat\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-checksum-common\": {\n _COMMON_CONDITION: {\n \"base64-simd\": Label(\"//base64-simd-0.8.0\"),\n \"clap\": Label(\"//clap-4.6.6\"),\n \"hex\": Label(\"//hex-0.4.3\"),\n \"os_display\": Label(\"//os_display-0.1.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-comm\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-cut\": {\n _COMMON_CONDITION: {\n \"bstr\": Label(\"//bstr-1.13.0\"),\n \"clap\": Label(\"//clap-4.6.6\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-date\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"jiff\": Label(\"//jiff-0.2.35\"),\n \"parse_datetime\": Label(\"//parse_datetime-0.14.0\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"rustix\": Label(\"//rustix-1.1.4\"),\n },\n },\n \"crates/vendor/uu-dirname\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-find\": {\n _COMMON_CONDITION: {\n \"argmax\": Label(\"//argmax-0.3.1\"),\n \"chrono\": Label(\"//chrono-0.4.45\"),\n \"clap\": Label(\"//clap-4.6.6\"),\n \"faccess\": Label(\"//faccess-0.2.4\"),\n \"nix\": Label(\"//nix-0.29.0\"),\n \"onig\": Label(\"//onig-6.5.3\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"uucore\": Label(\"//uucore-0.0.30\"),\n },\n },\n \"crates/vendor/uu-head\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-hostname\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"hostname\": Label(\"//hostname-0.4.2\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"openbsd\\\"))\": {\n \"dns-lookup\": Label(\"//dns-lookup-3.0.1\"),\n },\n \"cfg(target_os = \\\"windows\\\")\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-ln\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-ls\": {\n _COMMON_CONDITION: {\n \"ansi-width\": Label(\"//ansi-width-0.1.0\"),\n \"clap\": Label(\"//clap-4.6.6\"),\n \"glob\": Label(\"//glob-0.3.4\"),\n \"lscolors\": Label(\"//lscolors-0.21.0\"),\n \"rustc-hash\": Label(\"//rustc-hash-2.1.3\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n \"uutils_term_grid\": Label(\"//uutils_term_grid-0.8.0\"),\n },\n \"cfg(not(target_os = \\\"wasi\\\"))\": {\n \"hostname\": Label(\"//hostname-0.4.2\"),\n },\n },\n \"crates/vendor/uu-md5sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-mkdir\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"rustix\": Label(\"//rustix-1.1.4\"),\n },\n },\n \"crates/vendor/uu-mktemp\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"rand\": Label(\"//rand-0.10.2\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-mv\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"fs_extra\": Label(\"//fs_extra-1.3.0\"),\n \"indicatif\": Label(\"//indicatif-0.18.6\"),\n \"libc\": Label(\"//libc-0.2.189\"),\n \"rustc-hash\": Label(\"//rustc-hash-2.1.3\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-nproc\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"libc\": Label(\"//libc-0.2.189\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-paste\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-printenv\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-readlink\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-realpath\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-rm\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"indicatif\": Label(\"//indicatif-0.18.6\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-sed\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"fancy-regex\": Label(\"//fancy-regex-0.18.0\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n \"uucore\": Label(\"//uucore-0.9.0\"),\n },\n \"cfg(unix)\": {\n \"memmap2\": Label(\"//memmap2-0.9.11\"),\n },\n },\n \"crates/vendor/uu-seq\": {\n _COMMON_CONDITION: {\n \"bigdecimal\": Label(\"//bigdecimal-0.4.10\"),\n \"clap\": Label(\"//clap-4.6.6\"),\n \"num-bigint\": Label(\"//num-bigint-0.4.8\"),\n \"num-traits\": Label(\"//num-traits-0.2.19\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sha1sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sha224sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sha256sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sha384sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sha512sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sort\": {\n _COMMON_CONDITION: {\n \"bigdecimal\": Label(\"//bigdecimal-0.4.10\"),\n \"binary-heap-plus\": Label(\"//binary-heap-plus-0.5.0\"),\n \"clap\": Label(\"//clap-4.6.6\"),\n \"compare\": Label(\"//compare-0.1.0\"),\n \"flume\": Label(\"//flume-0.11.1\"),\n \"foldhash\": Label(\"//foldhash-0.2.0\"),\n \"itertools\": Label(\"//itertools-0.14.0\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"rand\": Label(\"//rand-0.10.2\"),\n \"rayon\": Label(\"//rayon-1.12.0\"),\n \"self_cell\": Label(\"//self_cell-1.3.0\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"nix\": Label(\"//nix-0.31.3\"),\n },\n },\n \"crates/vendor/uu-stat\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-tac\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"memmap2\": Label(\"//memmap2-0.9.11\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-tail\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(not(target_os = \\\"wasi\\\"))\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n \"notify\": Label(\"//notify-8.2.0\"),\n },\n \"cfg(unix)\": {\n \"rustix\": Label(\"//rustix-1.1.4\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-tee\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-touch\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"filetime\": Label(\"//filetime-0.2.29\"),\n \"jiff\": Label(\"//jiff-0.2.35\"),\n \"parse_datetime\": Label(\"//parse_datetime-0.14.0\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n \"rustix\": Label(\"//rustix-1.1.4\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-tr\": {\n _COMMON_CONDITION: {\n \"bytecount\": Label(\"//bytecount-0.6.9\"),\n \"clap\": Label(\"//clap-4.6.6\"),\n \"nom\": Label(\"//nom-8.0.0\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-truncate\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-uname\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"platform-info\": Label(\"//platform-info-2.1.0\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-uniq\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-wc\": {\n _COMMON_CONDITION: {\n \"bytecount\": Label(\"//bytecount-0.6.9\"),\n \"clap\": Label(\"//clap-4.6.6\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"unicode-width\": Label(\"//unicode-width-0.2.2\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n \"rustix\": Label(\"//rustix-1.1.4\"),\n },\n },\n \"crates/vendor/uu-whoami\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(target_os = \\\"windows\\\")\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-xargs\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n },\n \"crates/vendor/uu-yes\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.6\"),\n \"itertools\": Label(\"//itertools-0.14.0\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n}\n\n\n_NORMAL_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n },\n \"cfg(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"))\": {\n },\n \"cfg(any(unix, windows))\": {\n },\n \"cfg(target_family = \\\"wasm\\\")\": {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n },\n \"cfg(any(unix, windows))\": {\n },\n \"cfg(target_family = \\\"wasm\\\")\": {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n \"wasm32-unknown-unknown\": {\n },\n },\n \"crates/vendor/jaq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-ast\": {\n _COMMON_CONDITION: {\n Label(\"//tree-sitter-astro-next-0.1.1\"): \"tree_sitter_astro\",\n Label(\"//tree-sitter-dockerfile-updated-0.2.0\"): \"tree_sitter_dockerfile\",\n Label(\"//tree-sitter-kotlin-sg-0.4.1\"): \"tree_sitter_kotlin\",\n Label(\"//tree-sitter-sequel-0.3.11\"): \"tree_sitter_sql\",\n Label(\"//tree-sitter-svelte-next-0.1.1\"): \"tree_sitter_svelte\",\n Label(\"//tree-sitter-vue-next-0.1.0\"): \"tree_sitter_vue\",\n },\n },\n \"crates/pi-iso\": {\n _COMMON_CONDITION: {\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n },\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"windows\\\"))\": {\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n },\n \"cfg(target_os = \\\"macos\\\")\": {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/pi-uutils-ctx\": {\n \"cfg(unix)\": {\n },\n },\n \"crates/pi-voice\": {\n _COMMON_CONDITION: {\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n },\n \"cfg(target_os = \\\"windows\\\")\": {\n },\n },\n \"crates/pi-walker\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/pi-uu-diff\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-uu-grep\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-b2sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-base32\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-base64\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-basename\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-cat\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-checksum-common\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-comm\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-cut\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-date\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/uu-dirname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-find\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-head\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-hostname\": {\n _COMMON_CONDITION: {\n },\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"openbsd\\\"))\": {\n },\n \"cfg(target_os = \\\"windows\\\")\": {\n },\n },\n \"crates/vendor/uu-ln\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-ls\": {\n _COMMON_CONDITION: {\n },\n \"cfg(not(target_os = \\\"wasi\\\"))\": {\n },\n },\n \"crates/vendor/uu-md5sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-mkdir\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/uu-mktemp\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-mv\": {\n _COMMON_CONDITION: {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/vendor/uu-nproc\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-paste\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-printenv\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-readlink\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-realpath\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-rm\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/vendor/uu-sed\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/uu-seq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha1sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha224sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha256sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha384sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha512sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sort\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/uu-stat\": {\n _COMMON_CONDITION: {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/vendor/uu-tac\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tail\": {\n _COMMON_CONDITION: {\n },\n \"cfg(not(target_os = \\\"wasi\\\"))\": {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/vendor/uu-tee\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-touch\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/vendor/uu-tr\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-truncate\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uniq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-wc\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/uu-whoami\": {\n _COMMON_CONDITION: {\n },\n \"cfg(target_os = \\\"windows\\\")\": {\n },\n },\n \"crates/vendor/uu-xargs\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-yes\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"pretty_assertions\": Label(\"//pretty_assertions-1.4.1\"),\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"pretty_assertions\": Label(\"//pretty_assertions-1.4.1\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/jaq\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/pi-uu-grep\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-dirname\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-find\": {\n _COMMON_CONDITION: {\n \"filetime\": Label(\"//filetime-0.2.29\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-ln\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-readlink\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-realpath\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-seq\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-tac\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-tail\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"rstest\": Label(\"//rstest-0.26.1\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-uname\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-xargs\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-yes\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/jaq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-uu-grep\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-dirname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-find\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-ln\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-readlink\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-realpath\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-seq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tac\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tail\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-xargs\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-yes\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n \"strum_macros\": Label(\"//strum_macros-0.28.0\"),\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n \"async-recursion\": Label(\"//async-recursion-1.1.1\"),\n \"async-trait\": Label(\"//async-trait-0.1.91\"),\n \"inherent\": Label(\"//inherent-1.0.14\"),\n \"strum_macros\": Label(\"//strum_macros-0.28.0\"),\n },\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n _COMMON_CONDITION: {\n \"async-trait\": Label(\"//async-trait-0.1.91\"),\n },\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n \"napi-derive\": Label(\"//napi-derive-3.6.2\"),\n },\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_PROC_MACRO_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/jaq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-uu-grep\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-dirname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-find\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-ln\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-readlink\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-realpath\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-seq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tac\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tail\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-xargs\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-yes\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_BUILD_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n \"napi-build\": Label(\"//napi-build-2.4.0\"),\n \"serde\": Label(\"//serde-1.0.229\"),\n \"serde_json\": Label(\"//serde_json-1.0.151\"),\n },\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_BUILD_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_CONDITIONS = {\n \"aarch64-apple-darwin\": [\"@@//bazel/triples:aarch64-apple-darwin\"],\n \"aarch64-linux-android\": [],\n \"aarch64-pc-windows-gnullvm\": [],\n \"aarch64-unknown-linux-gnu\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\"],\n \"aarch64-unknown-linux-musl\": [\"@@//bazel/triples:aarch64-unknown-linux-musl\"],\n \"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_os = \\\"windows\\\"))\": [],\n \"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_vendor = \\\"apple\\\", any(target_os = \\\"ios\\\", target_os = \\\"macos\\\", target_os = \\\"tvos\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\")))\": [\"@@//bazel/triples:aarch64-apple-darwin\"],\n \"cfg(all(any(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), all(target_arch = \\\"arm\\\", target_endian = \\\"little\\\")), any(target_os = \\\"android\\\", target_os = \\\"linux\\\")))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\"],\n \"cfg(all(any(target_arch = \\\"x86_64\\\", target_arch = \\\"arm64ec\\\"), target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(all(any(target_os = \\\"android\\\", target_os = \\\"linux\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", target_arch = \\\"s390x\\\"), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), not(any(all(target_os = \\\"linux\\\", target_env = \\\"\\\"), getrandom_backend = \\\"custom\\\", getrandom_backend = \\\"linux_raw\\\", getrandom_backend = \\\"rdrand\\\", getrandom_backend = \\\"rndr\\\"))))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(not(curve25519_dalek_backend = \\\"fiat\\\"), not(curve25519_dalek_backend = \\\"serial\\\"), target_arch = \\\"x86_64\\\"))\": [\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", target_arch = \\\"s390x\\\"), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", target_arch = \\\"s390x\\\"), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_os = \\\"android\\\"))\": [],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_os = \\\"linux\\\"))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_vendor = \\\"apple\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\"],\n \"cfg(all(target_arch = \\\"loongarch64\\\", target_os = \\\"linux\\\"))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"unknown\\\"))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"wasi\\\", target_env = \\\"p2\\\"))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [\"@@//bazel/triples:x86_64-unknown-linux-gnu\"],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(all(target_family = \\\"wasm\\\", target_os = \\\"unknown\\\"))\": [],\n \"cfg(all(target_os = \\\"linux\\\", not(target_env = \\\"ohos\\\")))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(target_os = \\\"uefi\\\", getrandom_backend = \\\"efi_rng\\\"))\": [],\n \"cfg(all(unix, not(any(target_os = \\\"macos\\\", target_os = \\\"android\\\", target_os = \\\"emscripten\\\"))))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(unix, not(target_os = \\\"macos\\\")))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any())\": [],\n \"cfg(any(target_arch = \\\"aarch64\\\", target_arch = \\\"x86\\\", target_arch = \\\"x86_64\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_arch = \\\"aarch64\\\", target_arch = \\\"x86_64\\\", target_arch = \\\"x86\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_arch = \\\"x86\\\", target_arch = \\\"x86_64\\\"))\": [\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_arch = \\\"x86_64\\\", target_arch = \\\"x86\\\"))\": [\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_os = \\\"android\\\", target_os = \\\"linux\\\"))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_os = \\\"android\\\", target_os = \\\"linux\\\", target_os = \\\"macos\\\", target_os = \\\"hurd\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_os = \\\"dragonfly\\\", target_os = \\\"freebsd\\\", target_os = \\\"hurd\\\", target_os = \\\"illumos\\\", target_os = \\\"cygwin\\\", all(target_os = \\\"horizon\\\", target_arch = \\\"arm\\\")))\": [],\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"dragonfly\\\"))\": [],\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"netbsd\\\"))\": [],\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"openbsd\\\"))\": [],\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"openbsd\\\", target_os = \\\"netbsd\\\", target_os = \\\"dragonflybsd\\\", target_os = \\\"ios\\\"))\": [],\n \"cfg(any(target_os = \\\"haiku\\\", target_os = \\\"redox\\\", target_os = \\\"nto\\\", target_os = \\\"aix\\\"))\": [],\n \"cfg(any(target_os = \\\"ios\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\", target_os = \\\"tvos\\\"))\": [],\n \"cfg(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"openbsd\\\", target_os = \\\"vita\\\", target_os = \\\"emscripten\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"windows\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(any(unix, target_os = \\\"fuchsia\\\", target_os = \\\"vxworks\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(unix, target_os = \\\"hermit\\\", target_os = \\\"wasi\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(unix, target_os = \\\"redox\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(unix, target_os = \\\"wasi\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(unix, windows))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(windows, target_os = \\\"linux\\\"))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(curve25519_dalek_backend = \\\"fiat\\\")\": [],\n \"cfg(not(all(target_arch = \\\"arm\\\", target_os = \\\"none\\\")))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(not(any(target_os = \\\"android\\\", target_os = \\\"linux\\\")))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(not(target_has_atomic = \\\"ptr\\\"))\": [],\n \"cfg(not(target_os = \\\"wasi\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(not(target_os = \\\"windows\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(not(windows))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(target_arch = \\\"aarch64\\\")\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\"],\n \"cfg(target_arch = \\\"spirv\\\")\": [],\n \"cfg(target_arch = \\\"x86\\\")\": [],\n \"cfg(target_arch = \\\"x86_64\\\")\": [\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(target_family = \\\"wasm\\\")\": [],\n \"cfg(target_os = \\\"android\\\")\": [],\n \"cfg(target_os = \\\"freebsd\\\")\": [],\n \"cfg(target_os = \\\"haiku\\\")\": [],\n \"cfg(target_os = \\\"hermit\\\")\": [],\n \"cfg(target_os = \\\"linux\\\")\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(target_os = \\\"macos\\\")\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(target_os = \\\"netbsd\\\")\": [],\n \"cfg(target_os = \\\"redox\\\")\": [],\n \"cfg(target_os = \\\"solaris\\\")\": [],\n \"cfg(target_os = \\\"vxworks\\\")\": [],\n \"cfg(target_os = \\\"wasi\\\")\": [],\n \"cfg(target_os = \\\"windows\\\")\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(target_vendor = \\\"apple\\\")\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(unix)\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(windows)\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(windows_raw_dylib)\": [],\n \"i686-pc-windows-gnu\": [],\n \"i686-pc-windows-gnullvm\": [],\n \"wasm32-unknown-unknown\": [],\n \"x86_64-apple-darwin\": [\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"x86_64-pc-windows-gnu\": [],\n \"x86_64-pc-windows-gnullvm\": [],\n \"x86_64-pc-windows-msvc\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"x86_64-unknown-linux-gnu\": [\"@@//bazel/triples:x86_64-unknown-linux-gnu\"],\n \"x86_64-unknown-linux-musl\": [\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n \"\"\"A macro for defining repositories for all generated crates.\n\n Returns:\n A list of repos visible to the module through the module extension.\n \"\"\"\n maybe(\n crates_vendor_remote_repository,\n name = \"crates\",\n # Lean interface: just point at `crates.bzl`; the repo rule\n # derives the sibling `BUILD.bazel` and `defs.bzl`.\n crates_module = Label(\"@crates//crates:crates.bzl\"),\n )\n maybe(\n http_archive,\n name = \"crates__adler2-2.0.1\",\n sha256 = \"320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/adler2/2.0.1/download\"],\n strip_prefix = \"adler2-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.adler2-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aead-0.5.2\",\n sha256 = \"d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aead/0.5.2/download\"],\n strip_prefix = \"aead-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.aead-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aes-0.8.4\",\n sha256 = \"b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aes/0.8.4/download\"],\n strip_prefix = \"aes-0.8.4\",\n build_file = Label(\"@crates//crates:BUILD.aes-0.8.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aes-gcm-0.10.3\",\n sha256 = \"831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aes-gcm/0.10.3/download\"],\n strip_prefix = \"aes-gcm-0.10.3\",\n build_file = Label(\"@crates//crates:BUILD.aes-gcm-0.10.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ahash-0.8.12\",\n sha256 = \"5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ahash/0.8.12/download\"],\n strip_prefix = \"ahash-0.8.12\",\n build_file = Label(\"@crates//crates:BUILD.ahash-0.8.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aho-corasick-1.1.5\",\n sha256 = \"c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aho-corasick/1.1.5/download\"],\n strip_prefix = \"aho-corasick-1.1.5\",\n build_file = Label(\"@crates//crates:BUILD.aho-corasick-1.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__allocator-api2-0.2.21\",\n sha256 = \"683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/allocator-api2/0.2.21/download\"],\n strip_prefix = \"allocator-api2-0.2.21\",\n build_file = Label(\"@crates//crates:BUILD.allocator-api2-0.2.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__android_system_properties-0.1.6\",\n sha256 = \"ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/android_system_properties/0.1.6/download\"],\n strip_prefix = \"android_system_properties-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.android_system_properties-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__annotate-snippets-0.11.5\",\n sha256 = \"710e8eae58854cdc1790fcb56cca04d712a17be849eeb81da2a724bf4bae2bc4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/annotate-snippets/0.11.5/download\"],\n strip_prefix = \"annotate-snippets-0.11.5\",\n build_file = Label(\"@crates//crates:BUILD.annotate-snippets-0.11.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ansi-width-0.1.0\",\n sha256 = \"219e3ce6f2611d83b51ec2098a12702112c29e57203a6b0a0929b2cddb486608\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ansi-width/0.1.0/download\"],\n strip_prefix = \"ansi-width-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.ansi-width-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstream-1.0.0\",\n sha256 = \"824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstream/1.0.0/download\"],\n strip_prefix = \"anstream-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.anstream-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-1.0.14\",\n sha256 = \"940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle/1.0.14/download\"],\n strip_prefix = \"anstyle-1.0.14\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-1.0.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-parse-1.0.0\",\n sha256 = \"52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-parse/1.0.0/download\"],\n strip_prefix = \"anstyle-parse-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-parse-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-query-1.1.5\",\n sha256 = \"40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-query/1.1.5/download\"],\n strip_prefix = \"anstyle-query-1.1.5\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-query-1.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-wincon-3.0.11\",\n sha256 = \"291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-wincon/3.0.11/download\"],\n strip_prefix = \"anstyle-wincon-3.0.11\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-wincon-3.0.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anyhow-1.0.104\",\n sha256 = \"330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anyhow/1.0.104/download\"],\n strip_prefix = \"anyhow-1.0.104\",\n build_file = Label(\"@crates//crates:BUILD.anyhow-1.0.104.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__arboard-3.6.1\",\n sha256 = \"0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/arboard/3.6.1/download\"],\n strip_prefix = \"arboard-3.6.1\",\n build_file = Label(\"@crates//crates:BUILD.arboard-3.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__arc-swap-1.9.2\",\n sha256 = \"c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/arc-swap/1.9.2/download\"],\n strip_prefix = \"arc-swap-1.9.2\",\n build_file = Label(\"@crates//crates:BUILD.arc-swap-1.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__archery-1.2.2\",\n sha256 = \"70e0a5f99dfebb87bb342d0f53bb92c81842e100bbb915223e38349580e5441d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/archery/1.2.2/download\"],\n strip_prefix = \"archery-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.archery-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__argmax-0.3.1\",\n sha256 = \"5b7e3ef5e3a7f2c5e5a49d90ad087c03d38258e75155daac64deb62c50972c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/argmax/0.3.1/download\"],\n strip_prefix = \"argmax-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.argmax-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__arrayref-0.3.9\",\n sha256 = \"76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/arrayref/0.3.9/download\"],\n strip_prefix = \"arrayref-0.3.9\",\n build_file = Label(\"@crates//crates:BUILD.arrayref-0.3.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__arrayvec-0.7.8\",\n sha256 = \"d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/arrayvec/0.7.8/download\"],\n strip_prefix = \"arrayvec-0.7.8\",\n build_file = Label(\"@crates//crates:BUILD.arrayvec-0.7.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ashpd-0.11.1\",\n sha256 = \"d2f3f79755c74fd155000314eb349864caa787c6592eace6c6882dad873d9c39\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ashpd/0.11.1/download\"],\n strip_prefix = \"ashpd-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.ashpd-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__asn1-rs-0.6.2\",\n sha256 = \"5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/asn1-rs/0.6.2/download\"],\n strip_prefix = \"asn1-rs-0.6.2\",\n build_file = Label(\"@crates//crates:BUILD.asn1-rs-0.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__asn1-rs-derive-0.5.1\",\n sha256 = \"965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/asn1-rs-derive/0.5.1/download\"],\n strip_prefix = \"asn1-rs-derive-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.asn1-rs-derive-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__asn1-rs-impl-0.2.0\",\n sha256 = \"7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/asn1-rs-impl/0.2.0/download\"],\n strip_prefix = \"asn1-rs-impl-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.asn1-rs-impl-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ast-grep-core-0.39.9\",\n sha256 = \"057ae90e7256ebf85f840b1638268df0142c9d19467d500b790631fd301acc27\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ast-grep-core/0.39.9/download\"],\n strip_prefix = \"ast-grep-core-0.39.9\",\n build_file = Label(\"@crates//crates:BUILD.ast-grep-core-0.39.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__astral-tl-0.7.11\",\n sha256 = \"d90933ffb0f97e2fc2e0de21da9d3f20597b804012d199843a6fe7c2810d28f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/astral-tl/0.7.11/download\"],\n strip_prefix = \"astral-tl-0.7.11\",\n build_file = Label(\"@crates//crates:BUILD.astral-tl-0.7.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-broadcast-0.7.2\",\n sha256 = \"435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-broadcast/0.7.2/download\"],\n strip_prefix = \"async-broadcast-0.7.2\",\n build_file = Label(\"@crates//crates:BUILD.async-broadcast-0.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-channel-2.5.0\",\n sha256 = \"924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-channel/2.5.0/download\"],\n strip_prefix = \"async-channel-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.async-channel-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-executor-1.14.0\",\n sha256 = \"c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-executor/1.14.0/download\"],\n strip_prefix = \"async-executor-1.14.0\",\n build_file = Label(\"@crates//crates:BUILD.async-executor-1.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-io-2.6.0\",\n sha256 = \"456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-io/2.6.0/download\"],\n strip_prefix = \"async-io-2.6.0\",\n build_file = Label(\"@crates//crates:BUILD.async-io-2.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-lock-3.4.2\",\n sha256 = \"290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-lock/3.4.2/download\"],\n strip_prefix = \"async-lock-3.4.2\",\n build_file = Label(\"@crates//crates:BUILD.async-lock-3.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-process-2.5.0\",\n sha256 = \"fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-process/2.5.0/download\"],\n strip_prefix = \"async-process-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.async-process-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-recursion-1.1.1\",\n sha256 = \"3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-recursion/1.1.1/download\"],\n strip_prefix = \"async-recursion-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.async-recursion-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-signal-0.2.14\",\n sha256 = \"52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-signal/0.2.14/download\"],\n strip_prefix = \"async-signal-0.2.14\",\n build_file = Label(\"@crates//crates:BUILD.async-signal-0.2.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-task-4.7.1\",\n sha256 = \"8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-task/4.7.1/download\"],\n strip_prefix = \"async-task-4.7.1\",\n build_file = Label(\"@crates//crates:BUILD.async-task-4.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-trait-0.1.91\",\n sha256 = \"ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-trait/0.1.91/download\"],\n strip_prefix = \"async-trait-0.1.91\",\n build_file = Label(\"@crates//crates:BUILD.async-trait-0.1.91.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atomic-waker-1.1.2\",\n sha256 = \"1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atomic-waker/1.1.2/download\"],\n strip_prefix = \"atomic-waker-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.atomic-waker-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atspi-0.30.0\",\n sha256 = \"6bf601cccedfffec598ec2db1f9d6745885458bccc0e8916d7023f017c94b3d0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atspi/0.30.0/download\"],\n strip_prefix = \"atspi-0.30.0\",\n build_file = Label(\"@crates//crates:BUILD.atspi-0.30.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atspi-common-0.14.0\",\n sha256 = \"f8a79bed3f5b408ce3152f36e07327a845e6ed5d7e2821a89264037dbcc11daf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atspi-common/0.14.0/download\"],\n strip_prefix = \"atspi-common-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.atspi-common-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atspi-connection-0.14.0\",\n sha256 = \"8fab8e4f574f5a7d3af280b38eff25fb6f47a537dac9ae39ce152f52b19fb10b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atspi-connection/0.14.0/download\"],\n strip_prefix = \"atspi-connection-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.atspi-connection-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atspi-proxies-0.14.0\",\n sha256 = \"53403acd3ab2fdb5914f6558da22e540fc07656fce5510f8c02be0e6ef68413e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atspi-proxies/0.14.0/download\"],\n strip_prefix = \"atspi-proxies-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.atspi-proxies-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__audiopus_sys-0.2.2\",\n patch_args = [\n \"-p1\",\n ],\n patches = [\n \"@@//bazel/patches:audiopus-sys-libdir.patch\",\n ],\n sha256 = \"62314a1546a2064e033665d658e88c620a62904be945f8147e6b16c3db9f8651\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/audiopus_sys/0.2.2/download\"],\n strip_prefix = \"audiopus_sys-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.audiopus_sys-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__autocfg-1.5.1\",\n sha256 = \"f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/autocfg/1.5.1/download\"],\n strip_prefix = \"autocfg-1.5.1\",\n build_file = Label(\"@crates//crates:BUILD.autocfg-1.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base16ct-0.2.0\",\n sha256 = \"4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base16ct/0.2.0/download\"],\n strip_prefix = \"base16ct-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.base16ct-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-0.22.1\",\n sha256 = \"72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64/0.22.1/download\"],\n strip_prefix = \"base64-0.22.1\",\n build_file = Label(\"@crates//crates:BUILD.base64-0.22.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-0.23.1\",\n sha256 = \"ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64/0.23.1/download\"],\n strip_prefix = \"base64-0.23.1\",\n build_file = Label(\"@crates//crates:BUILD.base64-0.23.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-simd-0.8.0\",\n sha256 = \"339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64-simd/0.8.0/download\"],\n strip_prefix = \"base64-simd-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.base64-simd-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64ct-1.8.3\",\n sha256 = \"2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64ct/1.8.3/download\"],\n strip_prefix = \"base64ct-1.8.3\",\n build_file = Label(\"@crates//crates:BUILD.base64ct-1.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bigdecimal-0.4.10\",\n sha256 = \"4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bigdecimal/0.4.10/download\"],\n strip_prefix = \"bigdecimal-0.4.10\",\n build_file = Label(\"@crates//crates:BUILD.bigdecimal-0.4.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__binary-heap-plus-0.5.0\",\n sha256 = \"e4551d8382e911ecc0d0f0ffb602777988669be09447d536ff4388d1def11296\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/binary-heap-plus/0.5.0/download\"],\n strip_prefix = \"binary-heap-plus-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.binary-heap-plus-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bincode-1.3.3\",\n sha256 = \"b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bincode/1.3.3/download\"],\n strip_prefix = \"bincode-1.3.3\",\n build_file = Label(\"@crates//crates:BUILD.bincode-1.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bindgen-0.72.1\",\n sha256 = \"993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bindgen/0.72.1/download\"],\n strip_prefix = \"bindgen-0.72.1\",\n build_file = Label(\"@crates//crates:BUILD.bindgen-0.72.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-set-0.8.0\",\n sha256 = \"08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-set/0.8.0/download\"],\n strip_prefix = \"bit-set-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.bit-set-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-vec-0.8.0\",\n sha256 = \"5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-vec/0.8.0/download\"],\n strip_prefix = \"bit-vec-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.bit-vec-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitflags-1.3.2\",\n sha256 = \"bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitflags/1.3.2/download\"],\n strip_prefix = \"bitflags-1.3.2\",\n build_file = Label(\"@crates//crates:BUILD.bitflags-1.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitflags-2.13.1\",\n sha256 = \"b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitflags/2.13.1/download\"],\n strip_prefix = \"bitflags-2.13.1\",\n build_file = Label(\"@crates//crates:BUILD.bitflags-2.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitvec-1.1.1\",\n sha256 = \"ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitvec/1.1.1/download\"],\n strip_prefix = \"bitvec-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.bitvec-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__blake2b_simd-1.0.4\",\n sha256 = \"b79834656f71332577234b50bfc009996f7449e0c056884e6a02492ded0ca2f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/blake2b_simd/1.0.4/download\"],\n strip_prefix = \"blake2b_simd-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.blake2b_simd-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__blake3-1.8.6\",\n sha256 = \"76ae7bad254120e9e4c63bafc385310756f90c484eac0e36b8317cf09cb92a77\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/blake3/1.8.6/download\"],\n strip_prefix = \"blake3-1.8.6\",\n build_file = Label(\"@crates//crates:BUILD.blake3-1.8.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-buffer-0.10.4\",\n sha256 = \"3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-buffer/0.10.4/download\"],\n strip_prefix = \"block-buffer-0.10.4\",\n build_file = Label(\"@crates//crates:BUILD.block-buffer-0.10.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-buffer-0.12.1\",\n sha256 = \"d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-buffer/0.12.1/download\"],\n strip_prefix = \"block-buffer-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.block-buffer-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-padding-0.3.3\",\n sha256 = \"a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-padding/0.3.3/download\"],\n strip_prefix = \"block-padding-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.block-padding-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block2-0.6.2\",\n sha256 = \"cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block2/0.6.2/download\"],\n strip_prefix = \"block2-0.6.2\",\n build_file = Label(\"@crates//crates:BUILD.block2-0.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__blocking-1.6.2\",\n sha256 = \"e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/blocking/1.6.2/download\"],\n strip_prefix = \"blocking-1.6.2\",\n build_file = Label(\"@crates//crates:BUILD.blocking-1.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bon-3.9.3\",\n sha256 = \"a602c73c7b0148ec6d12af6fd5cc7a46e2eacc8878271a999abac56eed12f561\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bon/3.9.3/download\"],\n strip_prefix = \"bon-3.9.3\",\n build_file = Label(\"@crates//crates:BUILD.bon-3.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bon-macros-3.9.3\",\n sha256 = \"6dee98b0db6a962de883bf5d20362dee4d7ca0d12fe39a7c6c73c844e1cd7c1f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bon-macros/3.9.3/download\"],\n strip_prefix = \"bon-macros-3.9.3\",\n build_file = Label(\"@crates//crates:BUILD.bon-macros-3.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__brush-parser-0.3.0\",\n sha256 = \"f7367124d4f38fdcd65f4b815bda7caeb3de377b9cd95ffa1b23627989c93718\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/brush-parser/0.3.0/download\"],\n strip_prefix = \"brush-parser-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.brush-parser-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__brush-parser-0.4.0\",\n sha256 = \"9f64b19efc02f0dd6cac1d462e20a1098f425f09cb13624efbb1b7d63f061735\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/brush-parser/0.4.0/download\"],\n strip_prefix = \"brush-parser-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.brush-parser-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bstr-1.13.0\",\n sha256 = \"1f7dc094d718f2e1c1559ad110e27eeaae14a5465d3d56dd6dbd793079fbd530\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bstr/1.13.0/download\"],\n strip_prefix = \"bstr-1.13.0\",\n build_file = Label(\"@crates//crates:BUILD.bstr-1.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bumpalo-3.20.3\",\n sha256 = \"72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bumpalo/3.20.3/download\"],\n strip_prefix = \"bumpalo-3.20.3\",\n build_file = Label(\"@crates//crates:BUILD.bumpalo-3.20.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__by_address-1.2.1\",\n sha256 = \"64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/by_address/1.2.1/download\"],\n strip_prefix = \"by_address-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.by_address-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecheck-0.8.3\",\n sha256 = \"26333eeac754f0ad8a6bcd0eb0ac012156302e4e16b852b72ee399aea4f12c29\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecheck/0.8.3/download\"],\n strip_prefix = \"bytecheck-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.bytecheck-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecheck_derive-0.8.3\",\n sha256 = \"46d07918caa9eeaaf06b7873925c53a61daac173539b4f7715090745e44e4e69\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecheck_derive/0.8.3/download\"],\n strip_prefix = \"bytecheck_derive-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.bytecheck_derive-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecount-0.6.9\",\n sha256 = \"175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecount/0.6.9/download\"],\n strip_prefix = \"bytecount-0.6.9\",\n build_file = Label(\"@crates//crates:BUILD.bytecount-0.6.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytemuck-1.25.2\",\n sha256 = \"95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytemuck/1.25.2/download\"],\n strip_prefix = \"bytemuck-1.25.2\",\n build_file = Label(\"@crates//crates:BUILD.bytemuck-1.25.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytemuck_derive-1.12.0\",\n sha256 = \"fc0e56a716f1e132ff6bf4bdac1c944a3fcdc1cae65f70a4a2a1ac3b401d2d1f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytemuck_derive/1.12.0/download\"],\n strip_prefix = \"bytemuck_derive-1.12.0\",\n build_file = Label(\"@crates//crates:BUILD.bytemuck_derive-1.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__byteorder-1.5.0\",\n sha256 = \"1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/byteorder/1.5.0/download\"],\n strip_prefix = \"byteorder-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.byteorder-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__byteorder-lite-0.1.0\",\n sha256 = \"8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/byteorder-lite/0.1.0/download\"],\n strip_prefix = \"byteorder-lite-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.byteorder-lite-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytes-1.12.1\",\n sha256 = \"fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytes/1.12.1/download\"],\n strip_prefix = \"bytes-1.12.1\",\n build_file = Label(\"@crates//crates:BUILD.bytes-1.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached-0.56.0\",\n sha256 = \"801927ee168e17809ab8901d9f01f700cd7d8d6a6527997fee44e4b0327a253c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached/0.56.0/download\"],\n strip_prefix = \"cached-0.56.0\",\n build_file = Label(\"@crates//crates:BUILD.cached-0.56.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached-0.59.0\",\n sha256 = \"53b6f5d101f0f6322c8646a45b7c581a673e476329040d97565815c2461dd0c4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached/0.59.0/download\"],\n strip_prefix = \"cached-0.59.0\",\n build_file = Label(\"@crates//crates:BUILD.cached-0.59.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached_proc_macro-0.25.0\",\n sha256 = \"9225bdcf4e4a9a4c08bf16607908eb2fbf746828d5e0b5e019726dbf6571f201\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached_proc_macro/0.25.0/download\"],\n strip_prefix = \"cached_proc_macro-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.cached_proc_macro-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached_proc_macro-0.27.0\",\n sha256 = \"8ebcf9c75f17a17d55d11afc98e46167d4790a263f428891b8705ab2f793eca3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached_proc_macro/0.27.0/download\"],\n strip_prefix = \"cached_proc_macro-0.27.0\",\n build_file = Label(\"@crates//crates:BUILD.cached_proc_macro-0.27.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached_proc_macro_types-0.1.1\",\n sha256 = \"ade8366b8bd5ba243f0a58f036cc0ca8a2f069cff1a2351ef1cac6b083e16fc0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached_proc_macro_types/0.1.1/download\"],\n strip_prefix = \"cached_proc_macro_types-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.cached_proc_macro_types-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__calendrical_calculations-0.2.4\",\n sha256 = \"5abbd6eeda6885048d357edc66748eea6e0268e3dd11f326fff5bd248d779c26\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/calendrical_calculations/0.2.4/download\"],\n strip_prefix = \"calendrical_calculations-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.calendrical_calculations-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cbc-0.1.2\",\n sha256 = \"26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cbc/0.1.2/download\"],\n strip_prefix = \"cbc-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.cbc-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cc-1.2.67\",\n sha256 = \"e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cc/1.2.67/download\"],\n strip_prefix = \"cc-1.2.67\",\n build_file = Label(\"@crates//crates:BUILD.cc-1.2.67.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ccm-0.5.0\",\n sha256 = \"9ae3c82e4355234767756212c570e29833699ab63e6ffd161887314cc5b43847\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ccm/0.5.0/download\"],\n strip_prefix = \"ccm-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.ccm-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cexpr-0.6.0\",\n sha256 = \"6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cexpr/0.6.0/download\"],\n strip_prefix = \"cexpr-0.6.0\",\n build_file = Label(\"@crates//crates:BUILD.cexpr-0.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg-expr-0.20.8\",\n sha256 = \"fb693542bcafa528e198be0ebd9d3632ca5b7c93dbe7237460e199910835997c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg-expr/0.20.8/download\"],\n strip_prefix = \"cfg-expr-0.20.8\",\n build_file = Label(\"@crates//crates:BUILD.cfg-expr-0.20.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg-if-1.0.4\",\n sha256 = \"9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg-if/1.0.4/download\"],\n strip_prefix = \"cfg-if-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.cfg-if-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg_aliases-0.1.1\",\n sha256 = \"fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg_aliases/0.1.1/download\"],\n strip_prefix = \"cfg_aliases-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.cfg_aliases-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg_aliases-0.2.2\",\n sha256 = \"f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg_aliases/0.2.2/download\"],\n strip_prefix = \"cfg_aliases-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.cfg_aliases-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chacha20-0.10.1\",\n sha256 = \"d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chacha20/0.10.1/download\"],\n strip_prefix = \"chacha20-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.chacha20-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chacha20-0.9.1\",\n sha256 = \"c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chacha20/0.9.1/download\"],\n strip_prefix = \"chacha20-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.chacha20-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chacha20poly1305-0.10.1\",\n sha256 = \"10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chacha20poly1305/0.10.1/download\"],\n strip_prefix = \"chacha20poly1305-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.chacha20poly1305-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__check_elevation-0.2.7\",\n sha256 = \"a7fe1fbbd8bd3174109071530f12932ff471eeff30d83e9c485d6ff424ac534b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/check_elevation/0.2.7/download\"],\n strip_prefix = \"check_elevation-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.check_elevation-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chrono-0.4.45\",\n sha256 = \"1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chrono/0.4.45/download\"],\n strip_prefix = \"chrono-0.4.45\",\n build_file = Label(\"@crates//crates:BUILD.chrono-0.4.45.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chrono-tz-0.10.4\",\n sha256 = \"a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chrono-tz/0.10.4/download\"],\n strip_prefix = \"chrono-tz-0.10.4\",\n build_file = Label(\"@crates//crates:BUILD.chrono-tz-0.10.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cipher-0.4.4\",\n sha256 = \"773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cipher/0.4.4/download\"],\n strip_prefix = \"cipher-0.4.4\",\n build_file = Label(\"@crates//crates:BUILD.cipher-0.4.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clang-sys-1.9.1\",\n sha256 = \"157a8ba7b480713b56f4c09fd13fc3e0a22a5dfab8097ba61cbc5feef950788a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clang-sys/1.9.1/download\"],\n strip_prefix = \"clang-sys-1.9.1\",\n build_file = Label(\"@crates//crates:BUILD.clang-sys-1.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap-4.6.6\",\n sha256 = \"473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap/4.6.6/download\"],\n strip_prefix = \"clap-4.6.6\",\n build_file = Label(\"@crates//crates:BUILD.clap-4.6.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_builder-4.6.6\",\n sha256 = \"7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_builder/4.6.6/download\"],\n strip_prefix = \"clap_builder-4.6.6\",\n build_file = Label(\"@crates//crates:BUILD.clap_builder-4.6.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_derive-4.6.4\",\n sha256 = \"d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_derive/4.6.4/download\"],\n strip_prefix = \"clap_derive-4.6.4\",\n build_file = Label(\"@crates//crates:BUILD.clap_derive-4.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_lex-1.1.0\",\n sha256 = \"c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_lex/1.1.0/download\"],\n strip_prefix = \"clap_lex-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.clap_lex-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clipboard-win-5.4.1\",\n sha256 = \"bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clipboard-win/5.4.1/download\"],\n strip_prefix = \"clipboard-win-5.4.1\",\n build_file = Label(\"@crates//crates:BUILD.clipboard-win-5.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cmake-0.1.58\",\n sha256 = \"c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cmake/0.1.58/download\"],\n strip_prefix = \"cmake-0.1.58\",\n build_file = Label(\"@crates//crates:BUILD.cmake-0.1.58.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__codesnake-0.2.1\",\n sha256 = \"2205f7f6d3de68ecf4c291c789b3edf07b6569268abd0188819086f71ae42225\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/codesnake/0.2.1/download\"],\n strip_prefix = \"codesnake-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.codesnake-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__color-print-0.3.7\",\n sha256 = \"3aa954171903797d5623e047d9ab69d91b493657917bdfb8c2c80ecaf9cdb6f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/color-print/0.3.7/download\"],\n strip_prefix = \"color-print-0.3.7\",\n build_file = Label(\"@crates//crates:BUILD.color-print-0.3.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__color-print-proc-macro-0.3.7\",\n sha256 = \"692186b5ebe54007e45a59aea47ece9eb4108e141326c304cdc91699a7118a22\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/color-print-proc-macro/0.3.7/download\"],\n strip_prefix = \"color-print-proc-macro-0.3.7\",\n build_file = Label(\"@crates//crates:BUILD.color-print-proc-macro-0.3.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__color_quant-1.1.0\",\n sha256 = \"3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/color_quant/1.1.0/download\"],\n strip_prefix = \"color_quant-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.color_quant-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colorchoice-1.0.5\",\n sha256 = \"1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colorchoice/1.0.5/download\"],\n strip_prefix = \"colorchoice-1.0.5\",\n build_file = Label(\"@crates//crates:BUILD.colorchoice-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__command-fds-0.3.3\",\n sha256 = \"1b60b5124979fccd9addd89d8b97a1d6eebb4950694520c75ddd722535ea443f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/command-fds/0.3.3/download\"],\n strip_prefix = \"command-fds-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.command-fds-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__compare-0.1.0\",\n sha256 = \"120133d4db2ec47efe2e26502ee984747630c67f51974fca0b6c1340cf2368d3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/compare/0.1.0/download\"],\n strip_prefix = \"compare-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.compare-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__concurrent-queue-2.5.0\",\n sha256 = \"4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/concurrent-queue/2.5.0/download\"],\n strip_prefix = \"concurrent-queue-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.concurrent-queue-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__console-0.16.4\",\n sha256 = \"4fe5f465a4f6fee88fad41b85d990f84c835335e85b5d9e6e63e0d06d28cba7c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/console/0.16.4/download\"],\n strip_prefix = \"console-0.16.4\",\n build_file = Label(\"@crates//crates:BUILD.console-0.16.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__const-oid-0.10.2\",\n sha256 = \"a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/const-oid/0.10.2/download\"],\n strip_prefix = \"const-oid-0.10.2\",\n build_file = Label(\"@crates//crates:BUILD.const-oid-0.10.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__const-oid-0.9.6\",\n sha256 = \"c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/const-oid/0.9.6/download\"],\n strip_prefix = \"const-oid-0.9.6\",\n build_file = Label(\"@crates//crates:BUILD.const-oid-0.9.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__const-random-0.1.18\",\n sha256 = \"87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/const-random/0.1.18/download\"],\n strip_prefix = \"const-random-0.1.18\",\n build_file = Label(\"@crates//crates:BUILD.const-random-0.1.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__const-random-macro-0.1.16\",\n sha256 = \"f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/const-random-macro/0.1.16/download\"],\n strip_prefix = \"const-random-macro-0.1.16\",\n build_file = Label(\"@crates//crates:BUILD.const-random-macro-0.1.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__constant_time_eq-0.4.2\",\n sha256 = \"3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/constant_time_eq/0.4.2/download\"],\n strip_prefix = \"constant_time_eq-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.constant_time_eq-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__convert_case-0.11.0\",\n sha256 = \"affbf0190ed2caf063e3def54ff444b449371d55c58e513a95ab98eca50adb49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/convert_case/0.11.0/download\"],\n strip_prefix = \"convert_case-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.convert_case-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__convert_case-0.8.0\",\n sha256 = \"baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/convert_case/0.8.0/download\"],\n strip_prefix = \"convert_case-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.convert_case-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cookie-factory-0.3.3\",\n sha256 = \"9885fa71e26b8ab7855e2ec7cae6e9b380edff76cd052e07c683a0319d51b3a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cookie-factory/0.3.3/download\"],\n strip_prefix = \"cookie-factory-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.cookie-factory-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-foundation-0.10.1\",\n sha256 = \"b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-foundation/0.10.1/download\"],\n strip_prefix = \"core-foundation-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.core-foundation-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-foundation-sys-0.8.7\",\n sha256 = \"773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-foundation-sys/0.8.7/download\"],\n strip_prefix = \"core-foundation-sys-0.8.7\",\n build_file = Label(\"@crates//crates:BUILD.core-foundation-sys-0.8.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-graphics-0.25.0\",\n sha256 = \"064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-graphics/0.25.0/download\"],\n strip_prefix = \"core-graphics-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.core-graphics-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-graphics-types-0.2.0\",\n sha256 = \"3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-graphics-types/0.2.0/download\"],\n strip_prefix = \"core-graphics-types-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.core-graphics-types-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core_maths-0.1.1\",\n sha256 = \"77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core_maths/0.1.1/download\"],\n strip_prefix = \"core_maths-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.core_maths-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cpufeatures-0.2.17\",\n sha256 = \"59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cpufeatures/0.2.17/download\"],\n strip_prefix = \"cpufeatures-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.cpufeatures-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cpufeatures-0.3.0\",\n sha256 = \"8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cpufeatures/0.3.0/download\"],\n strip_prefix = \"cpufeatures-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.cpufeatures-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crc-3.4.0\",\n sha256 = \"5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crc/3.4.0/download\"],\n strip_prefix = \"crc-3.4.0\",\n build_file = Label(\"@crates//crates:BUILD.crc-3.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crc-catalog-2.5.0\",\n sha256 = \"217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crc-catalog/2.5.0/download\"],\n strip_prefix = \"crc-catalog-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.crc-catalog-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crc-fast-1.8.2\",\n sha256 = \"85d9be5297a59f1b7651fd2711a1f4461929f53b182b394df0df15b3a387ef51\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crc-fast/1.8.2/download\"],\n strip_prefix = \"crc-fast-1.8.2\",\n build_file = Label(\"@crates//crates:BUILD.crc-fast-1.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crc32fast-1.5.0\",\n sha256 = \"9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crc32fast/1.5.0/download\"],\n strip_prefix = \"crc32fast-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.crc32fast-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-deque-0.8.7\",\n sha256 = \"5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-deque/0.8.7/download\"],\n strip_prefix = \"crossbeam-deque-0.8.7\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-deque-0.8.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-epoch-0.9.20\",\n sha256 = \"2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-epoch/0.9.20/download\"],\n strip_prefix = \"crossbeam-epoch-0.9.20\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-epoch-0.9.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-utils-0.8.22\",\n sha256 = \"61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-utils/0.8.22/download\"],\n strip_prefix = \"crossbeam-utils-0.8.22\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-utils-0.8.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crunchy-0.2.4\",\n sha256 = \"460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crunchy/0.2.4/download\"],\n strip_prefix = \"crunchy-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.crunchy-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-bigint-0.5.5\",\n sha256 = \"0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-bigint/0.5.5/download\"],\n strip_prefix = \"crypto-bigint-0.5.5\",\n build_file = Label(\"@crates//crates:BUILD.crypto-bigint-0.5.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-common-0.1.7\",\n sha256 = \"78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-common/0.1.7/download\"],\n strip_prefix = \"crypto-common-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.crypto-common-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-common-0.2.2\",\n sha256 = \"ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-common/0.2.2/download\"],\n strip_prefix = \"crypto-common-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.crypto-common-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ctor-1.0.12\",\n sha256 = \"2d83cb7e7a873830708d6b02a78cd36a592c6fa14bf267b68725103b85c0d77f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ctor/1.0.12/download\"],\n strip_prefix = \"ctor-1.0.12\",\n build_file = Label(\"@crates//crates:BUILD.ctor-1.0.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ctr-0.9.2\",\n sha256 = \"0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ctr/0.9.2/download\"],\n strip_prefix = \"ctr-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.ctr-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__curve25519-dalek-4.1.3\",\n sha256 = \"97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/curve25519-dalek/4.1.3/download\"],\n strip_prefix = \"curve25519-dalek-4.1.3\",\n build_file = Label(\"@crates//crates:BUILD.curve25519-dalek-4.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__curve25519-dalek-derive-0.1.1\",\n sha256 = \"f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/curve25519-dalek-derive/0.1.1/download\"],\n strip_prefix = \"curve25519-dalek-derive-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.curve25519-dalek-derive-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling-0.20.11\",\n sha256 = \"fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling/0.20.11/download\"],\n strip_prefix = \"darling-0.20.11\",\n build_file = Label(\"@crates//crates:BUILD.darling-0.20.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling-0.23.0\",\n sha256 = \"25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling/0.23.0/download\"],\n strip_prefix = \"darling-0.23.0\",\n build_file = Label(\"@crates//crates:BUILD.darling-0.23.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling_core-0.20.11\",\n sha256 = \"0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling_core/0.20.11/download\"],\n strip_prefix = \"darling_core-0.20.11\",\n build_file = Label(\"@crates//crates:BUILD.darling_core-0.20.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling_core-0.23.0\",\n sha256 = \"9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling_core/0.23.0/download\"],\n strip_prefix = \"darling_core-0.23.0\",\n build_file = Label(\"@crates//crates:BUILD.darling_core-0.23.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling_macro-0.20.11\",\n sha256 = \"fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling_macro/0.20.11/download\"],\n strip_prefix = \"darling_macro-0.20.11\",\n build_file = Label(\"@crates//crates:BUILD.darling_macro-0.20.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling_macro-0.23.0\",\n sha256 = \"ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling_macro/0.23.0/download\"],\n strip_prefix = \"darling_macro-0.23.0\",\n build_file = Label(\"@crates//crates:BUILD.darling_macro-0.23.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dashmap-6.2.1\",\n sha256 = \"e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dashmap/6.2.1/download\"],\n strip_prefix = \"dashmap-6.2.1\",\n build_file = Label(\"@crates//crates:BUILD.dashmap-6.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__data-encoding-2.11.1\",\n sha256 = \"4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/data-encoding/2.11.1/download\"],\n strip_prefix = \"data-encoding-2.11.1\",\n build_file = Label(\"@crates//crates:BUILD.data-encoding-2.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__data-encoding-macro-0.1.21\",\n sha256 = \"c6a127ecbb3c4632e1525380e04c0c3fcf8dcb44d32a79ea290d8a36906edcd8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/data-encoding-macro/0.1.21/download\"],\n strip_prefix = \"data-encoding-macro-0.1.21\",\n build_file = Label(\"@crates//crates:BUILD.data-encoding-macro-0.1.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__data-encoding-macro-internal-0.1.19\",\n sha256 = \"c54e03a951783e8b327515db3f2a2fd0e3bed362a96b066f341ce66ed49b4ead\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/data-encoding-macro-internal/0.1.19/download\"],\n strip_prefix = \"data-encoding-macro-internal-0.1.19\",\n build_file = Label(\"@crates//crates:BUILD.data-encoding-macro-internal-0.1.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__defmt-1.1.1\",\n sha256 = \"e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/defmt/1.1.1/download\"],\n strip_prefix = \"defmt-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.defmt-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__defmt-macros-1.1.1\",\n sha256 = \"bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/defmt-macros/1.1.1/download\"],\n strip_prefix = \"defmt-macros-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.defmt-macros-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__defmt-parser-1.0.0\",\n sha256 = \"10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/defmt-parser/1.0.0/download\"],\n strip_prefix = \"defmt-parser-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.defmt-parser-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__der-0.7.10\",\n sha256 = \"e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/der/0.7.10/download\"],\n strip_prefix = \"der-0.7.10\",\n build_file = Label(\"@crates//crates:BUILD.der-0.7.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__der-parser-9.0.0\",\n sha256 = \"5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/der-parser/9.0.0/download\"],\n strip_prefix = \"der-parser-9.0.0\",\n build_file = Label(\"@crates//crates:BUILD.der-parser-9.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__deranged-0.5.8\",\n sha256 = \"7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/deranged/0.5.8/download\"],\n strip_prefix = \"deranged-0.5.8\",\n build_file = Label(\"@crates//crates:BUILD.deranged-0.5.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__diff-0.1.13\",\n sha256 = \"56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/diff/0.1.13/download\"],\n strip_prefix = \"diff-0.1.13\",\n build_file = Label(\"@crates//crates:BUILD.diff-0.1.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__digest-0.10.7\",\n sha256 = \"9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/digest/0.10.7/download\"],\n strip_prefix = \"digest-0.10.7\",\n build_file = Label(\"@crates//crates:BUILD.digest-0.10.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__digest-0.11.3\",\n sha256 = \"f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/digest/0.11.3/download\"],\n strip_prefix = \"digest-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.digest-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dispatch2-0.3.1\",\n sha256 = \"1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dispatch2/0.3.1/download\"],\n strip_prefix = \"dispatch2-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.dispatch2-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__displaydoc-0.2.7\",\n sha256 = \"c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/displaydoc/0.2.7/download\"],\n strip_prefix = \"displaydoc-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.displaydoc-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dlib-0.5.3\",\n sha256 = \"ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dlib/0.5.3/download\"],\n strip_prefix = \"dlib-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.dlib-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dns-lookup-3.0.1\",\n sha256 = \"6e39034cee21a2f5bbb66ba0e3689819c4bb5d00382a282006e802a7ffa6c41d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dns-lookup/3.0.1/download\"],\n strip_prefix = \"dns-lookup-3.0.1\",\n build_file = Label(\"@crates//crates:BUILD.dns-lookup-3.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__downcast-rs-1.2.1\",\n sha256 = \"75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/downcast-rs/1.2.1/download\"],\n strip_prefix = \"downcast-rs-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.downcast-rs-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-0.14.1\",\n sha256 = \"80bc8c5c6c2941f70a55c15f8d9f00f9710ebda3ffda98075f996a0e6c92756f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm/0.14.1/download\"],\n strip_prefix = \"drm-0.14.1\",\n build_file = Label(\"@crates//crates:BUILD.drm-0.14.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-0.15.0\",\n sha256 = \"7a41816e58f47f49acfd956651055ddcf137c4882c2098c30c448817af21183a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm/0.15.0/download\"],\n strip_prefix = \"drm-0.15.0\",\n build_file = Label(\"@crates//crates:BUILD.drm-0.15.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-ffi-0.9.1\",\n sha256 = \"51a91c9b32ac4e8105dec255e849e0d66e27d7c34d184364fb93e469db08f690\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm-ffi/0.9.1/download\"],\n strip_prefix = \"drm-ffi-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.drm-ffi-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-fourcc-2.2.0\",\n sha256 = \"0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm-fourcc/2.2.0/download\"],\n strip_prefix = \"drm-fourcc-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.drm-fourcc-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-sys-0.8.1\",\n sha256 = \"ecc8e1361066d91f5ffccff060a3c3be9c3ecde15be2959c1937595f7a82a9f8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm-sys/0.8.1/download\"],\n strip_prefix = \"drm-sys-0.8.1\",\n build_file = Label(\"@crates//crates:BUILD.drm-sys-0.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dtls-0.17.2\",\n sha256 = \"01a431e87fc386bd5e02deb554a013f97bc406e47a7d8e97efb7c6366b980e9c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dtls/0.17.2/download\"],\n strip_prefix = \"dtls-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.dtls-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dunce-1.0.5\",\n sha256 = \"92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dunce/1.0.5/download\"],\n strip_prefix = \"dunce-1.0.5\",\n build_file = Label(\"@crates//crates:BUILD.dunce-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dyn-clone-1.0.20\",\n sha256 = \"d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dyn-clone/1.0.20/download\"],\n strip_prefix = \"dyn-clone-1.0.20\",\n build_file = Label(\"@crates//crates:BUILD.dyn-clone-1.0.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ecdsa-0.16.9\",\n sha256 = \"ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ecdsa/0.16.9/download\"],\n strip_prefix = \"ecdsa-0.16.9\",\n build_file = Label(\"@crates//crates:BUILD.ecdsa-0.16.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__either-1.17.0\",\n sha256 = \"9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/either/1.17.0/download\"],\n strip_prefix = \"either-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.either-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__elliptic-curve-0.13.8\",\n sha256 = \"b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/elliptic-curve/0.13.8/download\"],\n strip_prefix = \"elliptic-curve-0.13.8\",\n build_file = Label(\"@crates//crates:BUILD.elliptic-curve-0.13.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__encode_unicode-1.0.0\",\n sha256 = \"34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/encode_unicode/1.0.0/download\"],\n strip_prefix = \"encode_unicode-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.encode_unicode-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__encoding_rs-0.8.35\",\n sha256 = \"75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/encoding_rs/0.8.35/download\"],\n strip_prefix = \"encoding_rs-0.8.35\",\n build_file = Label(\"@crates//crates:BUILD.encoding_rs-0.8.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__encoding_rs_io-0.1.8\",\n sha256 = \"fba3fe847045ecff794b9c138293a80db914678c453ad63fbf0c6a9eb6e00b22\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/encoding_rs_io/0.1.8/download\"],\n strip_prefix = \"encoding_rs_io-0.1.8\",\n build_file = Label(\"@crates//crates:BUILD.encoding_rs_io-0.1.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__endi-1.1.1\",\n sha256 = \"66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/endi/1.1.1/download\"],\n strip_prefix = \"endi-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.endi-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__enigo-0.6.1\",\n sha256 = \"71c6c56e50f7acae2906a0dcbb34529ca647e40421119ad5d12e7f8ba6e50010\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/enigo/0.6.1/download\"],\n strip_prefix = \"enigo-0.6.1\",\n build_file = Label(\"@crates//crates:BUILD.enigo-0.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__enumflags2-0.7.12\",\n sha256 = \"1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/enumflags2/0.7.12/download\"],\n strip_prefix = \"enumflags2-0.7.12\",\n build_file = Label(\"@crates//crates:BUILD.enumflags2-0.7.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__enumflags2_derive-0.7.12\",\n sha256 = \"67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/enumflags2_derive/0.7.12/download\"],\n strip_prefix = \"enumflags2_derive-0.7.12\",\n build_file = Label(\"@crates//crates:BUILD.enumflags2_derive-0.7.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__equivalent-1.0.2\",\n sha256 = \"877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/equivalent/1.0.2/download\"],\n strip_prefix = \"equivalent-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.equivalent-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__errno-0.3.14\",\n sha256 = \"39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/errno/0.3.14/download\"],\n strip_prefix = \"errno-0.3.14\",\n build_file = Label(\"@crates//crates:BUILD.errno-0.3.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__error-code-3.3.2\",\n sha256 = \"dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/error-code/3.3.2/download\"],\n strip_prefix = \"error-code-3.3.2\",\n build_file = Label(\"@crates//crates:BUILD.error-code-3.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__event-listener-5.4.2\",\n sha256 = \"5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/event-listener/5.4.2/download\"],\n strip_prefix = \"event-listener-5.4.2\",\n build_file = Label(\"@crates//crates:BUILD.event-listener-5.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__event-listener-strategy-0.5.4\",\n sha256 = \"8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/event-listener-strategy/0.5.4/download\"],\n strip_prefix = \"event-listener-strategy-0.5.4\",\n build_file = Label(\"@crates//crates:BUILD.event-listener-strategy-0.5.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__faccess-0.2.4\",\n sha256 = \"59ae66425802d6a903e268ae1a08b8c38ba143520f227a205edf4e9c7e3e26d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/faccess/0.2.4/download\"],\n strip_prefix = \"faccess-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.faccess-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fancy-regex-0.16.2\",\n sha256 = \"998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fancy-regex/0.16.2/download\"],\n strip_prefix = \"fancy-regex-0.16.2\",\n build_file = Label(\"@crates//crates:BUILD.fancy-regex-0.16.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fancy-regex-0.17.0\",\n sha256 = \"72cf461f865c862bb7dc573f643dd6a2b6842f7c30b07882b56bd148cc2761b8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fancy-regex/0.17.0/download\"],\n strip_prefix = \"fancy-regex-0.17.0\",\n build_file = Label(\"@crates//crates:BUILD.fancy-regex-0.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fancy-regex-0.18.0\",\n sha256 = \"e1e1dacd0d2082dfcf1351c4bdd566bbe89a2b263235a2b50058f1e130a47277\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fancy-regex/0.18.0/download\"],\n strip_prefix = \"fancy-regex-0.18.0\",\n build_file = Label(\"@crates//crates:BUILD.fancy-regex-0.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fastrand-2.5.0\",\n sha256 = \"da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fastrand/2.5.0/download\"],\n strip_prefix = \"fastrand-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.fastrand-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fax-0.2.7\",\n sha256 = \"caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fax/0.2.7/download\"],\n strip_prefix = \"fax-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.fax-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fdeflate-0.3.7\",\n sha256 = \"1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fdeflate/0.3.7/download\"],\n strip_prefix = \"fdeflate-0.3.7\",\n build_file = Label(\"@crates//crates:BUILD.fdeflate-0.3.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ff-0.13.1\",\n sha256 = \"c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ff/0.13.1/download\"],\n strip_prefix = \"ff-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.ff-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fiat-crypto-0.2.9\",\n sha256 = \"28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fiat-crypto/0.2.9/download\"],\n strip_prefix = \"fiat-crypto-0.2.9\",\n build_file = Label(\"@crates//crates:BUILD.fiat-crypto-0.2.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__filedescriptor-0.8.3\",\n sha256 = \"e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/filedescriptor/0.8.3/download\"],\n strip_prefix = \"filedescriptor-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.filedescriptor-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__filetime-0.2.29\",\n sha256 = \"5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/filetime/0.2.29/download\"],\n strip_prefix = \"filetime-0.2.29\",\n build_file = Label(\"@crates//crates:BUILD.filetime-0.2.29.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__find-msvc-tools-0.1.10\",\n sha256 = \"26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/find-msvc-tools/0.1.10/download\"],\n strip_prefix = \"find-msvc-tools-0.1.10\",\n build_file = Label(\"@crates//crates:BUILD.find-msvc-tools-0.1.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fixed_decimal-0.7.2\",\n sha256 = \"79c3c892f121fff406e5dd6b28c1b30096b95111c30701a899d4f2b18da6d1bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fixed_decimal/0.7.2/download\"],\n strip_prefix = \"fixed_decimal-0.7.2\",\n build_file = Label(\"@crates//crates:BUILD.fixed_decimal-0.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fixedbitset-0.5.7\",\n sha256 = \"1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fixedbitset/0.5.7/download\"],\n strip_prefix = \"fixedbitset-0.5.7\",\n build_file = Label(\"@crates//crates:BUILD.fixedbitset-0.5.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__flate2-1.1.9\",\n sha256 = \"843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/flate2/1.1.9/download\"],\n strip_prefix = \"flate2-1.1.9\",\n build_file = Label(\"@crates//crates:BUILD.flate2-1.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fluent-0.17.0\",\n sha256 = \"8137a6d5a2c50d6b0ebfcb9aaa91a28154e0a70605f112d30cb0cd4a78670477\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fluent/0.17.0/download\"],\n strip_prefix = \"fluent-0.17.0\",\n build_file = Label(\"@crates//crates:BUILD.fluent-0.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fluent-bundle-0.16.0\",\n sha256 = \"01203cb8918f5711e73891b347816d932046f95f54207710bda99beaeb423bf4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fluent-bundle/0.16.0/download\"],\n strip_prefix = \"fluent-bundle-0.16.0\",\n build_file = Label(\"@crates//crates:BUILD.fluent-bundle-0.16.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fluent-langneg-0.13.1\",\n sha256 = \"7eebbe59450baee8282d71676f3bfed5689aeab00b27545e83e5f14b1195e8b0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fluent-langneg/0.13.1/download\"],\n strip_prefix = \"fluent-langneg-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.fluent-langneg-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fluent-syntax-0.12.0\",\n sha256 = \"54f0d287c53ffd184d04d8677f590f4ac5379785529e5e08b1c8083acdd5c198\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fluent-syntax/0.12.0/download\"],\n strip_prefix = \"fluent-syntax-0.12.0\",\n build_file = Label(\"@crates//crates:BUILD.fluent-syntax-0.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__flume-0.11.1\",\n sha256 = \"da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/flume/0.11.1/download\"],\n strip_prefix = \"flume-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.flume-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fnv-1.0.7\",\n sha256 = \"3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fnv/1.0.7/download\"],\n strip_prefix = \"fnv-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.fnv-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foldhash-0.1.5\",\n sha256 = \"d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foldhash/0.1.5/download\"],\n strip_prefix = \"foldhash-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.foldhash-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foldhash-0.2.0\",\n sha256 = \"77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foldhash/0.2.0/download\"],\n strip_prefix = \"foldhash-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.foldhash-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fontdue-0.9.4\",\n sha256 = \"7894823fa221401399e2598f8b63f81ac77ff5c63248b7656779bff1632d7d3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fontdue/0.9.4/download\"],\n strip_prefix = \"fontdue-0.9.4\",\n build_file = Label(\"@crates//crates:BUILD.fontdue-0.9.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foreign-types-0.5.0\",\n sha256 = \"d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foreign-types/0.5.0/download\"],\n strip_prefix = \"foreign-types-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.foreign-types-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foreign-types-macros-0.2.4\",\n sha256 = \"ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foreign-types-macros/0.2.4/download\"],\n strip_prefix = \"foreign-types-macros-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.foreign-types-macros-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foreign-types-shared-0.3.1\",\n sha256 = \"aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foreign-types-shared/0.3.1/download\"],\n strip_prefix = \"foreign-types-shared-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.foreign-types-shared-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__form_urlencoded-1.2.2\",\n sha256 = \"cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/form_urlencoded/1.2.2/download\"],\n strip_prefix = \"form_urlencoded-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.form_urlencoded-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fs_extra-1.3.0\",\n sha256 = \"42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fs_extra/1.3.0/download\"],\n strip_prefix = \"fs_extra-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fs_extra-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fsevent-sys-4.1.0\",\n sha256 = \"76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fsevent-sys/4.1.0/download\"],\n strip_prefix = \"fsevent-sys-4.1.0\",\n build_file = Label(\"@crates//crates:BUILD.fsevent-sys-4.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__funty-2.0.0\",\n sha256 = \"e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/funty/2.0.0/download\"],\n strip_prefix = \"funty-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.funty-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-0.3.33\",\n sha256 = \"a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures/0.3.33/download\"],\n strip_prefix = \"futures-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-channel-0.3.33\",\n sha256 = \"262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-channel/0.3.33/download\"],\n strip_prefix = \"futures-channel-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-channel-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-core-0.3.33\",\n sha256 = \"2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-core/0.3.33/download\"],\n strip_prefix = \"futures-core-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-core-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-executor-0.3.33\",\n sha256 = \"6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-executor/0.3.33/download\"],\n strip_prefix = \"futures-executor-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-executor-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-io-0.3.33\",\n sha256 = \"4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-io/0.3.33/download\"],\n strip_prefix = \"futures-io-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-io-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-lite-2.6.1\",\n sha256 = \"f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-lite/2.6.1/download\"],\n strip_prefix = \"futures-lite-2.6.1\",\n build_file = Label(\"@crates//crates:BUILD.futures-lite-2.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-macro-0.3.33\",\n sha256 = \"2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-macro/0.3.33/download\"],\n strip_prefix = \"futures-macro-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-macro-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-sink-0.3.33\",\n sha256 = \"e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-sink/0.3.33/download\"],\n strip_prefix = \"futures-sink-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-sink-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-task-0.3.33\",\n sha256 = \"b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-task/0.3.33/download\"],\n strip_prefix = \"futures-task-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-task-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-timer-3.0.4\",\n sha256 = \"af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-timer/3.0.4/download\"],\n strip_prefix = \"futures-timer-3.0.4\",\n build_file = Label(\"@crates//crates:BUILD.futures-timer-3.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-util-0.3.33\",\n sha256 = \"a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-util/0.3.33/download\"],\n strip_prefix = \"futures-util-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-util-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gbm-0.18.0\",\n sha256 = \"ce852e998d3ca5e4a97014fb31c940dc5ef344ec7d364984525fd11e8a547e6a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gbm/0.18.0/download\"],\n strip_prefix = \"gbm-0.18.0\",\n build_file = Label(\"@crates//crates:BUILD.gbm-0.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gbm-sys-0.4.0\",\n sha256 = \"c13a5f2acc785d8fb6bf6b7ab6bfb0ef5dad4f4d97e8e70bb8e470722312f76f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gbm-sys/0.4.0/download\"],\n strip_prefix = \"gbm-sys-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.gbm-sys-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__generic-array-0.14.7\",\n sha256 = \"85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/generic-array/0.14.7/download\"],\n strip_prefix = \"generic-array-0.14.7\",\n build_file = Label(\"@crates//crates:BUILD.generic-array-0.14.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gethostname-1.1.0\",\n sha256 = \"1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gethostname/1.1.0/download\"],\n strip_prefix = \"gethostname-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.gethostname-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.2.17\",\n sha256 = \"ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.2.17/download\"],\n strip_prefix = \"getrandom-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.3.4\",\n sha256 = \"899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.3.4/download\"],\n strip_prefix = \"getrandom-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.4.3\",\n sha256 = \"300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.4.3/download\"],\n strip_prefix = \"getrandom-0.4.3\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.4.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ghash-0.5.1\",\n sha256 = \"f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ghash/0.5.1/download\"],\n strip_prefix = \"ghash-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.ghash-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gif-0.14.2\",\n sha256 = \"ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gif/0.14.2/download\"],\n strip_prefix = \"gif-0.14.2\",\n build_file = Label(\"@crates//crates:BUILD.gif-0.14.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gl-0.14.0\",\n sha256 = \"a94edab108827d67608095e269cf862e60d920f144a5026d3dbcfd8b877fb404\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gl/0.14.0/download\"],\n strip_prefix = \"gl-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.gl-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gl_generator-0.14.0\",\n sha256 = \"1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gl_generator/0.14.0/download\"],\n strip_prefix = \"gl_generator-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.gl_generator-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__glob-0.3.4\",\n sha256 = \"e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/glob/0.3.4/download\"],\n strip_prefix = \"glob-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.glob-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__globset-0.4.20\",\n sha256 = \"07c34a9410465b45bd9787443bc7370f37735bad04b0f0cd57ff1a3186c98988\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/globset/0.4.20/download\"],\n strip_prefix = \"globset-0.4.20\",\n build_file = Label(\"@crates//crates:BUILD.globset-0.4.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-cli-0.1.12\",\n sha256 = \"cf32d263c5d5cc2a23ce587097f5ddafdb188492ba2e6fb638eaccdc22453631\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-cli/0.1.12/download\"],\n strip_prefix = \"grep-cli-0.1.12\",\n build_file = Label(\"@crates//crates:BUILD.grep-cli-0.1.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-matcher-0.1.9\",\n sha256 = \"f9417543f4870fc8f1c8e1af870afae2431007626d9e703fce6471c468d33847\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-matcher/0.1.9/download\"],\n strip_prefix = \"grep-matcher-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.grep-matcher-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-pcre2-0.1.10\",\n sha256 = \"b752bb6f57dd3716e55b63a33ca05b5825c3d66cd427468874a5564af6ca365c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-pcre2/0.1.10/download\"],\n strip_prefix = \"grep-pcre2-0.1.10\",\n build_file = Label(\"@crates//crates:BUILD.grep-pcre2-0.1.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-printer-0.3.1\",\n sha256 = \"fd76035e87871f51c1ee5b793e32122b3ccf9c692662d9622ef1686ff5321acb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-printer/0.3.1/download\"],\n strip_prefix = \"grep-printer-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.grep-printer-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-regex-0.1.14\",\n sha256 = \"0ce0c256c3ad82bcc07b812c15a45ec1d398122e8e15124f96695234db7112ef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-regex/0.1.14/download\"],\n strip_prefix = \"grep-regex-0.1.14\",\n build_file = Label(\"@crates//crates:BUILD.grep-regex-0.1.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-searcher-0.1.17\",\n sha256 = \"72348823a0eafc4bc2e9051064f28b5b42cc100b571b3a35d67918d711efcbc6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-searcher/0.1.17/download\"],\n strip_prefix = \"grep-searcher-0.1.17\",\n build_file = Label(\"@crates//crates:BUILD.grep-searcher-0.1.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__group-0.13.0\",\n sha256 = \"f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/group/0.13.0/download\"],\n strip_prefix = \"group-0.13.0\",\n build_file = Label(\"@crates//crates:BUILD.group-0.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__half-2.7.1\",\n sha256 = \"6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/half/2.7.1/download\"],\n strip_prefix = \"half-2.7.1\",\n build_file = Label(\"@crates//crates:BUILD.half-2.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.14.5\",\n sha256 = \"e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.14.5/download\"],\n strip_prefix = \"hashbrown-0.14.5\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.14.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.15.5\",\n sha256 = \"9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.15.5/download\"],\n strip_prefix = \"hashbrown-0.15.5\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.15.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.16.1\",\n sha256 = \"841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.16.1/download\"],\n strip_prefix = \"hashbrown-0.16.1\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.16.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.17.1\",\n sha256 = \"ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.17.1/download\"],\n strip_prefix = \"hashbrown-0.17.1\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.17.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__heck-0.5.0\",\n sha256 = \"2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/heck/0.5.0/download\"],\n strip_prefix = \"heck-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.heck-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hermit-abi-0.5.2\",\n sha256 = \"fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hermit-abi/0.5.2/download\"],\n strip_prefix = \"hermit-abi-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.hermit-abi-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hex-0.4.3\",\n sha256 = \"7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hex/0.4.3/download\"],\n strip_prefix = \"hex-0.4.3\",\n build_file = Label(\"@crates//crates:BUILD.hex-0.4.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hifijson-0.2.3\",\n sha256 = \"0a7763b98ba8a24f59e698bf9ab197e7676c640d6455d1580b4ce7dc560f0f0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hifijson/0.2.3/download\"],\n strip_prefix = \"hifijson-0.2.3\",\n build_file = Label(\"@crates//crates:BUILD.hifijson-0.2.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hkdf-0.12.4\",\n sha256 = \"7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hkdf/0.12.4/download\"],\n strip_prefix = \"hkdf-0.12.4\",\n build_file = Label(\"@crates//crates:BUILD.hkdf-0.12.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hmac-0.12.1\",\n sha256 = \"6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hmac/0.12.1/download\"],\n strip_prefix = \"hmac-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.hmac-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hostname-0.4.2\",\n sha256 = \"617aaa3557aef3810a6369d0a99fac8a080891b68bd9f9812a1eeda0c0730cbd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hostname/0.4.2/download\"],\n strip_prefix = \"hostname-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.hostname-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__html-escape-0.2.15\",\n sha256 = \"c9356095b4b41197bba32173600e1582792cda618f65d12f68e2e77d273413c5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/html-escape/0.2.15/download\"],\n strip_prefix = \"html-escape-0.2.15\",\n build_file = Label(\"@crates//crates:BUILD.html-escape-0.2.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__html-to-markdown-rs-3.10.6\",\n sha256 = \"e0736be7417aaf65e02124703aa8db88ad42ceff95df99783d0d48bbed4da3a8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/html-to-markdown-rs/3.10.6/download\"],\n strip_prefix = \"html-to-markdown-rs-3.10.6\",\n build_file = Label(\"@crates//crates:BUILD.html-to-markdown-rs-3.10.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__html5ever-0.39.0\",\n sha256 = \"46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/html5ever/0.39.0/download\"],\n strip_prefix = \"html5ever-0.39.0\",\n build_file = Label(\"@crates//crates:BUILD.html5ever-0.39.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hybrid-array-0.4.14\",\n sha256 = \"707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hybrid-array/0.4.14/download\"],\n strip_prefix = \"hybrid-array-0.4.14\",\n build_file = Label(\"@crates//crates:BUILD.hybrid-array-0.4.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__iana-time-zone-0.1.65\",\n sha256 = \"e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/iana-time-zone/0.1.65/download\"],\n strip_prefix = \"iana-time-zone-0.1.65\",\n build_file = Label(\"@crates//crates:BUILD.iana-time-zone-0.1.65.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__iana-time-zone-haiku-0.1.2\",\n sha256 = \"f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/iana-time-zone-haiku/0.1.2/download\"],\n strip_prefix = \"iana-time-zone-haiku-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.iana-time-zone-haiku-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_calendar-2.2.1\",\n sha256 = \"a2b2acc6263f494f1df50685b53ff8e57869e47d5c6fe39c23d518ae9a4f3e45\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_calendar/2.2.1/download\"],\n strip_prefix = \"icu_calendar-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_calendar-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_calendar_data-2.2.0\",\n sha256 = \"118577bcf3a0fa7c6ac0a7d6e951814da84ee56b9b1f68fb4d8d10b08cefaf4d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_calendar_data/2.2.0/download\"],\n strip_prefix = \"icu_calendar_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_calendar_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collator-2.2.1\",\n sha256 = \"8bbdf98e5e0aa827770acee171ebb568aaab975a36b56afdb5fd0e2f525750bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collator/2.2.1/download\"],\n strip_prefix = \"icu_collator-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_collator-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collator_data-2.2.0\",\n sha256 = \"038ed8e5817f2059c2f3efb0945ba78d060d3d25e8f1a1bea5139f821a21a2f0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collator_data/2.2.0/download\"],\n strip_prefix = \"icu_collator_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_collator_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collections-2.2.0\",\n sha256 = \"2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collections/2.2.0/download\"],\n strip_prefix = \"icu_collections-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_collections-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_datetime-2.2.0\",\n sha256 = \"989d56ea5bbc43ae2b4e0388874b002884eaf4ed3a76c84a6c8c5ad575e04d72\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_datetime/2.2.0/download\"],\n strip_prefix = \"icu_datetime-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_datetime-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_datetime_data-2.2.0\",\n sha256 = \"40d3cc1b690d9703202bc319692ac8a1f3a6390686f0930ff40542450fa34f0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_datetime_data/2.2.0/download\"],\n strip_prefix = \"icu_datetime_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_datetime_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_decimal-2.2.0\",\n sha256 = \"288247df2e32aa776ac54fdd64de552149ac43cb840f2761811f0e8d09719dd4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_decimal/2.2.0/download\"],\n strip_prefix = \"icu_decimal-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_decimal-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_decimal_data-2.2.0\",\n sha256 = \"6f14a5ca9e8af29eef62064f269078424283d90dbaffeac5225addf62aaabc22\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_decimal_data/2.2.0/download\"],\n strip_prefix = \"icu_decimal_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_decimal_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale-2.2.0\",\n sha256 = \"d5a396343c7208121dc86e35623d3dfe19814a7613cfd14964994cdc9c9a2e26\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale/2.2.0/download\"],\n strip_prefix = \"icu_locale-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale_core-2.2.0\",\n sha256 = \"92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale_core/2.2.0/download\"],\n strip_prefix = \"icu_locale_core-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale_core-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale_data-2.2.0\",\n sha256 = \"d5fdcc9ac77c6d74ff5cf6e65ef3181d6af32003b16fce3a77fb451d2f695993\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale_data/2.2.0/download\"],\n strip_prefix = \"icu_locale_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer-2.2.0\",\n sha256 = \"c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer/2.2.0/download\"],\n strip_prefix = \"icu_normalizer-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer_data-2.2.0\",\n sha256 = \"da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer_data/2.2.0/download\"],\n strip_prefix = \"icu_normalizer_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_pattern-0.4.2\",\n sha256 = \"1c4c568054ffe735398a9f4c55aec37ad7c768844553cc0978f09cc9b933a1fb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_pattern/0.4.2/download\"],\n strip_prefix = \"icu_pattern-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.icu_pattern-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_plurals-2.2.0\",\n sha256 = \"2a50023f1d49ad5c4333380328a0d4a19e4b9d6d842ec06639affd5ba47c8103\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_plurals/2.2.0/download\"],\n strip_prefix = \"icu_plurals-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_plurals-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_plurals_data-2.2.0\",\n sha256 = \"8485497155dc865f901decb93ecc20d3e467df67bfeceb91e3ba34e2b11e8e1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_plurals_data/2.2.0/download\"],\n strip_prefix = \"icu_plurals_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_plurals_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties-2.2.0\",\n sha256 = \"bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties/2.2.0/download\"],\n strip_prefix = \"icu_properties-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties_data-2.2.0\",\n sha256 = \"8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties_data/2.2.0/download\"],\n strip_prefix = \"icu_properties_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_provider-2.2.0\",\n sha256 = \"139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_provider/2.2.0/download\"],\n strip_prefix = \"icu_provider-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_provider-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_time-2.2.0\",\n sha256 = \"ec3af0c141da0a61d4f6970cd1d5f4b388b17ea22f8124f8f6049d3d5147586a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_time/2.2.0/download\"],\n strip_prefix = \"icu_time-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_time-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_time_data-2.2.1\",\n sha256 = \"2e0ee79a0bb29772465234bfbad6ea04fbc5220bef9fa4f318cc53eb8897070e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_time_data/2.2.1/download\"],\n strip_prefix = \"icu_time_data-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_time_data-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icy_sixel-0.5.0\",\n sha256 = \"85518b9086bf01117761b90e7691c0ef3236fa8adfb1fb44dd248fe5f87215d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icy_sixel/0.5.0/download\"],\n strip_prefix = \"icy_sixel-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.icy_sixel-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ident_case-1.0.1\",\n sha256 = \"b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ident_case/1.0.1/download\"],\n strip_prefix = \"ident_case-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.ident_case-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna-1.1.0\",\n sha256 = \"3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna/1.1.0/download\"],\n strip_prefix = \"idna-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.idna-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna_adapter-1.2.2\",\n sha256 = \"cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna_adapter/1.2.2/download\"],\n strip_prefix = \"idna_adapter-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.idna_adapter-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ignore-0.4.33\",\n sha256 = \"00b69833ed729dc5aa7d19541d96d6cf8e9137194207a04916d658e43168402f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ignore/0.4.33/download\"],\n strip_prefix = \"ignore-0.4.33\",\n build_file = Label(\"@crates//crates:BUILD.ignore-0.4.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__image-0.25.10\",\n sha256 = \"85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/image/0.25.10/download\"],\n strip_prefix = \"image-0.25.10\",\n build_file = Label(\"@crates//crates:BUILD.image-0.25.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__image-webp-0.2.4\",\n sha256 = \"525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/image-webp/0.2.4/download\"],\n strip_prefix = \"image-webp-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.image-webp-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indenter-0.3.4\",\n sha256 = \"964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indenter/0.3.4/download\"],\n strip_prefix = \"indenter-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.indenter-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indexmap-2.14.0\",\n sha256 = \"d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indexmap/2.14.0/download\"],\n strip_prefix = \"indexmap-2.14.0\",\n build_file = Label(\"@crates//crates:BUILD.indexmap-2.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indicatif-0.18.6\",\n sha256 = \"9433806cd6b4ec1aba79c021c7e4c58fb4c3b9977c085062e611ac929998fb0c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indicatif/0.18.6/download\"],\n strip_prefix = \"indicatif-0.18.6\",\n build_file = Label(\"@crates//crates:BUILD.indicatif-0.18.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inferno-0.12.8\",\n sha256 = \"0c460d4fa06223667240720ab69a8045133755ae6dfbe100cf481b95e3a014f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inferno/0.12.8/download\"],\n strip_prefix = \"inferno-0.12.8\",\n build_file = Label(\"@crates//crates:BUILD.inferno-0.12.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inherent-1.0.14\",\n sha256 = \"bee2c455ca60511a054699102d40ce7153621cb2429558f9eaa600e4499b5984\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inherent/1.0.14/download\"],\n strip_prefix = \"inherent-1.0.14\",\n build_file = Label(\"@crates//crates:BUILD.inherent-1.0.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inotify-0.11.4\",\n sha256 = \"153be1941a183ec9ccd095ddbe17a8b8d435ef6c76e9e02451b933c3999af2c8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inotify/0.11.4/download\"],\n strip_prefix = \"inotify-0.11.4\",\n build_file = Label(\"@crates//crates:BUILD.inotify-0.11.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inotify-sys-0.1.8\",\n sha256 = \"c033f80b2c113cdf91ab7a33faa9cbc014726dcad99880c8609af2a370edf37d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inotify-sys/0.1.8/download\"],\n strip_prefix = \"inotify-sys-0.1.8\",\n build_file = Label(\"@crates//crates:BUILD.inotify-sys-0.1.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inout-0.1.4\",\n sha256 = \"879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inout/0.1.4/download\"],\n strip_prefix = \"inout-0.1.4\",\n build_file = Label(\"@crates//crates:BUILD.inout-0.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__insta-1.48.0\",\n sha256 = \"86f0f8fee8c926415c58d6ae43a08523a26faccb2323f5e6b644fe7dd4ef6b82\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/insta/1.48.0/download\"],\n strip_prefix = \"insta-1.48.0\",\n build_file = Label(\"@crates//crates:BUILD.insta-1.48.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__interceptor-0.17.2\",\n sha256 = \"88c11a956a48159f7fe539b8198f12b4db9b709ae5f94385b840db38f97fed74\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/interceptor/0.17.2/download\"],\n strip_prefix = \"interceptor-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.interceptor-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__intl-memoizer-0.5.3\",\n sha256 = \"310da2e345f5eb861e7a07ee182262e94975051db9e4223e909ba90f392f163f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/intl-memoizer/0.5.3/download\"],\n strip_prefix = \"intl-memoizer-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.intl-memoizer-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__intl_pluralrules-7.0.2\",\n sha256 = \"078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/intl_pluralrules/7.0.2/download\"],\n strip_prefix = \"intl_pluralrules-7.0.2\",\n build_file = Label(\"@crates//crates:BUILD.intl_pluralrules-7.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ipnet-2.12.1\",\n sha256 = \"6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ipnet/2.12.1/download\"],\n strip_prefix = \"ipnet-2.12.1\",\n build_file = Label(\"@crates//crates:BUILD.ipnet-2.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__is_terminal_polyfill-1.70.2\",\n sha256 = \"a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/is_terminal_polyfill/1.70.2/download\"],\n strip_prefix = \"is_terminal_polyfill-1.70.2\",\n build_file = Label(\"@crates//crates:BUILD.is_terminal_polyfill-1.70.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.13.0\",\n sha256 = \"413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.13.0/download\"],\n strip_prefix = \"itertools-0.13.0\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.14.0\",\n sha256 = \"2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.14.0/download\"],\n strip_prefix = \"itertools-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itoa-1.0.18\",\n sha256 = \"8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itoa/1.0.18/download\"],\n strip_prefix = \"itoa-1.0.18\",\n build_file = Label(\"@crates//crates:BUILD.itoa-1.0.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jaq-core-2.2.1\",\n sha256 = \"77526a72eb79412c29fd141767a6549bbfcb1cb40e00556fe16532d5e878e098\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jaq-core/2.2.1/download\"],\n strip_prefix = \"jaq-core-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.jaq-core-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jaq-json-1.1.3\",\n sha256 = \"01dbdbd07b076e8403abac68ce7744d93e2ecd953bbc44bf77bf00e1e81172bc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jaq-json/1.1.3/download\"],\n strip_prefix = \"jaq-json-1.1.3\",\n build_file = Label(\"@crates//crates:BUILD.jaq-json-1.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jaq-std-2.1.2\",\n sha256 = \"2c264fe397c981705976c71f1bfe020382b9eda52ae950e57fe885e147bdd67d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jaq-std/2.1.2/download\"],\n strip_prefix = \"jaq-std-2.1.2\",\n build_file = Label(\"@crates//crates:BUILD.jaq-std-2.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-0.2.35\",\n sha256 = \"668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff/0.2.35/download\"],\n strip_prefix = \"jiff-0.2.35\",\n build_file = Label(\"@crates//crates:BUILD.jiff-0.2.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-core-0.1.0\",\n sha256 = \"7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-core/0.1.0/download\"],\n strip_prefix = \"jiff-core-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.jiff-core-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-icu-0.2.2\",\n sha256 = \"0e67c2beaae8b10a82d849b9aabb698a43a682f32b17bcdc035d5ecadb44d646\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-icu/0.2.2/download\"],\n strip_prefix = \"jiff-icu-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.jiff-icu-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-static-0.2.35\",\n sha256 = \"3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-static/0.2.35/download\"],\n strip_prefix = \"jiff-static-0.2.35\",\n build_file = Label(\"@crates//crates:BUILD.jiff-static-0.2.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-tzdb-0.1.8\",\n sha256 = \"142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-tzdb/0.1.8/download\"],\n strip_prefix = \"jiff-tzdb-0.1.8\",\n build_file = Label(\"@crates//crates:BUILD.jiff-tzdb-0.1.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-tzdb-platform-0.1.3\",\n sha256 = \"875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-tzdb-platform/0.1.3/download\"],\n strip_prefix = \"jiff-tzdb-platform-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.jiff-tzdb-platform-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jobserver-0.1.35\",\n sha256 = \"1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jobserver/0.1.35/download\"],\n strip_prefix = \"jobserver-0.1.35\",\n build_file = Label(\"@crates//crates:BUILD.jobserver-0.1.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__js-sys-0.3.103\",\n sha256 = \"53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/js-sys/0.3.103/download\"],\n strip_prefix = \"js-sys-0.3.103\",\n build_file = Label(\"@crates//crates:BUILD.js-sys-0.3.103.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__keccak-0.1.6\",\n sha256 = \"cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/keccak/0.1.6/download\"],\n strip_prefix = \"keccak-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.keccak-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__khronos-egl-6.0.0\",\n sha256 = \"6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/khronos-egl/6.0.0/download\"],\n strip_prefix = \"khronos-egl-6.0.0\",\n build_file = Label(\"@crates//crates:BUILD.khronos-egl-6.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__khronos_api-3.1.0\",\n sha256 = \"e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/khronos_api/3.1.0/download\"],\n strip_prefix = \"khronos_api-3.1.0\",\n build_file = Label(\"@crates//crates:BUILD.khronos_api-3.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__kqueue-1.2.1\",\n sha256 = \"8d763e5b24120b4ddf50de6c92308156765aabfbbccebf401da7cff2d70a41ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/kqueue/1.2.1/download\"],\n strip_prefix = \"kqueue-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.kqueue-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__kqueue-sys-1.1.2\",\n sha256 = \"07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/kqueue-sys/1.1.2/download\"],\n strip_prefix = \"kqueue-sys-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.kqueue-sys-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lazy_static-1.5.0\",\n sha256 = \"bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lazy_static/1.5.0/download\"],\n strip_prefix = \"lazy_static-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.lazy_static-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libc-0.2.189\",\n sha256 = \"3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libc/0.2.189/download\"],\n strip_prefix = \"libc-0.2.189\",\n build_file = Label(\"@crates//crates:BUILD.libc-0.2.189.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libloading-0.8.9\",\n sha256 = \"d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libloading/0.8.9/download\"],\n strip_prefix = \"libloading-0.8.9\",\n build_file = Label(\"@crates//crates:BUILD.libloading-0.8.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libloading-0.9.0\",\n sha256 = \"754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libloading/0.9.0/download\"],\n strip_prefix = \"libloading-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.libloading-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libm-0.2.16\",\n sha256 = \"b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libm/0.2.16/download\"],\n strip_prefix = \"libm-0.2.16\",\n build_file = Label(\"@crates//crates:BUILD.libm-0.2.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libredox-0.1.19\",\n sha256 = \"2026a5056764a10b2bf5d56488cba40da507f5493a6a429340e2004d9ed085fa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libredox/0.1.19/download\"],\n strip_prefix = \"libredox-0.1.19\",\n build_file = Label(\"@crates//crates:BUILD.libredox-0.1.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libspa-0.9.2\",\n sha256 = \"b6b8cfa2a7656627b4c92c6b9ef929433acd673d5ab3708cda1b18478ac00df4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libspa/0.9.2/download\"],\n strip_prefix = \"libspa-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.libspa-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libspa-sys-0.9.2\",\n sha256 = \"901049455d2eb6decf9058235d745237952f4804bc584c5fcb41412e6adcc6e0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libspa-sys/0.9.2/download\"],\n strip_prefix = \"libspa-sys-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.libspa-sys-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libwayshot-xcap-0.3.3\",\n sha256 = \"ea8a46e4d016ef464e386e4970f5415fe0939c2d63abe0c2f539c05ef88c5fe5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libwayshot-xcap/0.3.3/download\"],\n strip_prefix = \"libwayshot-xcap-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.libwayshot-xcap-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linked-hash-map-0.5.6\",\n sha256 = \"0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linked-hash-map/0.5.6/download\"],\n strip_prefix = \"linked-hash-map-0.5.6\",\n build_file = Label(\"@crates//crates:BUILD.linked-hash-map-0.5.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.12.1\",\n sha256 = \"32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.12.1/download\"],\n strip_prefix = \"linux-raw-sys-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.4.15\",\n sha256 = \"d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.4.15/download\"],\n strip_prefix = \"linux-raw-sys-0.4.15\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.4.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.9.4\",\n sha256 = \"cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.9.4/download\"],\n strip_prefix = \"linux-raw-sys-0.9.4\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.9.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__litemap-0.8.2\",\n sha256 = \"92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/litemap/0.8.2/download\"],\n strip_prefix = \"litemap-0.8.2\",\n build_file = Label(\"@crates//crates:BUILD.litemap-0.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lock_api-0.4.14\",\n sha256 = \"224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lock_api/0.4.14/download\"],\n strip_prefix = \"lock_api-0.4.14\",\n build_file = Label(\"@crates//crates:BUILD.lock_api-0.4.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__log-0.4.33\",\n sha256 = \"0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/log/0.4.33/download\"],\n strip_prefix = \"log-0.4.33\",\n build_file = Label(\"@crates//crates:BUILD.log-0.4.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lru-0.18.2\",\n sha256 = \"5d2f2f9b4ba7e6b24d95e7e899329d35be83bcded72c8540cdd5368932d1d90a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lru/0.18.2/download\"],\n strip_prefix = \"lru-0.18.2\",\n build_file = Label(\"@crates//crates:BUILD.lru-0.18.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lscolors-0.21.0\",\n sha256 = \"d60e266dfb1426eb2d24792602e041131fdc0236bb7007abc0e589acafd60929\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lscolors/0.21.0/download\"],\n strip_prefix = \"lscolors-0.21.0\",\n build_file = Label(\"@crates//crates:BUILD.lscolors-0.21.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__markup5ever-0.39.0\",\n sha256 = \"7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/markup5ever/0.39.0/download\"],\n strip_prefix = \"markup5ever-0.39.0\",\n build_file = Label(\"@crates//crates:BUILD.markup5ever-0.39.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__md-5-0.10.6\",\n sha256 = \"d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/md-5/0.10.6/download\"],\n strip_prefix = \"md-5-0.10.6\",\n build_file = Label(\"@crates//crates:BUILD.md-5-0.10.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memchr-2.8.3\",\n sha256 = \"cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memchr/2.8.3/download\"],\n strip_prefix = \"memchr-2.8.3\",\n build_file = Label(\"@crates//crates:BUILD.memchr-2.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memmap2-0.9.11\",\n sha256 = \"d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memmap2/0.9.11/download\"],\n strip_prefix = \"memmap2-0.9.11\",\n build_file = Label(\"@crates//crates:BUILD.memmap2-0.9.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memoffset-0.7.1\",\n sha256 = \"5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memoffset/0.7.1/download\"],\n strip_prefix = \"memoffset-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.memoffset-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memoffset-0.9.1\",\n sha256 = \"488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memoffset/0.9.1/download\"],\n strip_prefix = \"memoffset-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.memoffset-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__minimal-lexical-0.2.1\",\n sha256 = \"68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/minimal-lexical/0.2.1/download\"],\n strip_prefix = \"minimal-lexical-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.minimal-lexical-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__miniz_oxide-0.8.9\",\n sha256 = \"1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/miniz_oxide/0.8.9/download\"],\n strip_prefix = \"miniz_oxide-0.8.9\",\n build_file = Label(\"@crates//crates:BUILD.miniz_oxide-0.8.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mio-1.2.2\",\n sha256 = \"30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mio/1.2.2/download\"],\n strip_prefix = \"mio-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.mio-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__moxcms-0.8.1\",\n sha256 = \"bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/moxcms/0.8.1/download\"],\n strip_prefix = \"moxcms-0.8.1\",\n build_file = Label(\"@crates//crates:BUILD.moxcms-0.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__munge-0.4.7\",\n sha256 = \"5e17401f259eba956ca16491461b6e8f72913a0a114e39736ce404410f915a0c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/munge/0.4.7/download\"],\n strip_prefix = \"munge-0.4.7\",\n build_file = Label(\"@crates//crates:BUILD.munge-0.4.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__munge_macro-0.4.7\",\n sha256 = \"4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/munge_macro/0.4.7/download\"],\n strip_prefix = \"munge_macro-0.4.7\",\n build_file = Label(\"@crates//crates:BUILD.munge_macro-0.4.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nanorand-0.7.0\",\n sha256 = \"6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nanorand/0.7.0/download\"],\n strip_prefix = \"nanorand-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.nanorand-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-3.12.0\",\n sha256 = \"6f71d6bc097c4a6eb853c3f24991ab8c9f50f57d1f719e305175541482217e36\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi/3.12.0/download\"],\n strip_prefix = \"napi-3.12.0\",\n build_file = Label(\"@crates//crates:BUILD.napi-3.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-build-2.4.0\",\n sha256 = \"5282704fbe8d49b0cf8b08e3f33233416a528658f205c7e5ace63b582de0b11c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi-build/2.4.0/download\"],\n strip_prefix = \"napi-build-2.4.0\",\n build_file = Label(\"@crates//crates:BUILD.napi-build-2.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-derive-3.6.2\",\n sha256 = \"6d9002b2940f0184444754546e0fcd15182f56948e6f381968b019d549387c42\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi-derive/3.6.2/download\"],\n strip_prefix = \"napi-derive-3.6.2\",\n build_file = Label(\"@crates//crates:BUILD.napi-derive-3.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-derive-backend-6.1.1\",\n sha256 = \"d60b5d773ad46c698c8cc2cd9fde0b283d39cbb7f71c04bee633c7bdba4423bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi-derive-backend/6.1.1/download\"],\n strip_prefix = \"napi-derive-backend-6.1.1\",\n build_file = Label(\"@crates//crates:BUILD.napi-derive-backend-6.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-sys-3.3.0\",\n sha256 = \"85fbf1fa9f1babfe396d74bbbf52b3643770243e8f5b0b46715d4caf7f0dfc9a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi-sys/3.3.0/download\"],\n strip_prefix = \"napi-sys-3.3.0\",\n build_file = Label(\"@crates//crates:BUILD.napi-sys-3.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__new_debug_unreachable-1.0.6\",\n sha256 = \"650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/new_debug_unreachable/1.0.6/download\"],\n strip_prefix = \"new_debug_unreachable-1.0.6\",\n build_file = Label(\"@crates//crates:BUILD.new_debug_unreachable-1.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.24.3\",\n sha256 = \"fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.24.3/download\"],\n strip_prefix = \"nix-0.24.3\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.24.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.26.4\",\n sha256 = \"598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.26.4/download\"],\n strip_prefix = \"nix-0.26.4\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.26.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.28.0\",\n sha256 = \"ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.28.0/download\"],\n strip_prefix = \"nix-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.29.0\",\n sha256 = \"71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.29.0/download\"],\n strip_prefix = \"nix-0.29.0\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.29.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.30.1\",\n sha256 = \"74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.30.1/download\"],\n strip_prefix = \"nix-0.30.1\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.30.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.31.3\",\n sha256 = \"cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.31.3/download\"],\n strip_prefix = \"nix-0.31.3\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.31.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nohash-hasher-0.2.0\",\n sha256 = \"2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nohash-hasher/0.2.0/download\"],\n strip_prefix = \"nohash-hasher-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.nohash-hasher-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nom-7.1.3\",\n sha256 = \"d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nom/7.1.3/download\"],\n strip_prefix = \"nom-7.1.3\",\n build_file = Label(\"@crates//crates:BUILD.nom-7.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nom-8.0.0\",\n sha256 = \"df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nom/8.0.0/download\"],\n strip_prefix = \"nom-8.0.0\",\n build_file = Label(\"@crates//crates:BUILD.nom-8.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__normalize-path-0.2.1\",\n sha256 = \"f5438dd2b2ff4c6df6e1ce22d825ed2fa93ee2922235cc45186991717f0a892d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/normalize-path/0.2.1/download\"],\n strip_prefix = \"normalize-path-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.normalize-path-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__notify-8.2.0\",\n sha256 = \"4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/notify/8.2.0/download\"],\n strip_prefix = \"notify-8.2.0\",\n build_file = Label(\"@crates//crates:BUILD.notify-8.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__notify-types-2.1.0\",\n sha256 = \"42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/notify-types/2.1.0/download\"],\n strip_prefix = \"notify-types-2.1.0\",\n build_file = Label(\"@crates//crates:BUILD.notify-types-2.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nu-ansi-term-0.50.3\",\n sha256 = \"7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nu-ansi-term/0.50.3/download\"],\n strip_prefix = \"nu-ansi-term-0.50.3\",\n build_file = Label(\"@crates//crates:BUILD.nu-ansi-term-0.50.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-bigint-0.4.8\",\n sha256 = \"c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-bigint/0.4.8/download\"],\n strip_prefix = \"num-bigint-0.4.8\",\n build_file = Label(\"@crates//crates:BUILD.num-bigint-0.4.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-conv-0.2.2\",\n sha256 = \"521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-conv/0.2.2/download\"],\n strip_prefix = \"num-conv-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.num-conv-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-format-0.4.4\",\n sha256 = \"a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-format/0.4.4/download\"],\n strip_prefix = \"num-format-0.4.4\",\n build_file = Label(\"@crates//crates:BUILD.num-format-0.4.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-integer-0.1.46\",\n sha256 = \"7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-integer/0.1.46/download\"],\n strip_prefix = \"num-integer-0.1.46\",\n build_file = Label(\"@crates//crates:BUILD.num-integer-0.1.46.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-traits-0.2.19\",\n sha256 = \"071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-traits/0.2.19/download\"],\n strip_prefix = \"num-traits-0.2.19\",\n build_file = Label(\"@crates//crates:BUILD.num-traits-0.2.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__number_prefix-0.4.0\",\n sha256 = \"830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/number_prefix/0.4.0/download\"],\n strip_prefix = \"number_prefix-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.number_prefix-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-0.6.4\",\n sha256 = \"3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2/0.6.4/download\"],\n strip_prefix = \"objc2-0.6.4\",\n build_file = Label(\"@crates//crates:BUILD.objc2-0.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-app-kit-0.3.2\",\n sha256 = \"d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-app-kit/0.3.2/download\"],\n strip_prefix = \"objc2-app-kit-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-app-kit-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-application-services-0.3.2\",\n sha256 = \"69282c2b5bc58fba07cb9de2113619532eb551e98efe3d8d695509ef45fbd53b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-application-services/0.3.2/download\"],\n strip_prefix = \"objc2-application-services-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-application-services-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-av-foundation-0.3.2\",\n sha256 = \"478ae33fcac9df0a18db8302387c666b8ef08a3e2d62b510ca4fc278a384b6c0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-av-foundation/0.3.2/download\"],\n strip_prefix = \"objc2-av-foundation-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-av-foundation-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-avf-audio-0.3.2\",\n sha256 = \"13a380031deed8e99db00065c45937da434ca987c034e13b87e4441f9e4090be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-avf-audio/0.3.2/download\"],\n strip_prefix = \"objc2-avf-audio-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-avf-audio-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-cloud-kit-0.3.2\",\n sha256 = \"73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-cloud-kit/0.3.2/download\"],\n strip_prefix = \"objc2-cloud-kit-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-cloud-kit-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-audio-0.3.2\",\n sha256 = \"e1eebcea8b0dbff5f7c8504f3107c68fc061a3eb44932051c8cf8a68d969c3b2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-audio/0.3.2/download\"],\n strip_prefix = \"objc2-core-audio-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-audio-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-audio-types-0.3.2\",\n sha256 = \"5a89f2ec274a0cf4a32642b2991e8b351a404d290da87bb6a9a9d8632490bd1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-audio-types/0.3.2/download\"],\n strip_prefix = \"objc2-core-audio-types-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-audio-types-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-data-0.3.2\",\n sha256 = \"0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-data/0.3.2/download\"],\n strip_prefix = \"objc2-core-data-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-data-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-foundation-0.3.2\",\n sha256 = \"2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-foundation/0.3.2/download\"],\n strip_prefix = \"objc2-core-foundation-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-foundation-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-graphics-0.3.2\",\n sha256 = \"e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-graphics/0.3.2/download\"],\n strip_prefix = \"objc2-core-graphics-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-graphics-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-image-0.3.2\",\n sha256 = \"e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-image/0.3.2/download\"],\n strip_prefix = \"objc2-core-image-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-image-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-media-0.3.2\",\n sha256 = \"05ec576860167a15dd9fce7fbee7512beb4e31f532159d3482d1f9c6caedf31d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-media/0.3.2/download\"],\n strip_prefix = \"objc2-core-media-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-media-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-services-0.3.2\",\n sha256 = \"583300ad934cba24ff5292aee751ecc070f7ca6b39a574cc21b7b5e588e06a0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-services/0.3.2/download\"],\n strip_prefix = \"objc2-core-services-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-services-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-text-0.3.2\",\n sha256 = \"0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-text/0.3.2/download\"],\n strip_prefix = \"objc2-core-text-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-text-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-video-0.3.2\",\n sha256 = \"d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-video/0.3.2/download\"],\n strip_prefix = \"objc2-core-video-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-video-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-encode-4.1.0\",\n sha256 = \"ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-encode/4.1.0/download\"],\n strip_prefix = \"objc2-encode-4.1.0\",\n build_file = Label(\"@crates//crates:BUILD.objc2-encode-4.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-foundation-0.3.2\",\n sha256 = \"e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-foundation/0.3.2/download\"],\n strip_prefix = \"objc2-foundation-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-foundation-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-image-io-0.3.2\",\n sha256 = \"32b0446e98cf4a784cc7a0177715ff317eeaa8463841c616cfc78aa4f953c4ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-image-io/0.3.2/download\"],\n strip_prefix = \"objc2-image-io-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-image-io-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-io-surface-0.3.2\",\n sha256 = \"180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-io-surface/0.3.2/download\"],\n strip_prefix = \"objc2-io-surface-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-io-surface-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-media-toolbox-0.3.2\",\n sha256 = \"edd9fdde720df3da7046bb9097811000c1e7ab5cd579fa89d96b27d56781fb30\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-media-toolbox/0.3.2/download\"],\n strip_prefix = \"objc2-media-toolbox-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-media-toolbox-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-metal-0.3.2\",\n sha256 = \"a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-metal/0.3.2/download\"],\n strip_prefix = \"objc2-metal-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-metal-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-quartz-core-0.3.2\",\n sha256 = \"96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-quartz-core/0.3.2/download\"],\n strip_prefix = \"objc2-quartz-core-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-quartz-core-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-security-0.3.2\",\n sha256 = \"709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-security/0.3.2/download\"],\n strip_prefix = \"objc2-security-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-security-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-system-configuration-0.3.2\",\n sha256 = \"7216bd11cbda54ccabcab84d523dc93b858ec75ecfb3a7d89513fa22464da396\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-system-configuration/0.3.2/download\"],\n strip_prefix = \"objc2-system-configuration-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-system-configuration-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__oid-registry-0.7.1\",\n sha256 = \"a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/oid-registry/0.7.1/download\"],\n strip_prefix = \"oid-registry-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.oid-registry-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell-1.21.4\",\n sha256 = \"9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell/1.21.4/download\"],\n strip_prefix = \"once_cell-1.21.4\",\n build_file = Label(\"@crates//crates:BUILD.once_cell-1.21.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell_polyfill-1.70.2\",\n sha256 = \"384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell_polyfill/1.70.2/download\"],\n strip_prefix = \"once_cell_polyfill-1.70.2\",\n build_file = Label(\"@crates//crates:BUILD.once_cell_polyfill-1.70.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__onig-6.5.3\",\n sha256 = \"0cc3cbf698f9438986c11a880c90a6d04b9de27575afd28bbf45b154b6c709e2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/onig/6.5.3/download\"],\n strip_prefix = \"onig-6.5.3\",\n build_file = Label(\"@crates//crates:BUILD.onig-6.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__onig_sys-69.9.3\",\n sha256 = \"1e68317604e77e53b85896388e1a803c1d21b74c899ec9e5e1112db90735edd7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/onig_sys/69.9.3/download\"],\n strip_prefix = \"onig_sys-69.9.3\",\n build_file = Label(\"@crates//crates:BUILD.onig_sys-69.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__opaque-debug-0.3.1\",\n sha256 = \"c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/opaque-debug/0.3.1/download\"],\n strip_prefix = \"opaque-debug-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.opaque-debug-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__opus-0.3.1\",\n sha256 = \"4d3809943dff6fbad5f0484449ea26bdb9cb7d8efdf26ed50d3c7f227f69eb5c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/opus/0.3.1/download\"],\n strip_prefix = \"opus-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.opus-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ordered-float-5.3.0\",\n sha256 = \"b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ordered-float/5.3.0/download\"],\n strip_prefix = \"ordered-float-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.ordered-float-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ordered-stream-0.2.0\",\n sha256 = \"9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ordered-stream/0.2.0/download\"],\n strip_prefix = \"ordered-stream-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.ordered-stream-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__os_display-0.1.4\",\n sha256 = \"ad5fd71b79026fb918650dde6d125000a233764f1c2f1659a1c71118e33ea08f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/os_display/0.1.4/download\"],\n strip_prefix = \"os_display-0.1.4\",\n build_file = Label(\"@crates//crates:BUILD.os_display-0.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__os_pipe-1.2.3\",\n sha256 = \"7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/os_pipe/1.2.3/download\"],\n strip_prefix = \"os_pipe-1.2.3\",\n build_file = Label(\"@crates//crates:BUILD.os_pipe-1.2.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__outref-0.5.2\",\n sha256 = \"1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/outref/0.5.2/download\"],\n strip_prefix = \"outref-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.outref-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__p256-0.13.2\",\n sha256 = \"c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/p256/0.13.2/download\"],\n strip_prefix = \"p256-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.p256-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__p384-0.13.1\",\n sha256 = \"fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/p384/0.13.1/download\"],\n strip_prefix = \"p384-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.p384-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__palette-0.7.7\",\n sha256 = \"ddeed8580d347d2abf3dcf06a5f0b3dc020258338526b277847cd4248a70fc64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/palette/0.7.7/download\"],\n strip_prefix = \"palette-0.7.7\",\n build_file = Label(\"@crates//crates:BUILD.palette-0.7.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__palette_derive-0.7.7\",\n sha256 = \"88537020289b719d81be994ccf1bbf4990f477e2f69ee52fe3e45f43a02e56be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/palette_derive/0.7.7/download\"],\n strip_prefix = \"palette_derive-0.7.7\",\n build_file = Label(\"@crates//crates:BUILD.palette_derive-0.7.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__palette_math-0.7.7\",\n sha256 = \"6e6eb142958d64335fb0e345c5b9ead2ecd6fc438c307e9d7d3c4fd428dbaf12\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/palette_math/0.7.7/download\"],\n strip_prefix = \"palette_math-0.7.7\",\n build_file = Label(\"@crates//crates:BUILD.palette_math-0.7.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking-2.2.1\",\n sha256 = \"f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking/2.2.1/download\"],\n strip_prefix = \"parking-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.parking-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot-0.12.5\",\n sha256 = \"93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot/0.12.5/download\"],\n strip_prefix = \"parking_lot-0.12.5\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot-0.12.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot_core-0.9.12\",\n sha256 = \"2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot_core/0.9.12/download\"],\n strip_prefix = \"parking_lot_core-0.9.12\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot_core-0.9.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parse_datetime-0.14.0\",\n sha256 = \"413775a7eac2261d2211a79d10ef275e5b6f7b527eec42ad09adce2ffa92b6e5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parse_datetime/0.14.0/download\"],\n strip_prefix = \"parse_datetime-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.parse_datetime-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pcre2-0.2.11\",\n sha256 = \"9e970b0fcce0c7ee6ef662744ff711f21ccd6f11b7cf03cd187a80e89797fc67\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pcre2/0.2.11/download\"],\n strip_prefix = \"pcre2-0.2.11\",\n build_file = Label(\"@crates//crates:BUILD.pcre2-0.2.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pcre2-sys-0.2.10\",\n sha256 = \"18b9073c1a2549bd409bf4a32c94d903bb1a09bf845bc306ae148897fa0760a4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pcre2-sys/0.2.10/download\"],\n strip_prefix = \"pcre2-sys-0.2.10\",\n build_file = Label(\"@crates//crates:BUILD.pcre2-sys-0.2.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__peg-0.8.6\",\n sha256 = \"0aad070be5b63aa72103f2fcdd70a83adbd5e90112ce5b574171ff1c65501773\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/peg/0.8.6/download\"],\n strip_prefix = \"peg-0.8.6\",\n build_file = Label(\"@crates//crates:BUILD.peg-0.8.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__peg-macros-0.8.6\",\n sha256 = \"ddd8ef6825cae95355031ae26a99b616a2a21f22ba2de0197c43dfb05acbe7ee\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/peg-macros/0.8.6/download\"],\n strip_prefix = \"peg-macros-0.8.6\",\n build_file = Label(\"@crates//crates:BUILD.peg-macros-0.8.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__peg-runtime-0.8.6\",\n sha256 = \"7011d97b484a5ebdc4b1fdb3b12d5e4bbbea56e9d22b688f2e79e04b65a7d8a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/peg-runtime/0.8.6/download\"],\n strip_prefix = \"peg-runtime-0.8.6\",\n build_file = Label(\"@crates//crates:BUILD.peg-runtime-0.8.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pem-3.0.6\",\n sha256 = \"1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pem/3.0.6/download\"],\n strip_prefix = \"pem-3.0.6\",\n build_file = Label(\"@crates//crates:BUILD.pem-3.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pem-rfc7468-0.7.0\",\n sha256 = \"88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pem-rfc7468/0.7.0/download\"],\n strip_prefix = \"pem-rfc7468-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.pem-rfc7468-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__percent-encoding-2.3.2\",\n sha256 = \"9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/percent-encoding/2.3.2/download\"],\n strip_prefix = \"percent-encoding-2.3.2\",\n build_file = Label(\"@crates//crates:BUILD.percent-encoding-2.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pest-2.8.8\",\n sha256 = \"7df728be843c7070fab6ab7c328c4e9e9d78e23bf749c0669c86ee7ebfa050a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pest/2.8.8/download\"],\n strip_prefix = \"pest-2.8.8\",\n build_file = Label(\"@crates//crates:BUILD.pest-2.8.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pest_derive-2.8.8\",\n sha256 = \"9e2dd6fc3b26b3462ee188aac870f5a41d398f1cd5e2408d16531bd71c9591fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pest_derive/2.8.8/download\"],\n strip_prefix = \"pest_derive-2.8.8\",\n build_file = Label(\"@crates//crates:BUILD.pest_derive-2.8.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pest_generator-2.8.8\",\n sha256 = \"6a7a9205cfb6f596a9e8b689c0a15f9ceb7a1aafae7aaf788150ac65b29975b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pest_generator/2.8.8/download\"],\n strip_prefix = \"pest_generator-2.8.8\",\n build_file = Label(\"@crates//crates:BUILD.pest_generator-2.8.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pest_meta-2.8.8\",\n sha256 = \"85abd351c0de1e8384fc791a0737111a350394937e92b956b743dac12429f57c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pest_meta/2.8.8/download\"],\n strip_prefix = \"pest_meta-2.8.8\",\n build_file = Label(\"@crates//crates:BUILD.pest_meta-2.8.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__petgraph-0.8.3\",\n sha256 = \"8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/petgraph/0.8.3/download\"],\n strip_prefix = \"petgraph-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.petgraph-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf-0.11.3\",\n sha256 = \"1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf/0.11.3/download\"],\n strip_prefix = \"phf-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.phf-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf-0.12.1\",\n sha256 = \"913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf/0.12.1/download\"],\n strip_prefix = \"phf-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.phf-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf-0.13.1\",\n sha256 = \"c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf/0.13.1/download\"],\n strip_prefix = \"phf-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf-0.14.0\",\n sha256 = \"010378780309880b08997fae13be7834dba947d36393bd372f2b1556deb2a2f6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf/0.14.0/download\"],\n strip_prefix = \"phf-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.phf-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_codegen-0.11.3\",\n sha256 = \"aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_codegen/0.11.3/download\"],\n strip_prefix = \"phf_codegen-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.phf_codegen-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_codegen-0.13.1\",\n sha256 = \"49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_codegen/0.13.1/download\"],\n strip_prefix = \"phf_codegen-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_codegen-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_generator-0.11.3\",\n sha256 = \"3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_generator/0.11.3/download\"],\n strip_prefix = \"phf_generator-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.phf_generator-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_generator-0.13.1\",\n sha256 = \"135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_generator/0.13.1/download\"],\n strip_prefix = \"phf_generator-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_generator-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_generator-0.14.0\",\n sha256 = \"aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_generator/0.14.0/download\"],\n strip_prefix = \"phf_generator-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.phf_generator-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_macros-0.13.1\",\n sha256 = \"812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_macros/0.13.1/download\"],\n strip_prefix = \"phf_macros-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_macros-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_macros-0.14.0\",\n sha256 = \"5fa8d0ca26d424d27630da600c6624696e7dec8bf7b3b492b383c5dc49e5e085\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_macros/0.14.0/download\"],\n strip_prefix = \"phf_macros-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.phf_macros-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_shared-0.11.3\",\n sha256 = \"67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_shared/0.11.3/download\"],\n strip_prefix = \"phf_shared-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.phf_shared-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_shared-0.12.1\",\n sha256 = \"06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_shared/0.12.1/download\"],\n strip_prefix = \"phf_shared-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_shared-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_shared-0.13.1\",\n sha256 = \"e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_shared/0.13.1/download\"],\n strip_prefix = \"phf_shared-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_shared-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_shared-0.14.0\",\n sha256 = \"c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_shared/0.14.0/download\"],\n strip_prefix = \"phf_shared-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.phf_shared-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-project-lite-0.2.17\",\n sha256 = \"a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-project-lite/0.2.17/download\"],\n strip_prefix = \"pin-project-lite-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.pin-project-lite-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-utils-0.1.0\",\n sha256 = \"8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-utils/0.1.0/download\"],\n strip_prefix = \"pin-utils-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.pin-utils-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__piper-0.2.5\",\n sha256 = \"c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/piper/0.2.5/download\"],\n strip_prefix = \"piper-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.piper-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pipewire-0.9.2\",\n sha256 = \"9688b89abf11d756499f7c6190711d6dbe5a3acdb30c8fbf001d6596d06a8d44\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pipewire/0.9.2/download\"],\n strip_prefix = \"pipewire-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.pipewire-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pipewire-sys-0.9.2\",\n sha256 = \"cb028afee0d6ca17020b090e3b8fa2d7de23305aef975c7e5192a5050246ea36\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pipewire-sys/0.9.2/download\"],\n strip_prefix = \"pipewire-sys-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.pipewire-sys-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pkcs8-0.10.2\",\n sha256 = \"f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pkcs8/0.10.2/download\"],\n strip_prefix = \"pkcs8-0.10.2\",\n build_file = Label(\"@crates//crates:BUILD.pkcs8-0.10.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pkg-config-0.3.33\",\n sha256 = \"19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pkg-config/0.3.33/download\"],\n strip_prefix = \"pkg-config-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.pkg-config-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__platform-info-2.1.0\",\n sha256 = \"9368d62437c8cbb7c31ee37fd8c08a7d390e09a3ff75698a674953f46705ffcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/platform-info/2.1.0/download\"],\n strip_prefix = \"platform-info-2.1.0\",\n build_file = Label(\"@crates//crates:BUILD.platform-info-2.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__png-0.18.1\",\n sha256 = \"60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/png/0.18.1/download\"],\n strip_prefix = \"png-0.18.1\",\n build_file = Label(\"@crates//crates:BUILD.png-0.18.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__polling-3.11.0\",\n sha256 = \"5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/polling/3.11.0/download\"],\n strip_prefix = \"polling-3.11.0\",\n build_file = Label(\"@crates//crates:BUILD.polling-3.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__poly1305-0.8.0\",\n sha256 = \"8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/poly1305/0.8.0/download\"],\n strip_prefix = \"poly1305-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.poly1305-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__polyval-0.6.2\",\n sha256 = \"9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/polyval/0.6.2/download\"],\n strip_prefix = \"polyval-0.6.2\",\n build_file = Label(\"@crates//crates:BUILD.polyval-0.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__portable-atomic-1.14.0\",\n sha256 = \"3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/portable-atomic/1.14.0/download\"],\n strip_prefix = \"portable-atomic-1.14.0\",\n build_file = Label(\"@crates//crates:BUILD.portable-atomic-1.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__portable-atomic-util-0.2.7\",\n sha256 = \"c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/portable-atomic-util/0.2.7/download\"],\n strip_prefix = \"portable-atomic-util-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.portable-atomic-util-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__portable-pty-0.9.0\",\n sha256 = \"b4a596a2b3d2752d94f51fac2d4a96737b8705dddd311a32b9af47211f08671e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/portable-pty/0.9.0/download\"],\n strip_prefix = \"portable-pty-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.portable-pty-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__potential_utf-0.1.5\",\n sha256 = \"0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/potential_utf/0.1.5/download\"],\n strip_prefix = \"potential_utf-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.potential_utf-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__powerfmt-0.2.0\",\n sha256 = \"439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/powerfmt/0.2.0/download\"],\n strip_prefix = \"powerfmt-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.powerfmt-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ppv-lite86-0.2.21\",\n sha256 = \"85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ppv-lite86/0.2.21/download\"],\n strip_prefix = \"ppv-lite86-0.2.21\",\n build_file = Label(\"@crates//crates:BUILD.ppv-lite86-0.2.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__precomputed-hash-0.1.1\",\n sha256 = \"925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/precomputed-hash/0.1.1/download\"],\n strip_prefix = \"precomputed-hash-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.precomputed-hash-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pretty_assertions-1.4.1\",\n sha256 = \"3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pretty_assertions/1.4.1/download\"],\n strip_prefix = \"pretty_assertions-1.4.1\",\n build_file = Label(\"@crates//crates:BUILD.pretty_assertions-1.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prettyplease-0.2.37\",\n sha256 = \"479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prettyplease/0.2.37/download\"],\n strip_prefix = \"prettyplease-0.2.37\",\n build_file = Label(\"@crates//crates:BUILD.prettyplease-0.2.37.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__primeorder-0.13.6\",\n sha256 = \"353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/primeorder/0.13.6/download\"],\n strip_prefix = \"primeorder-0.13.6\",\n build_file = Label(\"@crates//crates:BUILD.primeorder-0.13.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro-crate-3.5.0\",\n sha256 = \"e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro-crate/3.5.0/download\"],\n strip_prefix = \"proc-macro-crate-3.5.0\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro-crate-3.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro2-1.0.107\",\n sha256 = \"985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro2/1.0.107/download\"],\n strip_prefix = \"proc-macro2-1.0.107\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro2-1.0.107.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__procfs-0.18.0\",\n sha256 = \"25485360a54d6861439d60facef26de713b1e126bf015ec8f98239467a2b82f7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/procfs/0.18.0/download\"],\n strip_prefix = \"procfs-0.18.0\",\n build_file = Label(\"@crates//crates:BUILD.procfs-0.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__procfs-core-0.18.0\",\n sha256 = \"e6401bf7b6af22f78b563665d15a22e9aef27775b79b149a66ca022468a4e405\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/procfs-core/0.18.0/download\"],\n strip_prefix = \"procfs-core-0.18.0\",\n build_file = Label(\"@crates//crates:BUILD.procfs-core-0.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ptr_meta-0.3.2\",\n sha256 = \"743da816b98c921cdbe8628ef7381b76f25ecf4da599fc80aca90eae7ef70cc0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ptr_meta/0.3.2/download\"],\n strip_prefix = \"ptr_meta-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.ptr_meta-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ptr_meta_derive-0.3.2\",\n sha256 = \"1c8d9ca532f185d5d4db7a7c9d51420b452168ea1c2b913953281bd6fe1fcbd0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ptr_meta_derive/0.3.2/download\"],\n strip_prefix = \"ptr_meta_derive-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.ptr_meta_derive-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pxfm-0.1.30\",\n sha256 = \"d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pxfm/0.1.30/download\"],\n strip_prefix = \"pxfm-0.1.30\",\n build_file = Label(\"@crates//crates:BUILD.pxfm-0.1.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quantette-0.5.1\",\n sha256 = \"c98fecda8b16396ff9adac67644a523dd1778c42b58606a29df5c31ca925d174\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quantette/0.5.1/download\"],\n strip_prefix = \"quantette-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.quantette-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quick-error-2.0.1\",\n sha256 = \"a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quick-error/2.0.1/download\"],\n strip_prefix = \"quick-error-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.quick-error-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quick-xml-0.30.0\",\n sha256 = \"eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quick-xml/0.30.0/download\"],\n strip_prefix = \"quick-xml-0.30.0\",\n build_file = Label(\"@crates//crates:BUILD.quick-xml-0.30.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quick-xml-0.41.0\",\n sha256 = \"e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quick-xml/0.41.0/download\"],\n strip_prefix = \"quick-xml-0.41.0\",\n build_file = Label(\"@crates//crates:BUILD.quick-xml-0.41.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quote-1.0.47\",\n sha256 = \"1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quote/1.0.47/download\"],\n strip_prefix = \"quote-1.0.47\",\n build_file = Label(\"@crates//crates:BUILD.quote-1.0.47.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-5.3.0\",\n sha256 = \"69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/5.3.0/download\"],\n strip_prefix = \"r-efi-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-6.0.0\",\n sha256 = \"f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/6.0.0/download\"],\n strip_prefix = \"r-efi-6.0.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-6.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__radium-0.7.0\",\n sha256 = \"dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/radium/0.7.0/download\"],\n strip_prefix = \"radium-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.radium-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rancor-0.1.3\",\n sha256 = \"9b534442d0fcdb55d66f373d9cac6d33b6293a2335bc2136dbd06ce0e87d2572\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rancor/0.1.3/download\"],\n strip_prefix = \"rancor-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.rancor-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand-0.10.2\",\n sha256 = \"c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand/0.10.2/download\"],\n strip_prefix = \"rand-0.10.2\",\n build_file = Label(\"@crates//crates:BUILD.rand-0.10.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand-0.8.7\",\n sha256 = \"22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand/0.8.7/download\"],\n strip_prefix = \"rand-0.8.7\",\n build_file = Label(\"@crates//crates:BUILD.rand-0.8.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand-0.9.5\",\n sha256 = \"b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand/0.9.5/download\"],\n strip_prefix = \"rand-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.rand-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_chacha-0.9.0\",\n sha256 = \"d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_chacha/0.9.0/download\"],\n strip_prefix = \"rand_chacha-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.rand_chacha-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_core-0.10.1\",\n sha256 = \"63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_core/0.10.1/download\"],\n strip_prefix = \"rand_core-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.rand_core-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_core-0.6.4\",\n sha256 = \"ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_core/0.6.4/download\"],\n strip_prefix = \"rand_core-0.6.4\",\n build_file = Label(\"@crates//crates:BUILD.rand_core-0.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_core-0.9.5\",\n sha256 = \"76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_core/0.9.5/download\"],\n strip_prefix = \"rand_core-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.rand_core-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_xoshiro-0.7.0\",\n sha256 = \"f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_xoshiro/0.7.0/download\"],\n strip_prefix = \"rand_xoshiro-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.rand_xoshiro-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rayon-1.12.0\",\n sha256 = \"fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rayon/1.12.0/download\"],\n strip_prefix = \"rayon-1.12.0\",\n build_file = Label(\"@crates//crates:BUILD.rayon-1.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rayon-core-1.13.0\",\n sha256 = \"22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rayon-core/1.13.0/download\"],\n strip_prefix = \"rayon-core-1.13.0\",\n build_file = Label(\"@crates//crates:BUILD.rayon-core-1.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rcgen-0.13.2\",\n sha256 = \"75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rcgen/0.13.2/download\"],\n strip_prefix = \"rcgen-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.rcgen-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__redox_syscall-0.5.18\",\n sha256 = \"ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/redox_syscall/0.5.18/download\"],\n strip_prefix = \"redox_syscall-0.5.18\",\n build_file = Label(\"@crates//crates:BUILD.redox_syscall-0.5.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ref-cast-1.0.26\",\n sha256 = \"216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ref-cast/1.0.26/download\"],\n strip_prefix = \"ref-cast-1.0.26\",\n build_file = Label(\"@crates//crates:BUILD.ref-cast-1.0.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ref-cast-impl-1.0.26\",\n sha256 = \"2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ref-cast-impl/1.0.26/download\"],\n strip_prefix = \"ref-cast-impl-1.0.26\",\n build_file = Label(\"@crates//crates:BUILD.ref-cast-impl-1.0.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-1.13.1\",\n sha256 = \"f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex/1.13.1/download\"],\n strip_prefix = \"regex-1.13.1\",\n build_file = Label(\"@crates//crates:BUILD.regex-1.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-automata-0.4.18\",\n sha256 = \"ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-automata/0.4.18/download\"],\n strip_prefix = \"regex-automata-0.4.18\",\n build_file = Label(\"@crates//crates:BUILD.regex-automata-0.4.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-lite-0.1.9\",\n sha256 = \"cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-lite/0.1.9/download\"],\n strip_prefix = \"regex-lite-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.regex-lite-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-syntax-0.8.11\",\n sha256 = \"d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-syntax/0.8.11/download\"],\n strip_prefix = \"regex-syntax-0.8.11\",\n build_file = Label(\"@crates//crates:BUILD.regex-syntax-0.8.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__reis-0.5.0\",\n sha256 = \"00939c5c526a1b4054ef8d9d96b3f92227f08ca355965e986741b556eda6d289\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/reis/0.5.0/download\"],\n strip_prefix = \"reis-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.reis-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__relative-path-1.9.3\",\n sha256 = \"ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/relative-path/1.9.3/download\"],\n strip_prefix = \"relative-path-1.9.3\",\n build_file = Label(\"@crates//crates:BUILD.relative-path-1.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rend-0.5.4\",\n sha256 = \"663ba70707f96e871406fe10d68128412e619b06d1d47cb91c3a4c6501176240\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rend/0.5.4/download\"],\n strip_prefix = \"rend-0.5.4\",\n build_file = Label(\"@crates//crates:BUILD.rend-0.5.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rfc6979-0.4.0\",\n sha256 = \"f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rfc6979/0.4.0/download\"],\n strip_prefix = \"rfc6979-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.rfc6979-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rgb-0.8.53\",\n sha256 = \"47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rgb/0.8.53/download\"],\n strip_prefix = \"rgb-0.8.53\",\n build_file = Label(\"@crates//crates:BUILD.rgb-0.8.53.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ring-0.17.14\",\n sha256 = \"a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ring/0.17.14/download\"],\n strip_prefix = \"ring-0.17.14\",\n build_file = Label(\"@crates//crates:BUILD.ring-0.17.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rkyv-0.8.18\",\n sha256 = \"d9776093b7ca170454ab1406954f7b7d97a57c51dc6c0642957fb2ef25c2d399\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rkyv/0.8.18/download\"],\n strip_prefix = \"rkyv-0.8.18\",\n build_file = Label(\"@crates//crates:BUILD.rkyv-0.8.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rkyv_derive-0.8.18\",\n sha256 = \"1c25ef604ac7dd839d44d64648952ea23c97866f124ff671b0ed2cf3ad9bb06e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rkyv_derive/0.8.18/download\"],\n strip_prefix = \"rkyv_derive-0.8.18\",\n build_file = Label(\"@crates//crates:BUILD.rkyv_derive-0.8.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rlimit-0.11.0\",\n sha256 = \"f35ee2729c56bb610f6dba436bf78135f728b7373bdffae2ec815b2d3eb98cc3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rlimit/0.11.0/download\"],\n strip_prefix = \"rlimit-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.rlimit-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rpds-1.2.1\",\n sha256 = \"e025feb26210bc196b908e72deb063b1b4000754304341cbc168a1e72c857ebc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rpds/1.2.1/download\"],\n strip_prefix = \"rpds-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.rpds-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rstest-0.26.1\",\n sha256 = \"f5a3193c063baaa2a95a33f03035c8a72b83d97a54916055ba22d35ed3839d49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rstest/0.26.1/download\"],\n strip_prefix = \"rstest-0.26.1\",\n build_file = Label(\"@crates//crates:BUILD.rstest-0.26.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rstest_macros-0.26.1\",\n sha256 = \"9c845311f0ff7951c5506121a9ad75aec44d083c31583b2ea5a30bcb0b0abba0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rstest_macros/0.26.1/download\"],\n strip_prefix = \"rstest_macros-0.26.1\",\n build_file = Label(\"@crates//crates:BUILD.rstest_macros-0.26.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rtcp-0.17.2\",\n sha256 = \"adad7f6a501162881032fc84b4bc78ae11f1b30748180b9f5cbe8810bf613aab\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rtcp/0.17.2/download\"],\n strip_prefix = \"rtcp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.rtcp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rtp-0.17.2\",\n sha256 = \"149329e78ada26b5e174a4c281a7a7e5c8bda6008adc90daddd6f98fce56db29\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rtp/0.17.2/download\"],\n strip_prefix = \"rtp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.rtp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc-hash-1.1.0\",\n sha256 = \"08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc-hash/1.1.0/download\"],\n strip_prefix = \"rustc-hash-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.rustc-hash-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc-hash-2.1.3\",\n sha256 = \"6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc-hash/2.1.3/download\"],\n strip_prefix = \"rustc-hash-2.1.3\",\n build_file = Label(\"@crates//crates:BUILD.rustc-hash-2.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc_version-0.4.1\",\n sha256 = \"cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc_version/0.4.1/download\"],\n strip_prefix = \"rustc_version-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.rustc_version-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rusticata-macros-4.1.0\",\n sha256 = \"faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rusticata-macros/4.1.0/download\"],\n strip_prefix = \"rusticata-macros-4.1.0\",\n build_file = Label(\"@crates//crates:BUILD.rusticata-macros-4.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustix-0.38.44\",\n sha256 = \"fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustix/0.38.44/download\"],\n strip_prefix = \"rustix-0.38.44\",\n build_file = Label(\"@crates//crates:BUILD.rustix-0.38.44.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustix-1.1.4\",\n sha256 = \"b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustix/1.1.4/download\"],\n strip_prefix = \"rustix-1.1.4\",\n build_file = Label(\"@crates//crates:BUILD.rustix-1.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-0.23.43\",\n sha256 = \"0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls/0.23.43/download\"],\n strip_prefix = \"rustls-0.23.43\",\n build_file = Label(\"@crates//crates:BUILD.rustls-0.23.43.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-pki-types-1.15.1\",\n sha256 = \"2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-pki-types/1.15.1/download\"],\n strip_prefix = \"rustls-pki-types-1.15.1\",\n build_file = Label(\"@crates//crates:BUILD.rustls-pki-types-1.15.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-webpki-0.103.13\",\n sha256 = \"61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-webpki/0.103.13/download\"],\n strip_prefix = \"rustls-webpki-0.103.13\",\n build_file = Label(\"@crates//crates:BUILD.rustls-webpki-0.103.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustversion-1.0.23\",\n sha256 = \"cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustversion/1.0.23/download\"],\n strip_prefix = \"rustversion-1.0.23\",\n build_file = Label(\"@crates//crates:BUILD.rustversion-1.0.23.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__safe_arch-0.9.3\",\n sha256 = \"629516c85c29fe757770fa03f2074cf1eac43d44c02a3de9fc2ef7b0e207dfdd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/safe_arch/0.9.3/download\"],\n strip_prefix = \"safe_arch-0.9.3\",\n build_file = Label(\"@crates//crates:BUILD.safe_arch-0.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__same-file-1.0.6\",\n sha256 = \"93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/same-file/1.0.6/download\"],\n strip_prefix = \"same-file-1.0.6\",\n build_file = Label(\"@crates//crates:BUILD.same-file-1.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__scoped-tls-1.0.1\",\n sha256 = \"e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/scoped-tls/1.0.1/download\"],\n strip_prefix = \"scoped-tls-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.scoped-tls-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__scopeguard-1.2.0\",\n sha256 = \"94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/scopeguard/1.2.0/download\"],\n strip_prefix = \"scopeguard-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.scopeguard-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sdp-0.17.2\",\n sha256 = \"66b6eecfa5151edef84d544ff3885dff98e5b5fe97586757a4b5118bde51c958\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sdp/0.17.2/download\"],\n strip_prefix = \"sdp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.sdp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sec1-0.7.3\",\n sha256 = \"d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sec1/0.7.3/download\"],\n strip_prefix = \"sec1-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.sec1-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__self_cell-1.3.0\",\n sha256 = \"2ab42ca02749e120097e328d91d415325bdf43b1c72c4c8badf37375fe40a813\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/self_cell/1.3.0/download\"],\n strip_prefix = \"self_cell-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.self_cell-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__semver-1.0.28\",\n sha256 = \"8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/semver/1.0.28/download\"],\n strip_prefix = \"semver-1.0.28\",\n build_file = Label(\"@crates//crates:BUILD.semver-1.0.28.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde-1.0.229\",\n sha256 = \"4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde/1.0.229/download\"],\n strip_prefix = \"serde-1.0.229\",\n build_file = Label(\"@crates//crates:BUILD.serde-1.0.229.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_core-1.0.229\",\n sha256 = \"67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_core/1.0.229/download\"],\n strip_prefix = \"serde_core-1.0.229\",\n build_file = Label(\"@crates//crates:BUILD.serde_core-1.0.229.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive-1.0.229\",\n sha256 = \"e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive/1.0.229/download\"],\n strip_prefix = \"serde_derive-1.0.229\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive-1.0.229.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_json-1.0.151\",\n sha256 = \"c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_json/1.0.151/download\"],\n strip_prefix = \"serde_json-1.0.151\",\n build_file = Label(\"@crates//crates:BUILD.serde_json-1.0.151.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_repr-0.1.21\",\n sha256 = \"8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_repr/0.1.21/download\"],\n strip_prefix = \"serde_repr-0.1.21\",\n build_file = Label(\"@crates//crates:BUILD.serde_repr-0.1.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_spanned-1.1.1\",\n sha256 = \"6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_spanned/1.1.1/download\"],\n strip_prefix = \"serde_spanned-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.serde_spanned-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serial2-0.2.38\",\n sha256 = \"b16809bc35793b19ce4e0c53924bc0dce3937f15487997cfdaed936004180730\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serial2/0.2.38/download\"],\n strip_prefix = \"serial2-0.2.38\",\n build_file = Label(\"@crates//crates:BUILD.serial2-0.2.38.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha1-0.10.7\",\n sha256 = \"a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha1/0.10.7/download\"],\n strip_prefix = \"sha1-0.10.7\",\n build_file = Label(\"@crates//crates:BUILD.sha1-0.10.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha2-0.10.9\",\n sha256 = \"a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha2/0.10.9/download\"],\n strip_prefix = \"sha2-0.10.9\",\n build_file = Label(\"@crates//crates:BUILD.sha2-0.10.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha3-0.10.9\",\n sha256 = \"77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha3/0.10.9/download\"],\n strip_prefix = \"sha3-0.10.9\",\n build_file = Label(\"@crates//crates:BUILD.sha3-0.10.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shared_library-0.1.9\",\n sha256 = \"5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shared_library/0.1.9/download\"],\n strip_prefix = \"shared_library-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.shared_library-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shell-words-1.1.1\",\n sha256 = \"dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shell-words/1.1.1/download\"],\n strip_prefix = \"shell-words-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.shell-words-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shlex-1.3.0\",\n sha256 = \"0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shlex/1.3.0/download\"],\n strip_prefix = \"shlex-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.shlex-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shlex-2.0.1\",\n sha256 = \"f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shlex/2.0.1/download\"],\n strip_prefix = \"shlex-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.shlex-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__signal-hook-registry-1.4.8\",\n sha256 = \"c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/signal-hook-registry/1.4.8/download\"],\n strip_prefix = \"signal-hook-registry-1.4.8\",\n build_file = Label(\"@crates//crates:BUILD.signal-hook-registry-1.4.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__signature-2.2.0\",\n sha256 = \"77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/signature/2.2.0/download\"],\n strip_prefix = \"signature-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.signature-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simd-adler32-0.3.10\",\n sha256 = \"3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simd-adler32/0.3.10/download\"],\n strip_prefix = \"simd-adler32-0.3.10\",\n build_file = Label(\"@crates//crates:BUILD.simd-adler32-0.3.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simdutf8-0.1.5\",\n sha256 = \"e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simdutf8/0.1.5/download\"],\n strip_prefix = \"simdutf8-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.simdutf8-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__similar-2.7.0\",\n sha256 = \"bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/similar/2.7.0/download\"],\n strip_prefix = \"similar-2.7.0\",\n build_file = Label(\"@crates//crates:BUILD.similar-2.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__similar-3.1.2\",\n sha256 = \"85ee016af5d736b69fc89e19254540fa4b5f5492853fb5503920f084011c78b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/similar/3.1.2/download\"],\n strip_prefix = \"similar-3.1.2\",\n build_file = Label(\"@crates//crates:BUILD.similar-3.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__siphasher-1.0.3\",\n sha256 = \"8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/siphasher/1.0.3/download\"],\n strip_prefix = \"siphasher-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.siphasher-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__slab-0.4.12\",\n sha256 = \"0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/slab/0.4.12/download\"],\n strip_prefix = \"slab-0.4.12\",\n build_file = Label(\"@crates//crates:BUILD.slab-0.4.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sm3-0.5.0\",\n sha256 = \"da6a89ba31723d185fd7413b98c576a575f356d9b84729d8ecb6ead60000a5b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sm3/0.5.0/download\"],\n strip_prefix = \"sm3-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.sm3-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__smallvec-1.15.2\",\n sha256 = \"8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/smallvec/1.15.2/download\"],\n strip_prefix = \"smallvec-1.15.2\",\n build_file = Label(\"@crates//crates:BUILD.smallvec-1.15.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__smol_str-0.2.2\",\n sha256 = \"dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/smol_str/0.2.2/download\"],\n strip_prefix = \"smol_str-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.smol_str-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__socket2-0.5.10\",\n sha256 = \"e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/socket2/0.5.10/download\"],\n strip_prefix = \"socket2-0.5.10\",\n build_file = Label(\"@crates//crates:BUILD.socket2-0.5.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__socket2-0.6.5\",\n sha256 = \"c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/socket2/0.6.5/download\"],\n strip_prefix = \"socket2-0.6.5\",\n build_file = Label(\"@crates//crates:BUILD.socket2-0.6.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__spin-0.10.1\",\n sha256 = \"023a211cb3138dbc438680b32560ad89f699977624c9f8dbb95a47d5b4c07dd3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/spin/0.10.1/download\"],\n strip_prefix = \"spin-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.spin-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__spin-0.9.9\",\n sha256 = \"3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/spin/0.9.9/download\"],\n strip_prefix = \"spin-0.9.9\",\n build_file = Label(\"@crates//crates:BUILD.spin-0.9.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__spki-0.7.3\",\n sha256 = \"d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/spki/0.7.3/download\"],\n strip_prefix = \"spki-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.spki-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__stable_deref_trait-1.2.1\",\n sha256 = \"6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/stable_deref_trait/1.2.1/download\"],\n strip_prefix = \"stable_deref_trait-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.stable_deref_trait-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__static_assertions-1.1.0\",\n sha256 = \"a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/static_assertions/1.1.0/download\"],\n strip_prefix = \"static_assertions-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.static_assertions-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__str_stack-0.1.1\",\n sha256 = \"7f446288b699d66d0fd2e30d1cfe7869194312524b3b9252594868ed26ef056a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/str_stack/0.1.1/download\"],\n strip_prefix = \"str_stack-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.str_stack-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__streaming-iterator-0.1.9\",\n sha256 = \"2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/streaming-iterator/0.1.9/download\"],\n strip_prefix = \"streaming-iterator-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.streaming-iterator-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__string_cache-0.9.0\",\n sha256 = \"a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/string_cache/0.9.0/download\"],\n strip_prefix = \"string_cache-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.string_cache-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__string_cache_codegen-0.6.1\",\n sha256 = \"585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/string_cache_codegen/0.6.1/download\"],\n strip_prefix = \"string_cache_codegen-0.6.1\",\n build_file = Label(\"@crates//crates:BUILD.string_cache_codegen-0.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strsim-0.11.1\",\n sha256 = \"7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strsim/0.11.1/download\"],\n strip_prefix = \"strsim-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.strsim-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strum-0.28.0\",\n sha256 = \"9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strum/0.28.0/download\"],\n strip_prefix = \"strum-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.strum-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strum_macros-0.28.0\",\n sha256 = \"ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strum_macros/0.28.0/download\"],\n strip_prefix = \"strum_macros-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.strum_macros-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__stun-0.17.2\",\n sha256 = \"2e3b8d5ad1dd4c8cd0595440f26521a71dd593cb5873ee8e06b91510b7d97269\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/stun/0.17.2/download\"],\n strip_prefix = \"stun-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.stun-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__substring-1.4.5\",\n sha256 = \"42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/substring/1.4.5/download\"],\n strip_prefix = \"substring-1.4.5\",\n build_file = Label(\"@crates//crates:BUILD.substring-1.4.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__subtle-2.6.1\",\n sha256 = \"13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/subtle/2.6.1/download\"],\n strip_prefix = \"subtle-2.6.1\",\n build_file = Label(\"@crates//crates:BUILD.subtle-2.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-2.0.119\",\n sha256 = \"872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/2.0.119/download\"],\n strip_prefix = \"syn-2.0.119\",\n build_file = Label(\"@crates//crates:BUILD.syn-2.0.119.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-3.0.3\",\n sha256 = \"53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/3.0.3/download\"],\n strip_prefix = \"syn-3.0.3\",\n build_file = Label(\"@crates//crates:BUILD.syn-3.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__synstructure-0.13.2\",\n sha256 = \"728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/synstructure/0.13.2/download\"],\n strip_prefix = \"synstructure-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.synstructure-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syntect-5.3.0\",\n sha256 = \"656b45c05d95a5704399aeef6bd0ddec7b2b3531b7c9e900abbf7c4d2190c925\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syntect/5.3.0/download\"],\n strip_prefix = \"syntect-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.syntect-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__system-deps-7.0.8\",\n sha256 = \"396a35feb67335377e0251fcbc1092fc85c484bd4e3a7a54319399da127796e7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/system-deps/7.0.8/download\"],\n strip_prefix = \"system-deps-7.0.8\",\n build_file = Label(\"@crates//crates:BUILD.system-deps-7.0.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tap-1.0.1\",\n sha256 = \"55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tap/1.0.1/download\"],\n strip_prefix = \"tap-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.tap-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__target-lexicon-0.13.5\",\n sha256 = \"adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/target-lexicon/0.13.5/download\"],\n strip_prefix = \"target-lexicon-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.target-lexicon-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tempfile-3.27.0\",\n sha256 = \"32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tempfile/3.27.0/download\"],\n strip_prefix = \"tempfile-3.27.0\",\n build_file = Label(\"@crates//crates:BUILD.tempfile-3.27.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tendril-0.5.1\",\n sha256 = \"5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tendril/0.5.1/download\"],\n strip_prefix = \"tendril-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.tendril-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__termcolor-1.4.1\",\n sha256 = \"06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/termcolor/1.4.1/download\"],\n strip_prefix = \"termcolor-1.4.1\",\n build_file = Label(\"@crates//crates:BUILD.termcolor-1.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__terminal_size-0.4.4\",\n sha256 = \"230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/terminal_size/0.4.4/download\"],\n strip_prefix = \"terminal_size-0.4.4\",\n build_file = Label(\"@crates//crates:BUILD.terminal_size-0.4.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__terminfo-0.9.0\",\n sha256 = \"d4ea810f0692f9f51b382fff5893887bb4580f5fa246fde546e0b13e7fcee662\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/terminfo/0.9.0/download\"],\n strip_prefix = \"terminfo-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.terminfo-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-1.0.69\",\n sha256 = \"b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror/1.0.69/download\"],\n strip_prefix = \"thiserror-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-2.0.19\",\n sha256 = \"09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror/2.0.19/download\"],\n strip_prefix = \"thiserror-2.0.19\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-2.0.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-impl-1.0.69\",\n sha256 = \"4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror-impl/1.0.69/download\"],\n strip_prefix = \"thiserror-impl-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-impl-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-impl-2.0.19\",\n sha256 = \"43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror-impl/2.0.19/download\"],\n strip_prefix = \"thiserror-impl-2.0.19\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-impl-2.0.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tiff-0.11.3\",\n sha256 = \"b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tiff/0.11.3/download\"],\n strip_prefix = \"tiff-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.tiff-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tiktoken-rs-0.11.0\",\n sha256 = \"fac4a168cfc1d8ed65bf17a6ee0843ad9a68f863c63c0fb2fa7eab67838782ee\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tiktoken-rs/0.11.0/download\"],\n strip_prefix = \"tiktoken-rs-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.tiktoken-rs-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-0.3.55\",\n sha256 = \"cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time/0.3.55/download\"],\n strip_prefix = \"time-0.3.55\",\n build_file = Label(\"@crates//crates:BUILD.time-0.3.55.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-core-0.1.9\",\n sha256 = \"9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-core/0.1.9/download\"],\n strip_prefix = \"time-core-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.time-core-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-macros-0.2.32\",\n sha256 = \"7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-macros/0.2.32/download\"],\n strip_prefix = \"time-macros-0.2.32\",\n build_file = Label(\"@crates//crates:BUILD.time-macros-0.2.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tiny-keccak-2.0.2\",\n sha256 = \"2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tiny-keccak/2.0.2/download\"],\n strip_prefix = \"tiny-keccak-2.0.2\",\n build_file = Label(\"@crates//crates:BUILD.tiny-keccak-2.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinystr-0.8.3\",\n sha256 = \"c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinystr/0.8.3/download\"],\n strip_prefix = \"tinystr-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.tinystr-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinyvec-1.12.0\",\n sha256 = \"bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinyvec/1.12.0/download\"],\n strip_prefix = \"tinyvec-1.12.0\",\n build_file = Label(\"@crates//crates:BUILD.tinyvec-1.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinyvec_macros-0.1.1\",\n sha256 = \"1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinyvec_macros/0.1.1/download\"],\n strip_prefix = \"tinyvec_macros-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tinyvec_macros-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-1.53.1\",\n sha256 = \"202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio/1.53.1/download\"],\n strip_prefix = \"tokio-1.53.1\",\n build_file = Label(\"@crates//crates:BUILD.tokio-1.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-macros-2.7.2\",\n sha256 = \"78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-macros/2.7.2/download\"],\n strip_prefix = \"tokio-macros-2.7.2\",\n build_file = Label(\"@crates//crates:BUILD.tokio-macros-2.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-util-0.7.19\",\n sha256 = \"494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-util/0.7.19/download\"],\n strip_prefix = \"tokio-util-0.7.19\",\n build_file = Label(\"@crates//crates:BUILD.tokio-util-0.7.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml-1.1.4-spec-1.1.0\",\n sha256 = \"3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml/1.1.4+spec-1.1.0/download\"],\n strip_prefix = \"toml-1.1.4+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml-1.1.4+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml_datetime-1.1.1-spec-1.1.0\",\n sha256 = \"3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_datetime/1.1.1+spec-1.1.0/download\"],\n strip_prefix = \"toml_datetime-1.1.1+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml_edit-0.25.13-spec-1.1.0\",\n sha256 = \"6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_edit/0.25.13+spec-1.1.0/download\"],\n strip_prefix = \"toml_edit-0.25.13+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml_edit-0.25.13+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml_parser-1.1.3-spec-1.1.0\",\n sha256 = \"1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_parser/1.1.3+spec-1.1.0/download\"],\n strip_prefix = \"toml_parser-1.1.3+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml_parser-1.1.3+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml_writer-1.1.2-spec-1.1.0\",\n sha256 = \"7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_writer/1.1.2+spec-1.1.0/download\"],\n strip_prefix = \"toml_writer-1.1.2+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml_writer-1.1.2+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-0.1.44\",\n sha256 = \"63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing/0.1.44/download\"],\n strip_prefix = \"tracing-0.1.44\",\n build_file = Label(\"@crates//crates:BUILD.tracing-0.1.44.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-attributes-0.1.31\",\n sha256 = \"7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-attributes/0.1.31/download\"],\n strip_prefix = \"tracing-attributes-0.1.31\",\n build_file = Label(\"@crates//crates:BUILD.tracing-attributes-0.1.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-core-0.1.36\",\n sha256 = \"db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-core/0.1.36/download\"],\n strip_prefix = \"tracing-core-0.1.36\",\n build_file = Label(\"@crates//crates:BUILD.tracing-core-0.1.36.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-0.25.10\",\n sha256 = \"78f873475d258561b06f1c595d93308a7ed124d9977cb26b148c2084a4a3cc87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter/0.25.10/download\"],\n strip_prefix = \"tree-sitter-0.25.10\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-0.25.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-astro-next-0.1.1\",\n sha256 = \"794a4a59fc2d88e49b4bc41fef9522d77184a36f4e68bbaf545cd1eb2364c46e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-astro-next/0.1.1/download\"],\n strip_prefix = \"tree-sitter-astro-next-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-astro-next-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-bash-0.25.1\",\n sha256 = \"9e5ec769279cc91b561d3df0d8a5deb26b0ad40d183127f409494d6d8fc53062\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-bash/0.25.1/download\"],\n strip_prefix = \"tree-sitter-bash-0.25.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-bash-0.25.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-c-0.24.2\",\n sha256 = \"a9b2eb57a55fed6b00812912e730b7a275cf4fe98bfd6a5d76263d4438371728\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-c/0.24.2/download\"],\n strip_prefix = \"tree-sitter-c-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-c-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-c-sharp-0.23.5\",\n sha256 = \"c1aac67f1ad71de1d6d39708d34811081c26dfa495658de6c14c34200849357c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-c-sharp/0.23.5/download\"],\n strip_prefix = \"tree-sitter-c-sharp-0.23.5\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-c-sharp-0.23.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-clojure-0.1.0\",\n sha256 = \"4004884cc509449a1d78fa3e1f02b4e953d0a8065984445304795e72e885338c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-clojure/0.1.0/download\"],\n strip_prefix = \"tree-sitter-clojure-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-clojure-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-cmake-0.7.4\",\n sha256 = \"164e0c4f4236ec5ceff14824a5528615cf462e100467e49826442ff57d327061\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-cmake/0.7.4/download\"],\n strip_prefix = \"tree-sitter-cmake-0.7.4\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-cmake-0.7.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-cpp-0.23.4\",\n sha256 = \"df2196ea9d47b4ab4a31b9297eaa5a5d19a0b121dceb9f118f6790ad0ab94743\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-cpp/0.23.4/download\"],\n strip_prefix = \"tree-sitter-cpp-0.23.4\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-cpp-0.23.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-css-0.25.0\",\n sha256 = \"a5cbc5e18f29a2c6d6435891f42569525cf95435a3e01c2f1947abcde178686f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-css/0.25.0/download\"],\n strip_prefix = \"tree-sitter-css-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-css-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-dart-0.2.0\",\n sha256 = \"325dd1e24ee9ee21111e9c43680ae7d6010aaa9f282b048a99b9c7163c1cf553\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-dart/0.2.0/download\"],\n strip_prefix = \"tree-sitter-dart-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-dart-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-diff-0.1.0\",\n sha256 = \"dfe1e5ca280a65dfe5ba4205c1bcc84edf486464fed315db53dee6da9a335889\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-diff/0.1.0/download\"],\n strip_prefix = \"tree-sitter-diff-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-diff-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-dockerfile-updated-0.2.0\",\n sha256 = \"5e61eb704364be179ab9be89e2891c8e77c0041eca5891a5c04164a21f6df7a0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-dockerfile-updated/0.2.0/download\"],\n strip_prefix = \"tree-sitter-dockerfile-updated-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-dockerfile-updated-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-elisp-1.7.2\",\n sha256 = \"6b8b82ab7474028f20d2119285566f219209ebdbeec767fa28025b70f94f8cf3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-elisp/1.7.2/download\"],\n strip_prefix = \"tree-sitter-elisp-1.7.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-elisp-1.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-elixir-0.3.5\",\n sha256 = \"66dd064a762ed95bfc29857fa3cb7403bb1e5cb88112de0f6341b7e47284ba40\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-elixir/0.3.5/download\"],\n strip_prefix = \"tree-sitter-elixir-0.3.5\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-elixir-0.3.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-erlang-0.16.0\",\n sha256 = \"ceb442e728225d601db0661f60d64e166bd9b9a55c587f71d4e4f27378717cce\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-erlang/0.16.0/download\"],\n strip_prefix = \"tree-sitter-erlang-0.16.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-erlang-0.16.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-fortran-0.6.0\",\n sha256 = \"ea5fea41363a9b59666001dc26c4b356d4e164da27c6ce31145e00aba6bf9b16\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-fortran/0.6.0/download\"],\n strip_prefix = \"tree-sitter-fortran-0.6.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-fortran-0.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-go-0.25.0\",\n sha256 = \"c8560a4d2f835cc0d4d2c2e03cbd0dde2f6114b43bc491164238d333e28b16ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-go/0.25.0/download\"],\n strip_prefix = \"tree-sitter-go-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-go-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-graphql-0.1.0\",\n sha256 = \"efedc4cac157161cc23a0adc4553a2cedc908e1cd754b6cd033a919bb81ce5d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-graphql/0.1.0/download\"],\n strip_prefix = \"tree-sitter-graphql-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-graphql-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-haskell-0.23.1\",\n sha256 = \"977c51e504548cba13fc27cb5a2edab2124cf6716a1934915d07ab99523b05a4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-haskell/0.23.1/download\"],\n strip_prefix = \"tree-sitter-haskell-0.23.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-haskell-0.23.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-hcl-1.1.0\",\n sha256 = \"5a7b2cc3d7121553b84309fab9d11b3ff3d420403eef9ae50f9fd1cd9d9cf012\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-hcl/1.1.0/download\"],\n strip_prefix = \"tree-sitter-hcl-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-hcl-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-html-0.23.2\",\n sha256 = \"261b708e5d92061ede329babaaa427b819329a9d427a1d710abb0f67bbef63ee\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-html/0.23.2/download\"],\n strip_prefix = \"tree-sitter-html-0.23.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-html-0.23.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-ini-1.4.0\",\n sha256 = \"387f79682cd53b7c0a5777c96e601a02b9965a787984ef86dbb8952bdab2d62f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-ini/1.4.0/download\"],\n strip_prefix = \"tree-sitter-ini-1.4.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-ini-1.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-java-0.23.5\",\n sha256 = \"0aa6cbcdc8c679b214e616fd3300da67da0e492e066df01bcf5a5921a71e90d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-java/0.23.5/download\"],\n strip_prefix = \"tree-sitter-java-0.23.5\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-java-0.23.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-javascript-0.25.0\",\n sha256 = \"68204f2abc0627a90bdf06e605f5c470aa26fdcb2081ea553a04bdad756693f5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-javascript/0.25.0/download\"],\n strip_prefix = \"tree-sitter-javascript-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-javascript-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-json-0.24.8\",\n sha256 = \"4d727acca406c0020cffc6cf35516764f36c8e3dc4408e5ebe2cb35a947ec471\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-json/0.24.8/download\"],\n strip_prefix = \"tree-sitter-json-0.24.8\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-json-0.24.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-julia-0.23.1\",\n sha256 = \"4144731a178812ee867619b1e98b3b91e54c1652304b26e5ebe3175b701de323\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-julia/0.23.1/download\"],\n strip_prefix = \"tree-sitter-julia-0.23.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-julia-0.23.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-just-0.2.0\",\n sha256 = \"bd46794f2c270f43d73b2f2c8c256992471f3493c903604da0886df984771920\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-just/0.2.0/download\"],\n strip_prefix = \"tree-sitter-just-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-just-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-kotlin-sg-0.4.1\",\n sha256 = \"c06ec43ae3c12165d4ac08afe4e1f5fc6757ffe274fa7bd5af9007ef11ba4319\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-kotlin-sg/0.4.1/download\"],\n strip_prefix = \"tree-sitter-kotlin-sg-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-kotlin-sg-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-language-0.1.7\",\n sha256 = \"009994f150cc0cd50ff54917d5bc8bffe8cad10ca10d81c34da2ec421ae61782\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-language/0.1.7/download\"],\n strip_prefix = \"tree-sitter-language-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-language-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-lua-0.5.0\",\n sha256 = \"8daaf5f4235188a58603c39760d5fa5d4b920d36a299c934adddae757f32a10c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-lua/0.5.0/download\"],\n strip_prefix = \"tree-sitter-lua-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-lua-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-make-1.1.1\",\n sha256 = \"c5998dc7cbcbdab19fae8aefef982bf2d6544513d8d2e69cc44aec4c63810104\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-make/1.1.1/download\"],\n strip_prefix = \"tree-sitter-make-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-make-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-md-0.5.3\",\n sha256 = \"2efd398be546456c814598ee56c0f51769a77241511b4a58077815d120afa882\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-md/0.5.3/download\"],\n strip_prefix = \"tree-sitter-md-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-md-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-nix-0.3.0\",\n sha256 = \"4952a9733f3a98f6683a0ccd1035d84ab7a52f7e84eeed58548d86765ad92de3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-nix/0.3.0/download\"],\n strip_prefix = \"tree-sitter-nix-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-nix-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-objc-3.0.2\",\n sha256 = \"9ca8bb556423fc176f0535e79d525f783a6684d3c9da81bf9d905303c129e1d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-objc/3.0.2/download\"],\n strip_prefix = \"tree-sitter-objc-3.0.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-objc-3.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-ocaml-0.24.2\",\n sha256 = \"7d19db582b3855f56b5f9ec484170fbfb9ee60b938ec7720d76d2ee788e8b640\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-ocaml/0.24.2/download\"],\n strip_prefix = \"tree-sitter-ocaml-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-ocaml-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-odin-1.3.0\",\n sha256 = \"24db210fe9ba2237c71c5030d7b146c7025420ba72dd8013d13cd822c3a8d77a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-odin/1.3.0/download\"],\n strip_prefix = \"tree-sitter-odin-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-odin-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-php-0.24.2\",\n sha256 = \"0d8c17c3ab69052c5eeaa7ff5cd972dd1bc25d1b97ee779fec391ad3b5df5592\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-php/0.24.2/download\"],\n strip_prefix = \"tree-sitter-php-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-php-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-powershell-0.26.4\",\n sha256 = \"3faf304d44b9ddd4a7d97804bb8de7daf564336dd5a526dc6de5b39238243022\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-powershell/0.26.4/download\"],\n strip_prefix = \"tree-sitter-powershell-0.26.4\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-powershell-0.26.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-proto-0.4.0\",\n sha256 = \"2e410ccb5fa3cbd6bf7b8e512ecf7ad9d5254395b822bfe9f751b50fa978f31c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-proto/0.4.0/download\"],\n strip_prefix = \"tree-sitter-proto-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-proto-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-python-0.25.0\",\n sha256 = \"6bf85fd39652e740bf60f46f4cda9492c3a9ad75880575bf14960f775cb74a1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-python/0.25.0/download\"],\n strip_prefix = \"tree-sitter-python-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-python-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-r-1.3.0\",\n sha256 = \"ffc9954ec870dcad6cffdd302b405306c68cf031ed79a78cd9746f6740d9fe20\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-r/1.3.0/download\"],\n strip_prefix = \"tree-sitter-r-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-r-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-regex-0.25.0\",\n sha256 = \"bd8a59be9f0ac131fd8f062eaaba14882b2fa5a6a7882a20134cb1d60df2e625\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-regex/0.25.0/download\"],\n strip_prefix = \"tree-sitter-regex-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-regex-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-ruby-0.23.1\",\n sha256 = \"be0484ea4ef6bb9c575b4fdabde7e31340a8d2dbc7d52b321ac83da703249f95\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-ruby/0.23.1/download\"],\n strip_prefix = \"tree-sitter-ruby-0.23.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-ruby-0.23.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-rust-0.24.2\",\n sha256 = \"439e577dbe07423ec2582ac62c7531120dbfccfa6e5f92406f93dd271a120e45\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-rust/0.24.2/download\"],\n strip_prefix = \"tree-sitter-rust-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-rust-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-scala-0.26.0\",\n sha256 = \"de5a4a7ff23a55474ce6a741d52aaeca7a82fe9421bb982b86e98c6ac8629397\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-scala/0.26.0/download\"],\n strip_prefix = \"tree-sitter-scala-0.26.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-scala-0.26.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-sequel-0.3.11\",\n sha256 = \"9d198ad3c319c02e43c21efa1ec796b837afcb96ffaef1a40c1978fbdcec7d17\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-sequel/0.3.11/download\"],\n strip_prefix = \"tree-sitter-sequel-0.3.11\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-sequel-0.3.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-solidity-1.2.13\",\n sha256 = \"4eacf8875b70879f0cb670c60b233ad0b68752d9e1474e6c3ef168eea8a90b25\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-solidity/1.2.13/download\"],\n strip_prefix = \"tree-sitter-solidity-1.2.13\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-solidity-1.2.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-starlark-1.3.0\",\n sha256 = \"8934f282d085cc4b9ee28aa688aa3fbe8aa3766201c2a6252f411d45b4c3a721\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-starlark/1.3.0/download\"],\n strip_prefix = \"tree-sitter-starlark-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-starlark-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-svelte-next-0.1.1\",\n sha256 = \"56f88190d0743e897c3e148a7e241aba0a8844b8afe816943851426e3f7b9753\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-svelte-next/0.1.1/download\"],\n strip_prefix = \"tree-sitter-svelte-next-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-svelte-next-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-swift-0.7.3\",\n sha256 = \"fe36052155b9dd69ca82b3b8f1b4ccfb2d867125ac1a4db1dd7331829242668c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-swift/0.7.3/download\"],\n strip_prefix = \"tree-sitter-swift-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-swift-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-tlaplus-1.5.0\",\n sha256 = \"ddaacc0337bfee38f233a91a704dc36b887a0c385348163f65344d64b73f79e1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-tlaplus/1.5.0/download\"],\n strip_prefix = \"tree-sitter-tlaplus-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-tlaplus-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-toml-ng-0.7.0\",\n sha256 = \"e9adc2c898ae49730e857d75be403da3f92bb81d8e37a2f918a08dd10de5ebb1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-toml-ng/0.7.0/download\"],\n strip_prefix = \"tree-sitter-toml-ng-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-toml-ng-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-typescript-0.23.2\",\n sha256 = \"6c5f76ed8d947a75cc446d5fccd8b602ebf0cde64ccf2ffa434d873d7a575eff\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-typescript/0.23.2/download\"],\n strip_prefix = \"tree-sitter-typescript-0.23.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-typescript-0.23.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-verilog-1.0.3\",\n sha256 = \"d4e7e0360395852f1f6ff5b7b82c72dc6557d181073188df1d60ec469ea69c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-verilog/1.0.3/download\"],\n strip_prefix = \"tree-sitter-verilog-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-verilog-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-vue-next-0.1.0\",\n sha256 = \"e9ac89acaa8165aaabfa8ae9683aa423b0d2bf42c815dae5ca031a36a75525f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-vue-next/0.1.0/download\"],\n strip_prefix = \"tree-sitter-vue-next-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-vue-next-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-xml-0.7.0\",\n sha256 = \"e670041f591d994f54d597ddcd8f4ebc930e282c4c76a42268743b71f0c8b6b3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-xml/0.7.0/download\"],\n strip_prefix = \"tree-sitter-xml-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-xml-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-yaml-0.7.2\",\n sha256 = \"53c223db85f05e34794f065454843b0668ebc15d240ada63e2b5939f43ce7c97\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-yaml/0.7.2/download\"],\n strip_prefix = \"tree-sitter-yaml-0.7.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-yaml-0.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-zig-1.1.2\",\n sha256 = \"ab11fc124851b0db4dd5e55983bbd9631192e93238389dcd44521715e5d53e28\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-zig/1.1.2/download\"],\n strip_prefix = \"tree-sitter-zig-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-zig-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree_magic_mini-3.2.2\",\n sha256 = \"b8765b90061cba6c22b5831f675da109ae5561588290f9fa2317adab2714d5a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree_magic_mini/3.2.2/download\"],\n strip_prefix = \"tree_magic_mini-3.2.2\",\n build_file = Label(\"@crates//crates:BUILD.tree_magic_mini-3.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__triomphe-0.1.16\",\n sha256 = \"b40688ea6389c8171614b25491f71d4a27946e0c7ce2da1c6de27e25abf1a0ae\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/triomphe/0.1.16/download\"],\n strip_prefix = \"triomphe-0.1.16\",\n build_file = Label(\"@crates//crates:BUILD.triomphe-0.1.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ttf-parser-0.25.1\",\n sha256 = \"d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ttf-parser/0.25.1/download\"],\n strip_prefix = \"ttf-parser-0.25.1\",\n build_file = Label(\"@crates//crates:BUILD.ttf-parser-0.25.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__turn-0.17.2\",\n sha256 = \"d99249a493335eb44c4d7943a8751b22561a82c9903d8eb2d29780b3927880a7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/turn/0.17.2/download\"],\n strip_prefix = \"turn-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.turn-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__type-map-0.5.1\",\n sha256 = \"cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/type-map/0.5.1/download\"],\n strip_prefix = \"type-map-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.type-map-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__typed-arena-2.0.2\",\n sha256 = \"6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/typed-arena/2.0.2/download\"],\n strip_prefix = \"typed-arena-2.0.2\",\n build_file = Label(\"@crates//crates:BUILD.typed-arena-2.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__typenum-1.20.1\",\n sha256 = \"b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/typenum/1.20.1/download\"],\n strip_prefix = \"typenum-1.20.1\",\n build_file = Label(\"@crates//crates:BUILD.typenum-1.20.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ucd-trie-0.1.7\",\n sha256 = \"2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ucd-trie/0.1.7/download\"],\n strip_prefix = \"ucd-trie-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.ucd-trie-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uds_windows-1.2.1\",\n sha256 = \"f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uds_windows/1.2.1/download\"],\n strip_prefix = \"uds_windows-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.uds_windows-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uiautomation-0.25.0\",\n sha256 = \"c68495a701b9f2f21f29353ac446f0d27dd0d7ce97aa9ccf9061bca0446cd744\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uiautomation/0.25.0/download\"],\n strip_prefix = \"uiautomation-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.uiautomation-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uiautomation_derive-0.7.8\",\n sha256 = \"ffcc4d404aa1c03a848f95cf5feadc3e63946d7f095bf388770b85550093d388\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uiautomation_derive/0.7.8/download\"],\n strip_prefix = \"uiautomation_derive-0.7.8\",\n build_file = Label(\"@crates//crates:BUILD.uiautomation_derive-0.7.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unic-langid-0.9.6\",\n sha256 = \"a28ba52c9b05311f4f6e62d5d9d46f094bd6e84cb8df7b3ef952748d752a7d05\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unic-langid/0.9.6/download\"],\n strip_prefix = \"unic-langid-0.9.6\",\n build_file = Label(\"@crates//crates:BUILD.unic-langid-0.9.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unic-langid-impl-0.9.6\",\n sha256 = \"dce1bf08044d4b7a94028c93786f8566047edc11110595914de93362559bc658\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unic-langid-impl/0.9.6/download\"],\n strip_prefix = \"unic-langid-impl-0.9.6\",\n build_file = Label(\"@crates//crates:BUILD.unic-langid-impl-0.9.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicase-2.9.0\",\n sha256 = \"dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicase/2.9.0/download\"],\n strip_prefix = \"unicase-2.9.0\",\n build_file = Label(\"@crates//crates:BUILD.unicase-2.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-ident-1.0.24\",\n sha256 = \"e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-ident/1.0.24/download\"],\n strip_prefix = \"unicode-ident-1.0.24\",\n build_file = Label(\"@crates//crates:BUILD.unicode-ident-1.0.24.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-segmentation-1.13.3\",\n sha256 = \"c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-segmentation/1.13.3/download\"],\n strip_prefix = \"unicode-segmentation-1.13.3\",\n build_file = Label(\"@crates//crates:BUILD.unicode-segmentation-1.13.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-width-0.1.14\",\n sha256 = \"7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-width/0.1.14/download\"],\n strip_prefix = \"unicode-width-0.1.14\",\n build_file = Label(\"@crates//crates:BUILD.unicode-width-0.1.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-width-0.2.2\",\n sha256 = \"b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-width/0.2.2/download\"],\n strip_prefix = \"unicode-width-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.unicode-width-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unit-prefix-0.5.2\",\n sha256 = \"81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unit-prefix/0.5.2/download\"],\n strip_prefix = \"unit-prefix-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.unit-prefix-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__universal-hash-0.5.1\",\n sha256 = \"fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/universal-hash/0.5.1/download\"],\n strip_prefix = \"universal-hash-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.universal-hash-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__untrusted-0.9.0\",\n sha256 = \"8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/untrusted/0.9.0/download\"],\n strip_prefix = \"untrusted-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.untrusted-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__url-2.5.8\",\n sha256 = \"ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/url/2.5.8/download\"],\n strip_prefix = \"url-2.5.8\",\n build_file = Label(\"@crates//crates:BUILD.url-2.5.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__urlencoding-2.1.3\",\n sha256 = \"daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/urlencoding/2.1.3/download\"],\n strip_prefix = \"urlencoding-2.1.3\",\n build_file = Label(\"@crates//crates:BUILD.urlencoding-2.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf16_iter-1.0.5\",\n sha256 = \"c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf16_iter/1.0.5/download\"],\n strip_prefix = \"utf16_iter-1.0.5\",\n build_file = Label(\"@crates//crates:BUILD.utf16_iter-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8-chars-3.0.7\",\n sha256 = \"92498c67ea3511b37eccff13b573ed871faf0ce9c4056ab032bd01a681f445a0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8-chars/3.0.7/download\"],\n strip_prefix = \"utf8-chars-3.0.7\",\n build_file = Label(\"@crates//crates:BUILD.utf8-chars-3.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8_iter-1.0.4\",\n sha256 = \"b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8_iter/1.0.4/download\"],\n strip_prefix = \"utf8_iter-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.utf8_iter-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8parse-0.2.2\",\n sha256 = \"06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8parse/0.2.2/download\"],\n strip_prefix = \"utf8parse-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.utf8parse-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore-0.0.30\",\n sha256 = \"71f4e82877d06de779c611a3d54720f56f1e68b228fb30a5b6c66ef07e68263d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore/0.0.30/download\"],\n strip_prefix = \"uucore-0.0.30\",\n build_file = Label(\"@crates//crates:BUILD.uucore-0.0.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore-0.8.0\",\n sha256 = \"07d779636d827cde4100f0e65ff3fd23b0b1f1195055475c6e6813d425f30c8e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore/0.8.0/download\"],\n strip_prefix = \"uucore-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.uucore-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore-0.9.0\",\n sha256 = \"069b34217c27f611e1589f540f58118dbf226a9e407d38ab472052ff075a1dc2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore/0.9.0/download\"],\n strip_prefix = \"uucore-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.uucore-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore_procs-0.0.30\",\n sha256 = \"c72435859e812e602e225dea48d014abb6b1072220a8d44f2fe0565553b1f7e4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore_procs/0.0.30/download\"],\n strip_prefix = \"uucore_procs-0.0.30\",\n build_file = Label(\"@crates//crates:BUILD.uucore_procs-0.0.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore_procs-0.8.0\",\n sha256 = \"da865e8a648b260dbd89fca76d0801995877ab27a4e259b6dec30ba9743b86ab\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore_procs/0.8.0/download\"],\n strip_prefix = \"uucore_procs-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.uucore_procs-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore_procs-0.9.0\",\n sha256 = \"34337da211e7abfff7189b794afb3b5018fe356fb36474b73645458fc1201350\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore_procs/0.9.0/download\"],\n strip_prefix = \"uucore_procs-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.uucore_procs-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uuhelp_parser-0.0.30\",\n sha256 = \"0bb6d972f580f8223cb7052d8580aea2b7061e368cf476de32ea9457b19459ed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uuhelp_parser/0.0.30/download\"],\n strip_prefix = \"uuhelp_parser-0.0.30\",\n build_file = Label(\"@crates//crates:BUILD.uuhelp_parser-0.0.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uuid-1.24.0\",\n sha256 = \"bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uuid/1.24.0/download\"],\n strip_prefix = \"uuid-1.24.0\",\n build_file = Label(\"@crates//crates:BUILD.uuid-1.24.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uutils_term_grid-0.8.0\",\n sha256 = \"382d49b39de4a115f203305057741126b09a615892d773a2d419a2b816e30e39\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uutils_term_grid/0.8.0/download\"],\n strip_prefix = \"uutils_term_grid-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.uutils_term_grid-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uzers-0.12.2\",\n sha256 = \"0b8275fb1afee25b4111d2dc8b5c505dbbc4afd0b990cb96deb2d88bff8be18d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uzers/0.12.2/download\"],\n strip_prefix = \"uzers-0.12.2\",\n build_file = Label(\"@crates//crates:BUILD.uzers-0.12.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__version-compare-0.2.1\",\n sha256 = \"03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/version-compare/0.2.1/download\"],\n strip_prefix = \"version-compare-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.version-compare-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__version_check-0.9.5\",\n sha256 = \"0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/version_check/0.9.5/download\"],\n strip_prefix = \"version_check-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.version_check-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__vsimd-0.8.0\",\n sha256 = \"5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/vsimd/0.8.0/download\"],\n strip_prefix = \"vsimd-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.vsimd-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__waitgroup-0.1.2\",\n sha256 = \"d1f50000a783467e6c0200f9d10642f4bc424e39efc1b770203e88b488f79292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/waitgroup/0.1.2/download\"],\n strip_prefix = \"waitgroup-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.waitgroup-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__walkdir-2.5.0\",\n sha256 = \"29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/walkdir/2.5.0/download\"],\n strip_prefix = \"walkdir-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.walkdir-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.11.1-wasi-snapshot-preview1\",\n sha256 = \"ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download\"],\n strip_prefix = \"wasi-0.11.1+wasi-snapshot-preview1\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.14.7-wasi-0.2.4\",\n sha256 = \"883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.14.7+wasi-0.2.4/download\"],\n strip_prefix = \"wasi-0.14.7+wasi-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.14.7+wasi-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasip2-1.0.4-wasi-0.2.12\",\n sha256 = \"b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasip2/1.0.4+wasi-0.2.12/download\"],\n strip_prefix = \"wasip2-1.0.4+wasi-0.2.12\",\n build_file = Label(\"@crates//crates:BUILD.wasip2-1.0.4+wasi-0.2.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasite-1.0.2\",\n sha256 = \"66fe902b4a6b8028a753d5424909b764ccf79b7a209eac9bf97e59cda9f71a42\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasite/1.0.2/download\"],\n strip_prefix = \"wasite-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.wasite-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-0.2.126\",\n sha256 = \"4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-0.2.126\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-0.2.126\",\n sha256 = \"167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-macro-0.2.126\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-support-0.2.126\",\n sha256 = \"f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-macro-support-0.2.126\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-support-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-shared-0.2.126\",\n sha256 = \"dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-shared/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-shared-0.2.126\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-shared-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-backend-0.3.16\",\n sha256 = \"016ccf01d1c58b6f8999612813e17c9b2390f7d70671428869913310f83f54b8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-backend/0.3.16/download\"],\n strip_prefix = \"wayland-backend-0.3.16\",\n build_file = Label(\"@crates//crates:BUILD.wayland-backend-0.3.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-client-0.31.15\",\n sha256 = \"e3c36a0f861ad76d0901f2800b46321410d9f73f2ea88aac0650d86c32688073\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-client/0.31.15/download\"],\n strip_prefix = \"wayland-client-0.31.15\",\n build_file = Label(\"@crates//crates:BUILD.wayland-client-0.31.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-protocols-0.32.13\",\n sha256 = \"23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-protocols/0.32.13/download\"],\n strip_prefix = \"wayland-protocols-0.32.13\",\n build_file = Label(\"@crates//crates:BUILD.wayland-protocols-0.32.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-protocols-wlr-0.3.12\",\n sha256 = \"eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-protocols-wlr/0.3.12/download\"],\n strip_prefix = \"wayland-protocols-wlr-0.3.12\",\n build_file = Label(\"@crates//crates:BUILD.wayland-protocols-wlr-0.3.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-scanner-0.31.11\",\n sha256 = \"338e30461b3a2b67d70eb30a6d89f8e0c93a833e07d2ae89085cd070c4a00ac0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-scanner/0.31.11/download\"],\n strip_prefix = \"wayland-scanner-0.31.11\",\n build_file = Label(\"@crates//crates:BUILD.wayland-scanner-0.31.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-server-0.31.14\",\n sha256 = \"0dde9c29be0f723a573977de51ee455bf3dfa03652730a74f9dd3b337e374d75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-server/0.31.14/download\"],\n strip_prefix = \"wayland-server-0.31.14\",\n build_file = Label(\"@crates//crates:BUILD.wayland-server-0.31.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-sys-0.31.11\",\n sha256 = \"d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-sys/0.31.11/download\"],\n strip_prefix = \"wayland-sys-0.31.11\",\n build_file = Label(\"@crates//crates:BUILD.wayland-sys-0.31.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__web-sys-0.3.103\",\n sha256 = \"8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/web-sys/0.3.103/download\"],\n strip_prefix = \"web-sys-0.3.103\",\n build_file = Label(\"@crates//crates:BUILD.web-sys-0.3.103.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__web-time-1.1.0\",\n sha256 = \"5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/web-time/1.1.0/download\"],\n strip_prefix = \"web-time-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.web-time-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__web_atoms-0.2.5\",\n sha256 = \"075474b12bcb3d2e3d4546580e9de478eeeead668a1761e2a8860c836b7ef297\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/web_atoms/0.2.5/download\"],\n strip_prefix = \"web_atoms-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.web_atoms-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-0.17.2\",\n sha256 = \"baaacdf9d96224d7b6e2872ba065578f38775f7634367e3ac2cc87c7271da433\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc/0.17.2/download\"],\n strip_prefix = \"webrtc-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-data-0.17.2\",\n sha256 = \"bd470286275809f2fcfcdb1e73ef5f1500be82eff7fe98150ce81b20aad5a2a4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-data/0.17.2/download\"],\n strip_prefix = \"webrtc-data-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-data-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-ice-0.17.2\",\n sha256 = \"5b7fd30f52e6fda8664779b84b7904b2553b76fee24d9ca665e774ae32b13f53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-ice/0.17.2/download\"],\n strip_prefix = \"webrtc-ice-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-ice-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-mdns-0.17.2\",\n sha256 = \"91ffa0ea00c0fae979aafa5db285fec5eeb360e1ea246ebec529ba4e09f8e03e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-mdns/0.17.2/download\"],\n strip_prefix = \"webrtc-mdns-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-mdns-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-media-0.17.2\",\n sha256 = \"26a6c7335bdd03dc023cb9a3bd7966866d969c92c86987b73aa16dfa39c7ca29\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-media/0.17.2/download\"],\n strip_prefix = \"webrtc-media-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-media-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-sctp-0.17.2\",\n sha256 = \"1c4b637f0d8eb96d900ac0f79b3060ddd21ca88dfefa467e96e67ab0016f2574\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-sctp/0.17.2/download\"],\n strip_prefix = \"webrtc-sctp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-sctp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-srtp-0.17.2\",\n sha256 = \"45d2b667a0b5d04eebcb7cb22fd51b2af3721f418097b496e72de16386c8d0c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-srtp/0.17.2/download\"],\n strip_prefix = \"webrtc-srtp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-srtp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-util-0.17.2\",\n sha256 = \"1beae0b4f24969741c26ca282a257dc5823bd9cbe608f7e3ca3775102d323ad9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-util/0.17.2/download\"],\n strip_prefix = \"webrtc-util-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-util-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__weezl-0.1.12\",\n sha256 = \"a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/weezl/0.1.12/download\"],\n strip_prefix = \"weezl-0.1.12\",\n build_file = Label(\"@crates//crates:BUILD.weezl-0.1.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__whoami-2.1.2\",\n sha256 = \"998767ef88740d1f5b0682a9c53c24431453923962269c2db68ee43788c5a40d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/whoami/2.1.2/download\"],\n strip_prefix = \"whoami-2.1.2\",\n build_file = Label(\"@crates//crates:BUILD.whoami-2.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wide-0.8.3\",\n sha256 = \"13ca908d26e4786149c48efcf6c0ea09ab0e06d1fe3c17dc1b4b0f1ca4a7e788\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wide/0.8.3/download\"],\n strip_prefix = \"wide-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.wide-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__widestring-1.2.1\",\n sha256 = \"72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/widestring/1.2.1/download\"],\n strip_prefix = \"widestring-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.widestring-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wild-2.2.1\",\n sha256 = \"a3131afc8c575281e1e80f36ed6a092aa502c08b18ed7524e86fbbb12bb410e1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wild/2.2.1/download\"],\n strip_prefix = \"wild-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.wild-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-0.3.9\",\n sha256 = \"5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi/0.3.9/download\"],\n strip_prefix = \"winapi-0.3.9\",\n build_file = Label(\"@crates//crates:BUILD.winapi-0.3.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-i686-pc-windows-gnu-0.4.0\",\n sha256 = \"ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-i686-pc-windows-gnu/0.4.0/download\"],\n strip_prefix = \"winapi-i686-pc-windows-gnu-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.winapi-i686-pc-windows-gnu-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-util-0.1.11\",\n sha256 = \"c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-util/0.1.11/download\"],\n strip_prefix = \"winapi-util-0.1.11\",\n build_file = Label(\"@crates//crates:BUILD.winapi-util-0.1.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-x86_64-pc-windows-gnu-0.4.0\",\n sha256 = \"712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download\"],\n strip_prefix = \"winapi-x86_64-pc-windows-gnu-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.winapi-x86_64-pc-windows-gnu-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-0.51.1\",\n sha256 = \"ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows/0.51.1/download\"],\n strip_prefix = \"windows-0.51.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-0.51.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-0.61.3\",\n sha256 = \"9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows/0.61.3/download\"],\n strip_prefix = \"windows-0.61.3\",\n build_file = Label(\"@crates//crates:BUILD.windows-0.61.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-0.62.2\",\n sha256 = \"527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows/0.62.2/download\"],\n strip_prefix = \"windows-0.62.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-0.62.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-collections-0.2.0\",\n sha256 = \"3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-collections/0.2.0/download\"],\n strip_prefix = \"windows-collections-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-collections-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-collections-0.3.2\",\n sha256 = \"23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-collections/0.3.2/download\"],\n strip_prefix = \"windows-collections-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-collections-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-core-0.51.1\",\n sha256 = \"f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-core/0.51.1/download\"],\n strip_prefix = \"windows-core-0.51.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-core-0.51.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-core-0.61.2\",\n sha256 = \"c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-core/0.61.2/download\"],\n strip_prefix = \"windows-core-0.61.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-core-0.61.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-core-0.62.2\",\n sha256 = \"b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-core/0.62.2/download\"],\n strip_prefix = \"windows-core-0.62.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-core-0.62.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-future-0.2.1\",\n sha256 = \"fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-future/0.2.1/download\"],\n strip_prefix = \"windows-future-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-future-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-future-0.3.2\",\n sha256 = \"e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-future/0.3.2/download\"],\n strip_prefix = \"windows-future-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-future-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-implement-0.60.2\",\n sha256 = \"053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-implement/0.60.2/download\"],\n strip_prefix = \"windows-implement-0.60.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-implement-0.60.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-interface-0.59.3\",\n sha256 = \"3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-interface/0.59.3/download\"],\n strip_prefix = \"windows-interface-0.59.3\",\n build_file = Label(\"@crates//crates:BUILD.windows-interface-0.59.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-link-0.1.3\",\n sha256 = \"5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-link/0.1.3/download\"],\n strip_prefix = \"windows-link-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.windows-link-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-link-0.2.1\",\n sha256 = \"f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-link/0.2.1/download\"],\n strip_prefix = \"windows-link-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-link-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-numerics-0.2.0\",\n sha256 = \"9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-numerics/0.2.0/download\"],\n strip_prefix = \"windows-numerics-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-numerics-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-numerics-0.3.1\",\n sha256 = \"6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-numerics/0.3.1/download\"],\n strip_prefix = \"windows-numerics-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-numerics-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-result-0.3.4\",\n sha256 = \"56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-result/0.3.4/download\"],\n strip_prefix = \"windows-result-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.windows-result-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-result-0.4.1\",\n sha256 = \"7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-result/0.4.1/download\"],\n strip_prefix = \"windows-result-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-result-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-strings-0.4.2\",\n sha256 = \"56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-strings/0.4.2/download\"],\n strip_prefix = \"windows-strings-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-strings-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-strings-0.5.1\",\n sha256 = \"7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-strings/0.5.1/download\"],\n strip_prefix = \"windows-strings-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-strings-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.52.0\",\n sha256 = \"282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.52.0/download\"],\n strip_prefix = \"windows-sys-0.52.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.52.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.59.0\",\n sha256 = \"1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.59.0/download\"],\n strip_prefix = \"windows-sys-0.59.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.59.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.60.2\",\n sha256 = \"f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.60.2/download\"],\n strip_prefix = \"windows-sys-0.60.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.60.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.61.2\",\n sha256 = \"ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.61.2/download\"],\n strip_prefix = \"windows-sys-0.61.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.61.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.48.5\",\n sha256 = \"9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.48.5/download\"],\n strip_prefix = \"windows-targets-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.52.6\",\n sha256 = \"9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.52.6/download\"],\n strip_prefix = \"windows-targets-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.53.5\",\n sha256 = \"4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.53.5/download\"],\n strip_prefix = \"windows-targets-0.53.5\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.53.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-threading-0.1.0\",\n sha256 = \"b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-threading/0.1.0/download\"],\n strip_prefix = \"windows-threading-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-threading-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-threading-0.2.1\",\n sha256 = \"3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-threading/0.2.1/download\"],\n strip_prefix = \"windows-threading-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-threading-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.48.5\",\n sha256 = \"2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.52.6\",\n sha256 = \"32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.53.1\",\n sha256 = \"a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.48.5\",\n sha256 = \"dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.52.6\",\n sha256 = \"09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.53.1\",\n sha256 = \"b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.53.1/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.48.5\",\n sha256 = \"a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.48.5/download\"],\n strip_prefix = \"windows_i686_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.52.6\",\n sha256 = \"8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.53.1\",\n sha256 = \"960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.53.1/download\"],\n strip_prefix = \"windows_i686_gnu-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.52.6\",\n sha256 = \"0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.53.1\",\n sha256 = \"fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.48.5\",\n sha256 = \"8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.48.5/download\"],\n strip_prefix = \"windows_i686_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.52.6\",\n sha256 = \"240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.52.6/download\"],\n strip_prefix = \"windows_i686_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.53.1\",\n sha256 = \"1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.53.1/download\"],\n strip_prefix = \"windows_i686_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.48.5\",\n sha256 = \"53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.52.6\",\n sha256 = \"147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.53.1\",\n sha256 = \"9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.48.5\",\n sha256 = \"0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.52.6\",\n sha256 = \"24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.53.1\",\n sha256 = \"0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.48.5\",\n sha256 = \"ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.52.6\",\n sha256 = \"589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.53.1\",\n sha256 = \"d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winnow-0.7.15\",\n sha256 = \"df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winnow/0.7.15/download\"],\n strip_prefix = \"winnow-0.7.15\",\n build_file = Label(\"@crates//crates:BUILD.winnow-0.7.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winnow-1.0.4\",\n sha256 = \"23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winnow/1.0.4/download\"],\n strip_prefix = \"winnow-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.winnow-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winreg-0.10.1\",\n sha256 = \"80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winreg/0.10.1/download\"],\n strip_prefix = \"winreg-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.winreg-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winreg-0.56.0\",\n sha256 = \"7d6f32a0ff4a9f6f01231eb2059cc85479330739333e0e58cadf03b6af2cca10\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winreg/0.56.0/download\"],\n strip_prefix = \"winreg-0.56.0\",\n build_file = Label(\"@crates//crates:BUILD.winreg-0.56.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-0.57.1\",\n sha256 = \"1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen/0.57.1/download\"],\n strip_prefix = \"wit-bindgen-0.57.1\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-0.57.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wl-clipboard-rs-0.9.3\",\n sha256 = \"e9651471a32e87d96ef3a127715382b2d11cc7c8bb9822ded8a7cc94072eb0a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wl-clipboard-rs/0.9.3/download\"],\n strip_prefix = \"wl-clipboard-rs-0.9.3\",\n build_file = Label(\"@crates//crates:BUILD.wl-clipboard-rs-0.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__write16-1.0.0\",\n sha256 = \"d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/write16/1.0.0/download\"],\n strip_prefix = \"write16-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.write16-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__writeable-0.6.3\",\n sha256 = \"1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/writeable/0.6.3/download\"],\n strip_prefix = \"writeable-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.writeable-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wyz-0.5.1\",\n sha256 = \"05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wyz/0.5.1/download\"],\n strip_prefix = \"wyz-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.wyz-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__x11rb-0.13.2\",\n sha256 = \"9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/x11rb/0.13.2/download\"],\n strip_prefix = \"x11rb-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.x11rb-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__x11rb-protocol-0.13.2\",\n sha256 = \"ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/x11rb-protocol/0.13.2/download\"],\n strip_prefix = \"x11rb-protocol-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.x11rb-protocol-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__x25519-dalek-2.0.1\",\n sha256 = \"c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/x25519-dalek/2.0.1/download\"],\n strip_prefix = \"x25519-dalek-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.x25519-dalek-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__x509-parser-0.16.0\",\n sha256 = \"fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/x509-parser/0.16.0/download\"],\n strip_prefix = \"x509-parser-0.16.0\",\n build_file = Label(\"@crates//crates:BUILD.x509-parser-0.16.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xattr-1.6.1\",\n sha256 = \"32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xattr/1.6.1/download\"],\n strip_prefix = \"xattr-1.6.1\",\n build_file = Label(\"@crates//crates:BUILD.xattr-1.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xcap-0.9.6\",\n sha256 = \"b6ad471d5ba232bc276382d26a9d3b837d6853b7df389058b5bb1e94dcdd248c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xcap/0.9.6/download\"],\n strip_prefix = \"xcap-0.9.6\",\n build_file = Label(\"@crates//crates:BUILD.xcap-0.9.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xcb-1.7.0\",\n sha256 = \"ee4c580d8205abb0a5cf4eb7e927bd664e425b6c3263f9c5310583da96970cf6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xcb/1.7.0/download\"],\n strip_prefix = \"xcb-1.7.0\",\n build_file = Label(\"@crates//crates:BUILD.xcb-1.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xkbcommon-0.9.0\",\n sha256 = \"a7a974f48060a14e95705c01f24ad9c3345022f4d97441b8a36beb7ed5c4a02d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xkbcommon/0.9.0/download\"],\n strip_prefix = \"xkbcommon-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.xkbcommon-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xkeysym-0.2.1\",\n sha256 = \"b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xkeysym/0.2.1/download\"],\n strip_prefix = \"xkeysym-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.xkeysym-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xml-rs-0.8.29\",\n sha256 = \"e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xml-rs/0.8.29/download\"],\n strip_prefix = \"xml-rs-0.8.29\",\n build_file = Label(\"@crates//crates:BUILD.xml-rs-0.8.29.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xxhash-rust-0.8.18\",\n sha256 = \"aee1b19627c7c60102ab80d3a9cbe18de90bfe03bfa6c3715447681f0e8c8af6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xxhash-rust/0.8.18/download\"],\n strip_prefix = \"xxhash-rust-0.8.18\",\n build_file = Label(\"@crates//crates:BUILD.xxhash-rust-0.8.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yaml-rust-0.4.5\",\n sha256 = \"56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yaml-rust/0.4.5/download\"],\n strip_prefix = \"yaml-rust-0.4.5\",\n build_file = Label(\"@crates//crates:BUILD.yaml-rust-0.4.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yansi-1.0.1\",\n sha256 = \"cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yansi/1.0.1/download\"],\n strip_prefix = \"yansi-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.yansi-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yasna-0.5.2\",\n sha256 = \"e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yasna/0.5.2/download\"],\n strip_prefix = \"yasna-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.yasna-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-0.8.3\",\n sha256 = \"709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke/0.8.3/download\"],\n strip_prefix = \"yoke-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.yoke-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-derive-0.8.2\",\n sha256 = \"de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke-derive/0.8.2/download\"],\n strip_prefix = \"yoke-derive-0.8.2\",\n build_file = Label(\"@crates//crates:BUILD.yoke-derive-0.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__z85-3.0.7\",\n sha256 = \"c6e61e59a957b7ccee15d2049f86e8bfd6f66968fcd88f018950662d9b86e675\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/z85/3.0.7/download\"],\n strip_prefix = \"z85-3.0.7\",\n build_file = Label(\"@crates//crates:BUILD.z85-3.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus-5.18.0\",\n sha256 = \"fe18fb60dc696039e738717b76eaea21e7a4489bbb1885020b43c94236d7e98a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus/5.18.0/download\"],\n strip_prefix = \"zbus-5.18.0\",\n build_file = Label(\"@crates//crates:BUILD.zbus-5.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus-lockstep-0.5.2\",\n sha256 = \"6998de05217a084b7578728a9443d04ea4cd80f2a0839b8d78770b76ccd45863\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus-lockstep/0.5.2/download\"],\n strip_prefix = \"zbus-lockstep-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.zbus-lockstep-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus-lockstep-macros-0.5.2\",\n sha256 = \"10da05367f3a7b7553c8cdf8fa91aee6b64afebe32b51c95177957efc47ca3a0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus-lockstep-macros/0.5.2/download\"],\n strip_prefix = \"zbus-lockstep-macros-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.zbus-lockstep-macros-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus_macros-5.18.0\",\n sha256 = \"fe96480bed92df2b442a1a30df364e12d08eed03aeb061f2b8dc6afb2be91119\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus_macros/5.18.0/download\"],\n strip_prefix = \"zbus_macros-5.18.0\",\n build_file = Label(\"@crates//crates:BUILD.zbus_macros-5.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus_names-4.3.4\",\n sha256 = \"d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus_names/4.3.4/download\"],\n strip_prefix = \"zbus_names-4.3.4\",\n build_file = Label(\"@crates//crates:BUILD.zbus_names-4.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus_xml-5.2.1\",\n sha256 = \"d1586c021a01ca0a9216dcd874e546382e156a5cbab5fab6cb5f10087e22682a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus_xml/5.2.1/download\"],\n strip_prefix = \"zbus_xml-5.2.1\",\n build_file = Label(\"@crates//crates:BUILD.zbus_xml-5.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-0.8.56\",\n sha256 = \"556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy/0.8.56/download\"],\n strip_prefix = \"zerocopy-0.8.56\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-0.8.56.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-derive-0.8.56\",\n sha256 = \"f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy-derive/0.8.56/download\"],\n strip_prefix = \"zerocopy-derive-0.8.56\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-derive-0.8.56.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-0.1.8\",\n sha256 = \"0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom/0.1.8/download\"],\n strip_prefix = \"zerofrom-0.1.8\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-0.1.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-derive-0.1.7\",\n sha256 = \"11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom-derive/0.1.7/download\"],\n strip_prefix = \"zerofrom-derive-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-derive-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zeroize-1.9.0\",\n sha256 = \"e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zeroize/1.9.0/download\"],\n strip_prefix = \"zeroize-1.9.0\",\n build_file = Label(\"@crates//crates:BUILD.zeroize-1.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zeroize_derive-1.5.0\",\n sha256 = \"3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zeroize_derive/1.5.0/download\"],\n strip_prefix = \"zeroize_derive-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.zeroize_derive-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerotrie-0.2.4\",\n sha256 = \"0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerotrie/0.2.4/download\"],\n strip_prefix = \"zerotrie-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.zerotrie-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-0.11.6\",\n sha256 = \"90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec/0.11.6/download\"],\n strip_prefix = \"zerovec-0.11.6\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-0.11.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-derive-0.11.3\",\n sha256 = \"625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec-derive/0.11.3/download\"],\n strip_prefix = \"zerovec-derive-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-derive-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zmij-1.0.23\",\n sha256 = \"29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zmij/1.0.23/download\"],\n strip_prefix = \"zmij-1.0.23\",\n build_file = Label(\"@crates//crates:BUILD.zmij-1.0.23.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zune-core-0.5.3\",\n sha256 = \"d56377fd46368984a170bc5aac5567e52ca5da874caa60bea39fcbca78fb658b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zune-core/0.5.3/download\"],\n strip_prefix = \"zune-core-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.zune-core-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zune-jpeg-0.5.15\",\n sha256 = \"27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zune-jpeg/0.5.15/download\"],\n strip_prefix = \"zune-jpeg-0.5.15\",\n build_file = Label(\"@crates//crates:BUILD.zune-jpeg-0.5.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zvariant-5.13.1\",\n sha256 = \"bee2a0bcd2a907786a456fff45aaaaf54c9ba5f50b71ae9ec1a4edd200c94911\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zvariant/5.13.1/download\"],\n strip_prefix = \"zvariant-5.13.1\",\n build_file = Label(\"@crates//crates:BUILD.zvariant-5.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zvariant_derive-5.13.1\",\n sha256 = \"38a708216a18780796770bfe3f4739c7c83a3e8f789b755534bbbc06e4e23e12\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zvariant_derive/5.13.1/download\"],\n strip_prefix = \"zvariant_derive-5.13.1\",\n build_file = Label(\"@crates//crates:BUILD.zvariant_derive-5.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zvariant_utils-3.5.0\",\n sha256 = \"90cb9383f9b45290407a1258b202d3f8f01db719eb60b4e4055c6375af4fc7c7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zvariant_utils/3.5.0/download\"],\n strip_prefix = \"zvariant_utils-3.5.0\",\n build_file = Label(\"@crates//crates:BUILD.zvariant_utils-3.5.0.bazel\"),\n )\n\n return [\n struct(repo = \"crates\", is_dev_dep = False),\n struct(repo=\"crates__ansi-width-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__anyhow-1.0.104\", is_dev_dep = False),\n struct(repo=\"crates__arboard-3.6.1\", is_dev_dep = False),\n struct(repo=\"crates__argmax-0.3.1\", is_dev_dep = False),\n struct(repo=\"crates__ashpd-0.11.1\", is_dev_dep = False),\n struct(repo=\"crates__ast-grep-core-0.39.9\", is_dev_dep = False),\n struct(repo=\"crates__async-recursion-1.1.1\", is_dev_dep = False),\n struct(repo=\"crates__async-trait-0.1.91\", is_dev_dep = False),\n struct(repo=\"crates__atspi-0.30.0\", is_dev_dep = False),\n struct(repo=\"crates__audiopus_sys-0.2.2\", is_dev_dep = False),\n struct(repo=\"crates__base64-0.22.1\", is_dev_dep = False),\n struct(repo=\"crates__base64-simd-0.8.0\", is_dev_dep = False),\n struct(repo=\"crates__bigdecimal-0.4.10\", is_dev_dep = False),\n struct(repo=\"crates__binary-heap-plus-0.5.0\", is_dev_dep = False),\n struct(repo=\"crates__bon-3.9.3\", is_dev_dep = False),\n struct(repo=\"crates__brush-parser-0.3.0\", is_dev_dep = False),\n struct(repo=\"crates__brush-parser-0.4.0\", is_dev_dep = False),\n struct(repo=\"crates__bstr-1.13.0\", is_dev_dep = False),\n struct(repo=\"crates__bytecount-0.6.9\", is_dev_dep = False),\n struct(repo=\"crates__bytes-1.12.1\", is_dev_dep = False),\n struct(repo=\"crates__cached-0.59.0\", is_dev_dep = False),\n struct(repo=\"crates__cfg-if-1.0.4\", is_dev_dep = False),\n struct(repo=\"crates__check_elevation-0.2.7\", is_dev_dep = False),\n struct(repo=\"crates__chrono-0.4.45\", is_dev_dep = False),\n struct(repo=\"crates__clap-4.6.6\", is_dev_dep = False),\n struct(repo=\"crates__clipboard-win-5.4.1\", is_dev_dep = False),\n struct(repo=\"crates__codesnake-0.2.1\", is_dev_dep = False),\n struct(repo=\"crates__color-print-0.3.7\", is_dev_dep = False),\n struct(repo=\"crates__command-fds-0.3.3\", is_dev_dep = False),\n struct(repo=\"crates__compare-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__core-graphics-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__dashmap-6.2.1\", is_dev_dep = False),\n struct(repo=\"crates__dns-lookup-3.0.1\", is_dev_dep = False),\n struct(repo=\"crates__enigo-0.6.1\", is_dev_dep = False),\n struct(repo=\"crates__faccess-0.2.4\", is_dev_dep = False),\n struct(repo=\"crates__fancy-regex-0.17.0\", is_dev_dep = False),\n struct(repo=\"crates__fancy-regex-0.18.0\", is_dev_dep = False),\n struct(repo=\"crates__filetime-0.2.29\", is_dev_dep = False),\n struct(repo=\"crates__flume-0.11.1\", is_dev_dep = False),\n struct(repo=\"crates__foldhash-0.2.0\", is_dev_dep = False),\n struct(repo=\"crates__fontdue-0.9.4\", is_dev_dep = False),\n struct(repo=\"crates__foreign-types-0.5.0\", is_dev_dep = False),\n struct(repo=\"crates__fs_extra-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__futures-0.3.33\", is_dev_dep = False),\n struct(repo=\"crates__getrandom-0.4.3\", is_dev_dep = False),\n struct(repo=\"crates__glob-0.3.4\", is_dev_dep = False),\n struct(repo=\"crates__globset-0.4.20\", is_dev_dep = False),\n struct(repo=\"crates__grep-cli-0.1.12\", is_dev_dep = False),\n struct(repo=\"crates__grep-matcher-0.1.9\", is_dev_dep = False),\n struct(repo=\"crates__grep-pcre2-0.1.10\", is_dev_dep = False),\n struct(repo=\"crates__grep-printer-0.3.1\", is_dev_dep = False),\n struct(repo=\"crates__grep-regex-0.1.14\", is_dev_dep = False),\n struct(repo=\"crates__grep-searcher-0.1.17\", is_dev_dep = False),\n struct(repo=\"crates__hex-0.4.3\", is_dev_dep = False),\n struct(repo=\"crates__hifijson-0.2.3\", is_dev_dep = False),\n struct(repo=\"crates__hostname-0.4.2\", is_dev_dep = False),\n struct(repo=\"crates__html-to-markdown-rs-3.10.6\", is_dev_dep = False),\n struct(repo=\"crates__icy_sixel-0.5.0\", is_dev_dep = False),\n struct(repo=\"crates__ignore-0.4.33\", is_dev_dep = False),\n struct(repo=\"crates__image-0.25.10\", is_dev_dep = False),\n struct(repo=\"crates__indicatif-0.18.6\", is_dev_dep = False),\n struct(repo=\"crates__inferno-0.12.8\", is_dev_dep = False),\n struct(repo=\"crates__inherent-1.0.14\", is_dev_dep = False),\n struct(repo=\"crates__itertools-0.14.0\", is_dev_dep = False),\n struct(repo=\"crates__jaq-core-2.2.1\", is_dev_dep = False),\n struct(repo=\"crates__jaq-json-1.1.3\", is_dev_dep = False),\n struct(repo=\"crates__jaq-std-2.1.2\", is_dev_dep = False),\n struct(repo=\"crates__jiff-0.2.35\", is_dev_dep = False),\n struct(repo=\"crates__libc-0.2.189\", is_dev_dep = False),\n struct(repo=\"crates__lscolors-0.21.0\", is_dev_dep = False),\n struct(repo=\"crates__memchr-2.8.3\", is_dev_dep = False),\n struct(repo=\"crates__memmap2-0.9.11\", is_dev_dep = False),\n struct(repo=\"crates__napi-3.12.0\", is_dev_dep = False),\n struct(repo=\"crates__napi-build-2.4.0\", is_dev_dep = False),\n struct(repo=\"crates__napi-derive-3.6.2\", is_dev_dep = False),\n struct(repo=\"crates__nix-0.29.0\", is_dev_dep = False),\n struct(repo=\"crates__nix-0.31.3\", is_dev_dep = False),\n struct(repo=\"crates__nom-8.0.0\", is_dev_dep = False),\n struct(repo=\"crates__normalize-path-0.2.1\", is_dev_dep = False),\n struct(repo=\"crates__notify-8.2.0\", is_dev_dep = False),\n struct(repo=\"crates__num-bigint-0.4.8\", is_dev_dep = False),\n struct(repo=\"crates__num-traits-0.2.19\", is_dev_dep = False),\n struct(repo=\"crates__objc2-app-kit-0.3.2\", is_dev_dep = False),\n struct(repo=\"crates__objc2-application-services-0.3.2\", is_dev_dep = False),\n struct(repo=\"crates__objc2-core-foundation-0.3.2\", is_dev_dep = False),\n struct(repo=\"crates__objc2-core-graphics-0.3.2\", is_dev_dep = False),\n struct(repo=\"crates__objc2-foundation-0.3.2\", is_dev_dep = False),\n struct(repo=\"crates__onig-6.5.3\", is_dev_dep = False),\n struct(repo=\"crates__opus-0.3.1\", is_dev_dep = False),\n struct(repo=\"crates__os_display-0.1.4\", is_dev_dep = False),\n struct(repo=\"crates__os_pipe-1.2.3\", is_dev_dep = False),\n struct(repo=\"crates__parking_lot-0.12.5\", is_dev_dep = False),\n struct(repo=\"crates__parse_datetime-0.14.0\", is_dev_dep = False),\n struct(repo=\"crates__phf-0.13.1\", is_dev_dep = False),\n struct(repo=\"crates__platform-info-2.1.0\", is_dev_dep = False),\n struct(repo=\"crates__png-0.18.1\", is_dev_dep = False),\n struct(repo=\"crates__portable-pty-0.9.0\", is_dev_dep = False),\n struct(repo=\"crates__procfs-0.18.0\", is_dev_dep = False),\n struct(repo=\"crates__rand-0.10.2\", is_dev_dep = False),\n struct(repo=\"crates__rayon-1.12.0\", is_dev_dep = False),\n struct(repo=\"crates__regex-1.13.1\", is_dev_dep = False),\n struct(repo=\"crates__reis-0.5.0\", is_dev_dep = False),\n struct(repo=\"crates__rlimit-0.11.0\", is_dev_dep = False),\n struct(repo=\"crates__rpds-1.2.1\", is_dev_dep = False),\n struct(repo=\"crates__rustc-hash-2.1.3\", is_dev_dep = False),\n struct(repo=\"crates__rustix-1.1.4\", is_dev_dep = False),\n struct(repo=\"crates__self_cell-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__serde-1.0.229\", is_dev_dep = False),\n struct(repo=\"crates__serde_json-1.0.151\", is_dev_dep = False),\n struct(repo=\"crates__similar-3.1.2\", is_dev_dep = False),\n struct(repo=\"crates__smallvec-1.15.2\", is_dev_dep = False),\n struct(repo=\"crates__strum-0.28.0\", is_dev_dep = False),\n struct(repo=\"crates__strum_macros-0.28.0\", is_dev_dep = False),\n struct(repo=\"crates__syntect-5.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tempfile-3.27.0\", is_dev_dep = False),\n struct(repo=\"crates__terminfo-0.9.0\", is_dev_dep = False),\n struct(repo=\"crates__thiserror-2.0.19\", is_dev_dep = False),\n struct(repo=\"crates__tiktoken-rs-0.11.0\", is_dev_dep = False),\n struct(repo=\"crates__tokio-1.53.1\", is_dev_dep = False),\n struct(repo=\"crates__tokio-util-0.7.19\", is_dev_dep = False),\n struct(repo=\"crates__toml-1.1.4-spec-1.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tracing-0.1.44\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-0.25.10\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-astro-next-0.1.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-bash-0.25.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-c-0.24.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-c-sharp-0.23.5\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-clojure-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-cmake-0.7.4\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-cpp-0.23.4\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-css-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-dart-0.2.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-diff-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-dockerfile-updated-0.2.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-elisp-1.7.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-elixir-0.3.5\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-erlang-0.16.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-fortran-0.6.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-go-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-graphql-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-haskell-0.23.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-hcl-1.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-html-0.23.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-ini-1.4.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-java-0.23.5\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-javascript-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-json-0.24.8\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-julia-0.23.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-just-0.2.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-kotlin-sg-0.4.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-lua-0.5.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-make-1.1.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-md-0.5.3\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-nix-0.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-objc-3.0.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-ocaml-0.24.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-odin-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-php-0.24.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-powershell-0.26.4\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-proto-0.4.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-python-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-r-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-regex-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-ruby-0.23.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-rust-0.24.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-scala-0.26.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-sequel-0.3.11\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-solidity-1.2.13\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-starlark-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-svelte-next-0.1.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-swift-0.7.3\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-tlaplus-1.5.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-toml-ng-0.7.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-typescript-0.23.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-verilog-1.0.3\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-vue-next-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-xml-0.7.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-yaml-0.7.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-zig-1.1.2\", is_dev_dep = False),\n struct(repo=\"crates__uiautomation-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__unicode-segmentation-1.13.3\", is_dev_dep = False),\n struct(repo=\"crates__unicode-width-0.1.14\", is_dev_dep = False),\n struct(repo=\"crates__unicode-width-0.2.2\", is_dev_dep = False),\n struct(repo=\"crates__uucore-0.0.30\", is_dev_dep = False),\n struct(repo=\"crates__uucore-0.8.0\", is_dev_dep = False),\n struct(repo=\"crates__uucore-0.9.0\", is_dev_dep = False),\n struct(repo=\"crates__uuid-1.24.0\", is_dev_dep = False),\n struct(repo=\"crates__uutils_term_grid-0.8.0\", is_dev_dep = False),\n struct(repo=\"crates__uzers-0.12.2\", is_dev_dep = False),\n struct(repo=\"crates__webrtc-0.17.2\", is_dev_dep = False),\n struct(repo=\"crates__whoami-2.1.2\", is_dev_dep = False),\n struct(repo=\"crates__windows-sys-0.59.0\", is_dev_dep = False),\n struct(repo=\"crates__windows-sys-0.61.2\", is_dev_dep = False),\n struct(repo=\"crates__winreg-0.56.0\", is_dev_dep = False),\n struct(repo=\"crates__x11rb-0.13.2\", is_dev_dep = False),\n struct(repo=\"crates__xcap-0.9.6\", is_dev_dep = False),\n struct(repo=\"crates__xkeysym-0.2.1\", is_dev_dep = False),\n struct(repo=\"crates__xxhash-rust-0.8.18\", is_dev_dep = False),\n struct(repo=\"crates__yansi-1.0.1\", is_dev_dep = False),\n struct(repo=\"crates__zune-jpeg-0.5.15\", is_dev_dep = False),\n struct(repo = \"crates__pretty_assertions-1.4.1\", is_dev_dep = True),\n struct(repo = \"crates__rstest-0.26.1\", is_dev_dep = True),\n ]\n", + "crates.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_edition](#crate_edition)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe:defs.bzl\", \"crates_vendor_remote_repository\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n \"\"\"Flatten a list of dependency maps into one dictionary.\n\n Dependency maps have the following structure:\n\n ```python\n DEPENDENCIES_MAP = {\n # The first key in the map is a Bazel package\n # name of the workspace this file is defined in.\n \"workspace_member_package\": {\n\n # Not all dependencies are supported for all platforms.\n # the condition key is the condition required to be true\n # on the host platform.\n \"condition\": {\n\n # An alias to a crate target. # The label of the crate target the\n # Aliases are only crate names. # package name refers to.\n \"package_name\": \"@full//:label\",\n }\n }\n }\n ```\n\n Args:\n all_dependency_maps (list): A list of dicts as described above\n\n Returns:\n dict: A dictionary as described above\n \"\"\"\n dependencies = {}\n\n for workspace_deps_map in all_dependency_maps:\n for pkg_name, conditional_deps_map in workspace_deps_map.items():\n if pkg_name not in dependencies:\n non_frozen_map = dict()\n for key, values in conditional_deps_map.items():\n non_frozen_map.update({key: dict(values.items())})\n dependencies.setdefault(pkg_name, non_frozen_map)\n continue\n\n for condition, deps_map in conditional_deps_map.items():\n # If the condition has not been recorded, do so and continue\n if condition not in dependencies[pkg_name]:\n dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n continue\n\n # Alert on any miss-matched dependencies\n inconsistent_entries = []\n for crate_name, crate_label in deps_map.items():\n existing = dependencies[pkg_name][condition].get(crate_name)\n if existing and existing != crate_label:\n inconsistent_entries.append((crate_name, existing, crate_label))\n dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n return dependencies\n\ndef crate_deps(deps, package_name = None):\n \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n Args:\n deps (list): The desired list of crate targets.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()`.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if not deps:\n return []\n\n if package_name == None:\n package_name = native.package_name()\n\n # Join both sets of dependencies\n dependencies = _flatten_dependency_maps([\n _NORMAL_DEPENDENCIES,\n _NORMAL_DEV_DEPENDENCIES,\n _PROC_MACRO_DEPENDENCIES,\n _PROC_MACRO_DEV_DEPENDENCIES,\n _BUILD_DEPENDENCIES,\n _BUILD_PROC_MACRO_DEPENDENCIES,\n ]).pop(package_name, {})\n\n # Combine all conditional packages so we can easily index over a flat list\n # TODO: Perhaps this should actually return select statements and maintain\n # the conditionals of the dependencies\n flat_deps = {}\n for deps_set in dependencies.values():\n for crate_name, crate_label in deps_set.items():\n flat_deps.update({crate_name: crate_label})\n\n missing_crates = []\n crate_targets = []\n for crate_target in deps:\n if crate_target not in flat_deps:\n missing_crates.append(crate_target)\n else:\n crate_targets.append(flat_deps[crate_target])\n\n if missing_crates:\n fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n missing_crates,\n package_name,\n dependencies,\n ))\n\n return crate_targets\n\ndef crate_edition(package_name = None):\n \"\"\"Finds the Rust edition for the package where this macro is called.\n\n Args:\n package_name (str, optional): The package name whose edition should be\n looked up. Defaults to `native.package_name()` when unset.\n\n Returns:\n str: The Rust edition declared by the package's Cargo.toml file.\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n if package_name not in _CRATE_EDITIONS:\n fail(\"Tried to get crate_edition for package \" + package_name + \" but that package had no Cargo.toml file\")\n\n return _CRATE_EDITIONS[package_name]\n\ndef all_crate_deps(\n normal = False, \n normal_dev = False, \n proc_macro = False, \n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n for the package where this macro is called.\n\n If no parameters are set, all normal dependencies are returned. Setting any one flag will\n otherwise impact the contents of the returned list.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list.\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_dependency_maps = []\n if normal:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n if normal_dev:\n all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n if proc_macro:\n all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n if proc_macro_dev:\n all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n if build:\n all_dependency_maps.append(_BUILD_DEPENDENCIES)\n if build_proc_macro:\n all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n # Default to always using normal dependencies\n if not all_dependency_maps:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n if not dependencies:\n if dependencies == None:\n fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n else:\n return []\n\n crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n for condition, deps in dependencies.items():\n crate_deps += selects.with_or({\n tuple(_CONDITIONS[condition]): deps.values(),\n \"//conditions:default\": [],\n })\n\n return crate_deps\n\ndef aliases(\n normal = False,\n normal_dev = False,\n proc_macro = False,\n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Produces a map of Crate alias names to their original label\n\n If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n Setting any one flag will otherwise determine the contents of the returned dict.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n dict: The aliases of all associated packages\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_aliases_maps = []\n if normal:\n all_aliases_maps.append(_NORMAL_ALIASES)\n if normal_dev:\n all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n if proc_macro:\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n if proc_macro_dev:\n all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n if build:\n all_aliases_maps.append(_BUILD_ALIASES)\n if build_proc_macro:\n all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n # Default to always using normal aliases\n if not all_aliases_maps:\n all_aliases_maps.append(_NORMAL_ALIASES)\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n if not aliases:\n return dict()\n\n common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n # If there are only common items in the dictionary, immediately return them\n if not len(aliases.keys()) == 1:\n return dict(common_items)\n\n # Build a single select statement where each conditional has accounted for the\n # common set of aliases.\n crate_aliases = {\"//conditions:default\": dict(common_items)}\n for condition, deps in aliases.items():\n condition_triples = _CONDITIONS[condition]\n for triple in condition_triples:\n if triple in crate_aliases:\n crate_aliases[triple].update(deps)\n else:\n crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS, ALIASES, AND EDITIONS\n###############################################################################\n\n_CRATE_EDITIONS = {\n \"crates/vendor/brush-core\": \"2024\",\n \"crates/pi-ast\": \"2024\",\n \"crates/pi-builtins\": \"2024\",\n \"crates/pi-iso\": \"2024\",\n \"crates/pi-natives\": \"2024\",\n \"crates/pi-shell\": \"2024\",\n \"crates/pi-voice\": \"2024\",\n \"crates/pi-walker\": \"2024\",\n}\n\n_NORMAL_DEPENDENCIES = {\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n \"bon\": Label(\"//bon-3.9.3\"),\n \"brush-parser\": Label(\"//brush-parser-0.4.0\"),\n \"cached\": Label(\"//cached-0.59.0\"),\n \"cfg-if\": Label(\"//cfg-if-1.0.4\"),\n \"chrono\": Label(\"//chrono-0.4.45\"),\n \"clap\": Label(\"//clap-4.6.6\"),\n \"color-print\": Label(\"//color-print-0.3.7\"),\n \"fancy-regex\": Label(\"//fancy-regex-0.17.0\"),\n \"futures\": Label(\"//futures-0.3.33\"),\n \"itertools\": Label(\"//itertools-0.14.0\"),\n \"normalize-path\": Label(\"//normalize-path-0.2.1\"),\n \"rand\": Label(\"//rand-0.10.2\"),\n \"rpds\": Label(\"//rpds-1.2.1\"),\n \"strum\": Label(\"//strum-0.28.0\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"tokio-util\": Label(\"//tokio-util-0.7.19\"),\n \"tracing\": Label(\"//tracing-0.1.44\"),\n },\n \"cfg(any(unix, windows))\": {\n \"hostname\": Label(\"//hostname-0.4.2\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n },\n \"cfg(target_family = \\\"wasm\\\")\": {\n \"tokio\": Label(\"//tokio-1.53.1\"),\n },\n \"cfg(unix)\": {\n \"command-fds\": Label(\"//command-fds-0.3.3\"),\n \"libc\": Label(\"//libc-0.2.189\"),\n \"nix\": Label(\"//nix-0.31.3\"),\n \"terminfo\": Label(\"//terminfo-0.9.0\"),\n \"uzers\": Label(\"//uzers-0.12.2\"),\n },\n \"cfg(windows)\": {\n \"check_elevation\": Label(\"//check_elevation-0.2.7\"),\n \"whoami\": Label(\"//whoami-2.1.2\"),\n \"windows-sys\": Label(\"//windows-sys-0.59.0\"),\n },\n \"wasm32-unknown-unknown\": {\n \"getrandom\": Label(\"//getrandom-0.4.3\"),\n \"uuid\": Label(\"//uuid-1.24.0\"),\n },\n },\n \"crates/pi-ast\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"ast-grep-core\": Label(\"//ast-grep-core-0.39.9\"),\n \"globset\": Label(\"//globset-0.4.20\"),\n \"ignore\": Label(\"//ignore-0.4.33\"),\n \"phf\": Label(\"//phf-0.13.1\"),\n \"serde\": Label(\"//serde-1.0.229\"),\n \"tree-sitter\": Label(\"//tree-sitter-0.25.10\"),\n \"tree_sitter_astro\": Label(\"//tree-sitter-astro-next-0.1.1\"),\n \"tree-sitter-bash\": Label(\"//tree-sitter-bash-0.25.1\"),\n \"tree-sitter-c\": Label(\"//tree-sitter-c-0.24.2\"),\n \"tree-sitter-c-sharp\": Label(\"//tree-sitter-c-sharp-0.23.5\"),\n \"tree-sitter-clojure\": Label(\"//tree-sitter-clojure-0.1.0\"),\n \"tree-sitter-cmake\": Label(\"//tree-sitter-cmake-0.7.4\"),\n \"tree-sitter-cpp\": Label(\"//tree-sitter-cpp-0.23.4\"),\n \"tree-sitter-css\": Label(\"//tree-sitter-css-0.25.0\"),\n \"tree-sitter-dart\": Label(\"//tree-sitter-dart-0.2.0\"),\n \"tree-sitter-diff\": Label(\"//tree-sitter-diff-0.1.0\"),\n \"tree_sitter_dockerfile\": Label(\"//tree-sitter-dockerfile-updated-0.2.0\"),\n \"tree-sitter-elisp\": Label(\"//tree-sitter-elisp-1.7.2\"),\n \"tree-sitter-elixir\": Label(\"//tree-sitter-elixir-0.3.5\"),\n \"tree-sitter-erlang\": Label(\"//tree-sitter-erlang-0.16.0\"),\n \"tree-sitter-fortran\": Label(\"//tree-sitter-fortran-0.6.0\"),\n \"tree-sitter-go\": Label(\"//tree-sitter-go-0.25.0\"),\n \"tree-sitter-graphql\": Label(\"//tree-sitter-graphql-0.1.0\"),\n \"tree-sitter-haskell\": Label(\"//tree-sitter-haskell-0.23.1\"),\n \"tree-sitter-hcl\": Label(\"//tree-sitter-hcl-1.1.0\"),\n \"tree-sitter-html\": Label(\"//tree-sitter-html-0.23.2\"),\n \"tree-sitter-ini\": Label(\"//tree-sitter-ini-1.4.0\"),\n \"tree-sitter-java\": Label(\"//tree-sitter-java-0.23.5\"),\n \"tree-sitter-javascript\": Label(\"//tree-sitter-javascript-0.25.0\"),\n \"tree-sitter-json\": Label(\"//tree-sitter-json-0.24.8\"),\n \"tree-sitter-julia\": Label(\"//tree-sitter-julia-0.23.1\"),\n \"tree-sitter-just\": Label(\"//tree-sitter-just-0.2.0\"),\n \"tree_sitter_kotlin\": Label(\"//tree-sitter-kotlin-sg-0.4.1\"),\n \"tree-sitter-lua\": Label(\"//tree-sitter-lua-0.5.0\"),\n \"tree-sitter-make\": Label(\"//tree-sitter-make-1.1.1\"),\n \"tree-sitter-md\": Label(\"//tree-sitter-md-0.5.3\"),\n \"tree-sitter-nix\": Label(\"//tree-sitter-nix-0.3.0\"),\n \"tree-sitter-objc\": Label(\"//tree-sitter-objc-3.0.2\"),\n \"tree-sitter-ocaml\": Label(\"//tree-sitter-ocaml-0.24.2\"),\n \"tree-sitter-odin\": Label(\"//tree-sitter-odin-1.3.0\"),\n \"tree-sitter-php\": Label(\"//tree-sitter-php-0.24.2\"),\n \"tree-sitter-powershell\": Label(\"//tree-sitter-powershell-0.26.4\"),\n \"tree-sitter-proto\": Label(\"//tree-sitter-proto-0.4.0\"),\n \"tree-sitter-python\": Label(\"//tree-sitter-python-0.25.0\"),\n \"tree-sitter-r\": Label(\"//tree-sitter-r-1.3.0\"),\n \"tree-sitter-regex\": Label(\"//tree-sitter-regex-0.25.0\"),\n \"tree-sitter-ruby\": Label(\"//tree-sitter-ruby-0.23.1\"),\n \"tree-sitter-rust\": Label(\"//tree-sitter-rust-0.24.2\"),\n \"tree-sitter-scala\": Label(\"//tree-sitter-scala-0.26.0\"),\n \"tree_sitter_sql\": Label(\"//tree-sitter-sequel-0.3.11\"),\n \"tree-sitter-solidity\": Label(\"//tree-sitter-solidity-1.2.13\"),\n \"tree-sitter-starlark\": Label(\"//tree-sitter-starlark-1.3.0\"),\n \"tree_sitter_svelte\": Label(\"//tree-sitter-svelte-next-0.1.1\"),\n \"tree-sitter-swift\": Label(\"//tree-sitter-swift-0.7.3\"),\n \"tree-sitter-tlaplus\": Label(\"//tree-sitter-tlaplus-1.5.0\"),\n \"tree-sitter-toml-ng\": Label(\"//tree-sitter-toml-ng-0.7.0\"),\n \"tree-sitter-typescript\": Label(\"//tree-sitter-typescript-0.23.2\"),\n \"tree-sitter-verilog\": Label(\"//tree-sitter-verilog-1.0.3\"),\n \"tree_sitter_vue\": Label(\"//tree-sitter-vue-next-0.1.0\"),\n \"tree-sitter-xml\": Label(\"//tree-sitter-xml-0.7.0\"),\n \"tree-sitter-yaml\": Label(\"//tree-sitter-yaml-0.7.2\"),\n \"tree-sitter-zig\": Label(\"//tree-sitter-zig-1.1.2\"),\n },\n },\n \"crates/pi-builtins\": {\n _COMMON_CONDITION: {\n \"ansi-width\": Label(\"//ansi-width-0.1.0\"),\n \"argmax\": Label(\"//argmax-0.3.1\"),\n \"bigdecimal\": Label(\"//bigdecimal-0.4.10\"),\n \"binary-heap-plus\": Label(\"//binary-heap-plus-0.5.0\"),\n \"brush-parser\": Label(\"//brush-parser-0.4.0\"),\n \"bstr\": Label(\"//bstr-1.13.0\"),\n \"bytecount\": Label(\"//bytecount-0.6.9\"),\n \"cfg-if\": Label(\"//cfg-if-1.0.4\"),\n \"chrono\": Label(\"//chrono-0.4.45\"),\n \"clap\": Label(\"//clap-4.6.6\"),\n \"codesnake\": Label(\"//codesnake-0.2.1\"),\n \"compare\": Label(\"//compare-0.1.0\"),\n \"faccess\": Label(\"//faccess-0.2.4\"),\n \"fancy-regex\": Label(\"//fancy-regex-0.17.0\"),\n \"filetime\": Label(\"//filetime-0.2.29\"),\n \"flume\": Label(\"//flume-0.11.1\"),\n \"foldhash\": Label(\"//foldhash-0.2.0\"),\n \"fs_extra\": Label(\"//fs_extra-1.3.0\"),\n \"futures\": Label(\"//futures-0.3.33\"),\n \"glob\": Label(\"//glob-0.3.4\"),\n \"globset\": Label(\"//globset-0.4.20\"),\n \"grep-cli\": Label(\"//grep-cli-0.1.12\"),\n \"grep-matcher\": Label(\"//grep-matcher-0.1.9\"),\n \"grep-pcre2\": Label(\"//grep-pcre2-0.1.10\"),\n \"grep-printer\": Label(\"//grep-printer-0.3.1\"),\n \"grep-regex\": Label(\"//grep-regex-0.1.14\"),\n \"grep-searcher\": Label(\"//grep-searcher-0.1.17\"),\n \"hex\": Label(\"//hex-0.4.3\"),\n \"hifijson\": Label(\"//hifijson-0.2.3\"),\n \"hostname\": Label(\"//hostname-0.4.2\"),\n \"ignore\": Label(\"//ignore-0.4.33\"),\n \"indicatif\": Label(\"//indicatif-0.18.6\"),\n \"itertools\": Label(\"//itertools-0.14.0\"),\n \"jaq-core\": Label(\"//jaq-core-2.2.1\"),\n \"jaq-json\": Label(\"//jaq-json-1.1.3\"),\n \"jaq-std\": Label(\"//jaq-std-2.1.2\"),\n \"jiff\": Label(\"//jiff-0.2.35\"),\n \"libc\": Label(\"//libc-0.2.189\"),\n \"lscolors\": Label(\"//lscolors-0.21.0\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"memmap2\": Label(\"//memmap2-0.9.11\"),\n \"nom\": Label(\"//nom-8.0.0\"),\n \"num-bigint\": Label(\"//num-bigint-0.4.8\"),\n \"num-traits\": Label(\"//num-traits-0.2.19\"),\n \"onig\": Label(\"//onig-6.5.3\"),\n \"os_display\": Label(\"//os_display-0.1.4\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"parse_datetime\": Label(\"//parse_datetime-0.14.0\"),\n \"platform-info\": Label(\"//platform-info-2.1.0\"),\n \"rand\": Label(\"//rand-0.10.2\"),\n \"rayon\": Label(\"//rayon-1.12.0\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"rustc-hash\": Label(\"//rustc-hash-2.1.3\"),\n \"self_cell\": Label(\"//self_cell-1.3.0\"),\n \"serde_json\": Label(\"//serde_json-1.0.151\"),\n \"similar\": Label(\"//similar-3.1.2\"),\n \"strum\": Label(\"//strum-0.28.0\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"tokio-util\": Label(\"//tokio-util-0.7.19\"),\n \"tracing\": Label(\"//tracing-0.1.44\"),\n \"unicode-width\": Label(\"//unicode-width-0.2.2\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n \"uutils_term_grid\": Label(\"//uutils_term_grid-0.8.0\"),\n \"yansi\": Label(\"//yansi-1.0.1\"),\n },\n \"cfg(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"))\": {\n \"procfs\": Label(\"//procfs-0.18.0\"),\n },\n \"cfg(any(unix, windows))\": {\n \"tokio\": Label(\"//tokio-1.53.1\"),\n },\n \"cfg(target_family = \\\"wasm\\\")\": {\n \"tokio\": Label(\"//tokio-1.53.1\"),\n },\n \"cfg(unix)\": {\n \"dns-lookup\": Label(\"//dns-lookup-3.0.1\"),\n \"nix\": Label(\"//nix-0.31.3\"),\n \"notify\": Label(\"//notify-8.2.0\"),\n \"rlimit\": Label(\"//rlimit-0.11.0\"),\n \"rustix\": Label(\"//rustix-1.1.4\"),\n },\n \"cfg(windows)\": {\n \"notify\": Label(\"//notify-8.2.0\"),\n \"rustix\": Label(\"//rustix-1.1.4\"),\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/pi-iso\": {\n _COMMON_CONDITION: {\n \"similar\": Label(\"//similar-3.1.2\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"arboard\": Label(\"//arboard-3.6.1\"),\n \"ast-grep-core\": Label(\"//ast-grep-core-0.39.9\"),\n \"base64\": Label(\"//base64-0.22.1\"),\n \"clap\": Label(\"//clap-4.6.6\"),\n \"flume\": Label(\"//flume-0.11.1\"),\n \"fontdue\": Label(\"//fontdue-0.9.4\"),\n \"futures\": Label(\"//futures-0.3.33\"),\n \"globset\": Label(\"//globset-0.4.20\"),\n \"grep-matcher\": Label(\"//grep-matcher-0.1.9\"),\n \"grep-pcre2\": Label(\"//grep-pcre2-0.1.10\"),\n \"grep-regex\": Label(\"//grep-regex-0.1.14\"),\n \"grep-searcher\": Label(\"//grep-searcher-0.1.17\"),\n \"html-to-markdown-rs\": Label(\"//html-to-markdown-rs-3.10.6\"),\n \"icy_sixel\": Label(\"//icy_sixel-0.5.0\"),\n \"ignore\": Label(\"//ignore-0.4.33\"),\n \"image\": Label(\"//image-0.25.10\"),\n \"inferno\": Label(\"//inferno-0.12.8\"),\n \"napi\": Label(\"//napi-3.12.0\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"phf\": Label(\"//phf-0.13.1\"),\n \"png\": Label(\"//png-0.18.1\"),\n \"portable-pty\": Label(\"//portable-pty-0.9.0\"),\n \"rayon\": Label(\"//rayon-1.12.0\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"serde\": Label(\"//serde-1.0.229\"),\n \"serde_json\": Label(\"//serde_json-1.0.151\"),\n \"smallvec\": Label(\"//smallvec-1.15.2\"),\n \"syntect\": Label(\"//syntect-5.3.0\"),\n \"tiktoken-rs\": Label(\"//tiktoken-rs-0.11.0\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n \"tokio-util\": Label(\"//tokio-util-0.7.19\"),\n \"toml\": Label(\"//toml-1.1.4+spec-1.1.0\"),\n \"unicode-segmentation\": Label(\"//unicode-segmentation-1.13.3\"),\n \"unicode-width\": Label(\"//unicode-width-0.2.2\"),\n \"xxhash-rust\": Label(\"//xxhash-rust-0.8.18\"),\n \"zune-jpeg\": Label(\"//zune-jpeg-0.5.15\"),\n },\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"windows\\\"))\": {\n \"enigo\": Label(\"//enigo-0.6.1\"),\n \"xcap\": Label(\"//xcap-0.9.6\"),\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n \"ashpd\": Label(\"//ashpd-0.11.1\"),\n \"atspi\": Label(\"//atspi-0.30.0\"),\n \"reis\": Label(\"//reis-0.5.0\"),\n \"x11rb\": Label(\"//x11rb-0.13.2\"),\n \"xkeysym\": Label(\"//xkeysym-0.2.1\"),\n },\n \"cfg(target_os = \\\"macos\\\")\": {\n \"core-graphics\": Label(\"//core-graphics-0.25.0\"),\n \"foreign-types\": Label(\"//foreign-types-0.5.0\"),\n \"objc2-app-kit\": Label(\"//objc2-app-kit-0.3.2\"),\n \"objc2-application-services\": Label(\"//objc2-application-services-0.3.2\"),\n \"objc2-core-foundation\": Label(\"//objc2-core-foundation-0.3.2\"),\n \"objc2-core-graphics\": Label(\"//objc2-core-graphics-0.3.2\"),\n \"objc2-foundation\": Label(\"//objc2-foundation-0.3.2\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"clipboard-win\": Label(\"//clipboard-win-5.4.1\"),\n \"uiautomation\": Label(\"//uiautomation-0.25.0\"),\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n \"winreg\": Label(\"//winreg-0.56.0\"),\n },\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"brush-parser\": Label(\"//brush-parser-0.3.0\"),\n \"bytes\": Label(\"//bytes-1.12.1\"),\n \"clap\": Label(\"//clap-4.6.6\"),\n \"flume\": Label(\"//flume-0.11.1\"),\n \"jiff\": Label(\"//jiff-0.2.35\"),\n \"os_pipe\": Label(\"//os_pipe-1.2.3\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"serde\": Label(\"//serde-1.0.229\"),\n \"serde_json\": Label(\"//serde_json-1.0.151\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n \"tokio-util\": Label(\"//tokio-util-0.7.19\"),\n \"toml\": Label(\"//toml-1.1.4+spec-1.1.0\"),\n \"xxhash-rust\": Label(\"//xxhash-rust-0.8.18\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"smallvec\": Label(\"//smallvec-1.15.2\"),\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n \"winreg\": Label(\"//winreg-0.56.0\"),\n },\n },\n \"crates/pi-voice\": {\n _COMMON_CONDITION: {\n \"audiopus_sys\": Label(\"//audiopus_sys-0.2.2\"),\n \"bytes\": Label(\"//bytes-1.12.1\"),\n \"flume\": Label(\"//flume-0.11.1\"),\n \"opus\": Label(\"//opus-0.3.1\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n \"webrtc\": Label(\"//webrtc-0.17.2\"),\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(target_os = \\\"windows\\\")\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/pi-walker\": {\n _COMMON_CONDITION: {\n \"dashmap\": Label(\"//dashmap-6.2.1\"),\n \"globset\": Label(\"//globset-0.4.20\"),\n \"ignore\": Label(\"//ignore-0.4.33\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"rayon\": Label(\"//rayon-1.12.0\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n}\n\n\n_NORMAL_ALIASES = {\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n },\n \"cfg(any(unix, windows))\": {\n },\n \"cfg(target_family = \\\"wasm\\\")\": {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n \"wasm32-unknown-unknown\": {\n },\n },\n \"crates/pi-ast\": {\n _COMMON_CONDITION: {\n Label(\"//tree-sitter-astro-next-0.1.1\"): \"tree_sitter_astro\",\n Label(\"//tree-sitter-dockerfile-updated-0.2.0\"): \"tree_sitter_dockerfile\",\n Label(\"//tree-sitter-kotlin-sg-0.4.1\"): \"tree_sitter_kotlin\",\n Label(\"//tree-sitter-sequel-0.3.11\"): \"tree_sitter_sql\",\n Label(\"//tree-sitter-svelte-next-0.1.1\"): \"tree_sitter_svelte\",\n Label(\"//tree-sitter-vue-next-0.1.0\"): \"tree_sitter_vue\",\n },\n },\n \"crates/pi-builtins\": {\n _COMMON_CONDITION: {\n },\n \"cfg(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"))\": {\n },\n \"cfg(any(unix, windows))\": {\n },\n \"cfg(target_family = \\\"wasm\\\")\": {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/pi-iso\": {\n _COMMON_CONDITION: {\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n },\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"windows\\\"))\": {\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n },\n \"cfg(target_os = \\\"macos\\\")\": {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/pi-voice\": {\n _COMMON_CONDITION: {\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n },\n \"cfg(target_os = \\\"windows\\\")\": {\n },\n },\n \"crates/pi-walker\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"pretty_assertions\": Label(\"//pretty_assertions-1.4.1\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-builtins\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"pretty_assertions\": Label(\"//pretty_assertions-1.4.1\"),\n },\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-builtins\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n \"async-recursion\": Label(\"//async-recursion-1.1.1\"),\n \"async-trait\": Label(\"//async-trait-0.1.91\"),\n \"inherent\": Label(\"//inherent-1.0.14\"),\n \"strum_macros\": Label(\"//strum_macros-0.28.0\"),\n },\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-builtins\": {\n _COMMON_CONDITION: {\n \"strum_macros\": Label(\"//strum_macros-0.28.0\"),\n },\n },\n \"crates/pi-iso\": {\n _COMMON_CONDITION: {\n \"async-trait\": Label(\"//async-trait-0.1.91\"),\n },\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n \"napi-derive\": Label(\"//napi-derive-3.6.2\"),\n },\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n}\n\n\n_PROC_MACRO_ALIASES = {\n \"crates/vendor/brush-core\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-builtins\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n \"crates/vendor/brush-core\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-builtins\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-builtins\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n}\n\n\n_BUILD_DEPENDENCIES = {\n \"crates/vendor/brush-core\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-builtins\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n \"napi-build\": Label(\"//napi-build-2.4.0\"),\n \"serde\": Label(\"//serde-1.0.229\"),\n \"serde_json\": Label(\"//serde_json-1.0.151\"),\n },\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n}\n\n\n_BUILD_ALIASES = {\n \"crates/vendor/brush-core\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-builtins\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n \"crates/vendor/brush-core\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-builtins\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n \"crates/vendor/brush-core\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-builtins\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n}\n\n\n_CONDITIONS = {\n \"aarch64-apple-darwin\": [\"@@//bazel/triples:aarch64-apple-darwin\"],\n \"aarch64-linux-android\": [],\n \"aarch64-pc-windows-gnullvm\": [],\n \"aarch64-unknown-linux-gnu\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\"],\n \"aarch64-unknown-linux-musl\": [\"@@//bazel/triples:aarch64-unknown-linux-musl\"],\n \"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_os = \\\"windows\\\"))\": [],\n \"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_vendor = \\\"apple\\\", any(target_os = \\\"ios\\\", target_os = \\\"macos\\\", target_os = \\\"tvos\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\")))\": [\"@@//bazel/triples:aarch64-apple-darwin\"],\n \"cfg(all(any(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), all(target_arch = \\\"arm\\\", target_endian = \\\"little\\\")), any(target_os = \\\"android\\\", target_os = \\\"linux\\\")))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\"],\n \"cfg(all(any(target_arch = \\\"x86_64\\\", target_arch = \\\"arm64ec\\\"), target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(all(any(target_os = \\\"android\\\", target_os = \\\"linux\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", target_arch = \\\"s390x\\\"), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), not(any(all(target_os = \\\"linux\\\", target_env = \\\"\\\"), getrandom_backend = \\\"custom\\\", getrandom_backend = \\\"linux_raw\\\", getrandom_backend = \\\"rdrand\\\", getrandom_backend = \\\"rndr\\\"))))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(not(curve25519_dalek_backend = \\\"fiat\\\"), not(curve25519_dalek_backend = \\\"serial\\\"), target_arch = \\\"x86_64\\\"))\": [\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", target_arch = \\\"s390x\\\"), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", target_arch = \\\"s390x\\\"), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_os = \\\"android\\\"))\": [],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_os = \\\"linux\\\"))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_vendor = \\\"apple\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\"],\n \"cfg(all(target_arch = \\\"loongarch64\\\", target_os = \\\"linux\\\"))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"unknown\\\"))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"wasi\\\", target_env = \\\"p2\\\"))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [\"@@//bazel/triples:x86_64-unknown-linux-gnu\"],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(all(target_family = \\\"wasm\\\", target_os = \\\"unknown\\\"))\": [],\n \"cfg(all(target_os = \\\"linux\\\", not(target_env = \\\"ohos\\\")))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(target_os = \\\"uefi\\\", getrandom_backend = \\\"efi_rng\\\"))\": [],\n \"cfg(all(unix, not(any(target_os = \\\"macos\\\", target_os = \\\"android\\\", target_os = \\\"emscripten\\\"))))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(unix, not(target_os = \\\"macos\\\")))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any())\": [],\n \"cfg(any(target_arch = \\\"aarch64\\\", target_arch = \\\"x86\\\", target_arch = \\\"x86_64\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_arch = \\\"aarch64\\\", target_arch = \\\"x86_64\\\", target_arch = \\\"x86\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_arch = \\\"x86\\\", target_arch = \\\"x86_64\\\"))\": [\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_arch = \\\"x86_64\\\", target_arch = \\\"x86\\\"))\": [\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_os = \\\"android\\\", target_os = \\\"linux\\\"))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_os = \\\"android\\\", target_os = \\\"linux\\\", target_os = \\\"macos\\\", target_os = \\\"hurd\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_os = \\\"dragonfly\\\", target_os = \\\"freebsd\\\", target_os = \\\"hurd\\\", target_os = \\\"illumos\\\", target_os = \\\"cygwin\\\", all(target_os = \\\"horizon\\\", target_arch = \\\"arm\\\")))\": [],\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"dragonfly\\\"))\": [],\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"netbsd\\\"))\": [],\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"openbsd\\\", target_os = \\\"netbsd\\\", target_os = \\\"dragonflybsd\\\", target_os = \\\"ios\\\"))\": [],\n \"cfg(any(target_os = \\\"haiku\\\", target_os = \\\"redox\\\", target_os = \\\"nto\\\", target_os = \\\"aix\\\"))\": [],\n \"cfg(any(target_os = \\\"ios\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\", target_os = \\\"tvos\\\"))\": [],\n \"cfg(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"openbsd\\\", target_os = \\\"vita\\\", target_os = \\\"emscripten\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"windows\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(any(unix, target_os = \\\"fuchsia\\\", target_os = \\\"vxworks\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(unix, target_os = \\\"hermit\\\", target_os = \\\"wasi\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(unix, target_os = \\\"redox\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(unix, target_os = \\\"wasi\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(unix, windows))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(windows, target_os = \\\"linux\\\"))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(curve25519_dalek_backend = \\\"fiat\\\")\": [],\n \"cfg(not(all(target_arch = \\\"arm\\\", target_os = \\\"none\\\")))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(not(any(target_os = \\\"android\\\", target_os = \\\"linux\\\")))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(not(target_has_atomic = \\\"ptr\\\"))\": [],\n \"cfg(not(target_os = \\\"windows\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(not(windows))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(target_arch = \\\"aarch64\\\")\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\"],\n \"cfg(target_arch = \\\"spirv\\\")\": [],\n \"cfg(target_arch = \\\"x86\\\")\": [],\n \"cfg(target_arch = \\\"x86_64\\\")\": [\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(target_family = \\\"wasm\\\")\": [],\n \"cfg(target_os = \\\"android\\\")\": [],\n \"cfg(target_os = \\\"freebsd\\\")\": [],\n \"cfg(target_os = \\\"haiku\\\")\": [],\n \"cfg(target_os = \\\"hermit\\\")\": [],\n \"cfg(target_os = \\\"linux\\\")\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(target_os = \\\"macos\\\")\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(target_os = \\\"netbsd\\\")\": [],\n \"cfg(target_os = \\\"redox\\\")\": [],\n \"cfg(target_os = \\\"solaris\\\")\": [],\n \"cfg(target_os = \\\"vxworks\\\")\": [],\n \"cfg(target_os = \\\"wasi\\\")\": [],\n \"cfg(target_os = \\\"windows\\\")\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(target_vendor = \\\"apple\\\")\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(unix)\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(windows)\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(windows_raw_dylib)\": [],\n \"i686-pc-windows-gnu\": [],\n \"i686-pc-windows-gnullvm\": [],\n \"wasm32-unknown-unknown\": [],\n \"x86_64-apple-darwin\": [\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"x86_64-pc-windows-gnu\": [],\n \"x86_64-pc-windows-gnullvm\": [],\n \"x86_64-pc-windows-msvc\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"x86_64-unknown-linux-gnu\": [\"@@//bazel/triples:x86_64-unknown-linux-gnu\"],\n \"x86_64-unknown-linux-musl\": [\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n \"\"\"A macro for defining repositories for all generated crates.\n\n Returns:\n A list of repos visible to the module through the module extension.\n \"\"\"\n maybe(\n crates_vendor_remote_repository,\n name = \"crates\",\n # Lean interface: just point at `crates.bzl`; the repo rule\n # derives the sibling `BUILD.bazel` and `defs.bzl`.\n crates_module = Label(\"@crates//crates:crates.bzl\"),\n )\n maybe(\n http_archive,\n name = \"crates__adler2-2.0.1\",\n sha256 = \"320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/adler2/2.0.1/download\"],\n strip_prefix = \"adler2-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.adler2-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aead-0.5.2\",\n sha256 = \"d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aead/0.5.2/download\"],\n strip_prefix = \"aead-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.aead-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aes-0.8.4\",\n sha256 = \"b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aes/0.8.4/download\"],\n strip_prefix = \"aes-0.8.4\",\n build_file = Label(\"@crates//crates:BUILD.aes-0.8.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aes-gcm-0.10.3\",\n sha256 = \"831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aes-gcm/0.10.3/download\"],\n strip_prefix = \"aes-gcm-0.10.3\",\n build_file = Label(\"@crates//crates:BUILD.aes-gcm-0.10.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ahash-0.8.12\",\n sha256 = \"5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ahash/0.8.12/download\"],\n strip_prefix = \"ahash-0.8.12\",\n build_file = Label(\"@crates//crates:BUILD.ahash-0.8.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aho-corasick-1.1.5\",\n sha256 = \"c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aho-corasick/1.1.5/download\"],\n strip_prefix = \"aho-corasick-1.1.5\",\n build_file = Label(\"@crates//crates:BUILD.aho-corasick-1.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__allocator-api2-0.2.21\",\n sha256 = \"683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/allocator-api2/0.2.21/download\"],\n strip_prefix = \"allocator-api2-0.2.21\",\n build_file = Label(\"@crates//crates:BUILD.allocator-api2-0.2.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__android_system_properties-0.1.6\",\n sha256 = \"ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/android_system_properties/0.1.6/download\"],\n strip_prefix = \"android_system_properties-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.android_system_properties-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__annotate-snippets-0.11.5\",\n sha256 = \"710e8eae58854cdc1790fcb56cca04d712a17be849eeb81da2a724bf4bae2bc4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/annotate-snippets/0.11.5/download\"],\n strip_prefix = \"annotate-snippets-0.11.5\",\n build_file = Label(\"@crates//crates:BUILD.annotate-snippets-0.11.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ansi-width-0.1.0\",\n sha256 = \"219e3ce6f2611d83b51ec2098a12702112c29e57203a6b0a0929b2cddb486608\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ansi-width/0.1.0/download\"],\n strip_prefix = \"ansi-width-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.ansi-width-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstream-1.0.0\",\n sha256 = \"824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstream/1.0.0/download\"],\n strip_prefix = \"anstream-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.anstream-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-1.0.14\",\n sha256 = \"940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle/1.0.14/download\"],\n strip_prefix = \"anstyle-1.0.14\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-1.0.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-parse-1.0.0\",\n sha256 = \"52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-parse/1.0.0/download\"],\n strip_prefix = \"anstyle-parse-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-parse-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-query-1.1.5\",\n sha256 = \"40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-query/1.1.5/download\"],\n strip_prefix = \"anstyle-query-1.1.5\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-query-1.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-wincon-3.0.11\",\n sha256 = \"291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-wincon/3.0.11/download\"],\n strip_prefix = \"anstyle-wincon-3.0.11\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-wincon-3.0.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anyhow-1.0.104\",\n sha256 = \"330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anyhow/1.0.104/download\"],\n strip_prefix = \"anyhow-1.0.104\",\n build_file = Label(\"@crates//crates:BUILD.anyhow-1.0.104.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__arboard-3.6.1\",\n sha256 = \"0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/arboard/3.6.1/download\"],\n strip_prefix = \"arboard-3.6.1\",\n build_file = Label(\"@crates//crates:BUILD.arboard-3.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__arc-swap-1.9.2\",\n sha256 = \"c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/arc-swap/1.9.2/download\"],\n strip_prefix = \"arc-swap-1.9.2\",\n build_file = Label(\"@crates//crates:BUILD.arc-swap-1.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__archery-1.2.2\",\n sha256 = \"70e0a5f99dfebb87bb342d0f53bb92c81842e100bbb915223e38349580e5441d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/archery/1.2.2/download\"],\n strip_prefix = \"archery-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.archery-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__argmax-0.3.1\",\n sha256 = \"5b7e3ef5e3a7f2c5e5a49d90ad087c03d38258e75155daac64deb62c50972c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/argmax/0.3.1/download\"],\n strip_prefix = \"argmax-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.argmax-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__arrayref-0.3.9\",\n sha256 = \"76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/arrayref/0.3.9/download\"],\n strip_prefix = \"arrayref-0.3.9\",\n build_file = Label(\"@crates//crates:BUILD.arrayref-0.3.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__arrayvec-0.7.8\",\n sha256 = \"d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/arrayvec/0.7.8/download\"],\n strip_prefix = \"arrayvec-0.7.8\",\n build_file = Label(\"@crates//crates:BUILD.arrayvec-0.7.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ashpd-0.11.1\",\n sha256 = \"d2f3f79755c74fd155000314eb349864caa787c6592eace6c6882dad873d9c39\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ashpd/0.11.1/download\"],\n strip_prefix = \"ashpd-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.ashpd-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__asn1-rs-0.6.2\",\n sha256 = \"5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/asn1-rs/0.6.2/download\"],\n strip_prefix = \"asn1-rs-0.6.2\",\n build_file = Label(\"@crates//crates:BUILD.asn1-rs-0.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__asn1-rs-derive-0.5.1\",\n sha256 = \"965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/asn1-rs-derive/0.5.1/download\"],\n strip_prefix = \"asn1-rs-derive-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.asn1-rs-derive-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__asn1-rs-impl-0.2.0\",\n sha256 = \"7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/asn1-rs-impl/0.2.0/download\"],\n strip_prefix = \"asn1-rs-impl-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.asn1-rs-impl-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ast-grep-core-0.39.9\",\n sha256 = \"057ae90e7256ebf85f840b1638268df0142c9d19467d500b790631fd301acc27\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ast-grep-core/0.39.9/download\"],\n strip_prefix = \"ast-grep-core-0.39.9\",\n build_file = Label(\"@crates//crates:BUILD.ast-grep-core-0.39.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__astral-tl-0.7.11\",\n sha256 = \"d90933ffb0f97e2fc2e0de21da9d3f20597b804012d199843a6fe7c2810d28f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/astral-tl/0.7.11/download\"],\n strip_prefix = \"astral-tl-0.7.11\",\n build_file = Label(\"@crates//crates:BUILD.astral-tl-0.7.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-broadcast-0.7.2\",\n sha256 = \"435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-broadcast/0.7.2/download\"],\n strip_prefix = \"async-broadcast-0.7.2\",\n build_file = Label(\"@crates//crates:BUILD.async-broadcast-0.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-channel-2.5.0\",\n sha256 = \"924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-channel/2.5.0/download\"],\n strip_prefix = \"async-channel-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.async-channel-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-executor-1.14.0\",\n sha256 = \"c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-executor/1.14.0/download\"],\n strip_prefix = \"async-executor-1.14.0\",\n build_file = Label(\"@crates//crates:BUILD.async-executor-1.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-io-2.6.0\",\n sha256 = \"456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-io/2.6.0/download\"],\n strip_prefix = \"async-io-2.6.0\",\n build_file = Label(\"@crates//crates:BUILD.async-io-2.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-lock-3.4.2\",\n sha256 = \"290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-lock/3.4.2/download\"],\n strip_prefix = \"async-lock-3.4.2\",\n build_file = Label(\"@crates//crates:BUILD.async-lock-3.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-process-2.5.0\",\n sha256 = \"fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-process/2.5.0/download\"],\n strip_prefix = \"async-process-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.async-process-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-recursion-1.1.1\",\n sha256 = \"3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-recursion/1.1.1/download\"],\n strip_prefix = \"async-recursion-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.async-recursion-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-signal-0.2.14\",\n sha256 = \"52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-signal/0.2.14/download\"],\n strip_prefix = \"async-signal-0.2.14\",\n build_file = Label(\"@crates//crates:BUILD.async-signal-0.2.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-task-4.7.1\",\n sha256 = \"8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-task/4.7.1/download\"],\n strip_prefix = \"async-task-4.7.1\",\n build_file = Label(\"@crates//crates:BUILD.async-task-4.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-trait-0.1.91\",\n sha256 = \"ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-trait/0.1.91/download\"],\n strip_prefix = \"async-trait-0.1.91\",\n build_file = Label(\"@crates//crates:BUILD.async-trait-0.1.91.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atomic-waker-1.1.2\",\n sha256 = \"1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atomic-waker/1.1.2/download\"],\n strip_prefix = \"atomic-waker-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.atomic-waker-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atspi-0.30.0\",\n sha256 = \"6bf601cccedfffec598ec2db1f9d6745885458bccc0e8916d7023f017c94b3d0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atspi/0.30.0/download\"],\n strip_prefix = \"atspi-0.30.0\",\n build_file = Label(\"@crates//crates:BUILD.atspi-0.30.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atspi-common-0.14.0\",\n sha256 = \"f8a79bed3f5b408ce3152f36e07327a845e6ed5d7e2821a89264037dbcc11daf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atspi-common/0.14.0/download\"],\n strip_prefix = \"atspi-common-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.atspi-common-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atspi-connection-0.14.0\",\n sha256 = \"8fab8e4f574f5a7d3af280b38eff25fb6f47a537dac9ae39ce152f52b19fb10b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atspi-connection/0.14.0/download\"],\n strip_prefix = \"atspi-connection-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.atspi-connection-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atspi-proxies-0.14.0\",\n sha256 = \"53403acd3ab2fdb5914f6558da22e540fc07656fce5510f8c02be0e6ef68413e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atspi-proxies/0.14.0/download\"],\n strip_prefix = \"atspi-proxies-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.atspi-proxies-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__audiopus_sys-0.2.2\",\n patch_args = [\n \"-p1\",\n ],\n patches = [\n \"@@//bazel/patches:audiopus-sys-libdir.patch\",\n ],\n sha256 = \"62314a1546a2064e033665d658e88c620a62904be945f8147e6b16c3db9f8651\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/audiopus_sys/0.2.2/download\"],\n strip_prefix = \"audiopus_sys-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.audiopus_sys-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__autocfg-1.5.1\",\n sha256 = \"f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/autocfg/1.5.1/download\"],\n strip_prefix = \"autocfg-1.5.1\",\n build_file = Label(\"@crates//crates:BUILD.autocfg-1.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base16ct-0.2.0\",\n sha256 = \"4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base16ct/0.2.0/download\"],\n strip_prefix = \"base16ct-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.base16ct-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-0.22.1\",\n sha256 = \"72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64/0.22.1/download\"],\n strip_prefix = \"base64-0.22.1\",\n build_file = Label(\"@crates//crates:BUILD.base64-0.22.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-0.23.1\",\n sha256 = \"ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64/0.23.1/download\"],\n strip_prefix = \"base64-0.23.1\",\n build_file = Label(\"@crates//crates:BUILD.base64-0.23.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-simd-0.8.0\",\n sha256 = \"339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64-simd/0.8.0/download\"],\n strip_prefix = \"base64-simd-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.base64-simd-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64ct-1.8.3\",\n sha256 = \"2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64ct/1.8.3/download\"],\n strip_prefix = \"base64ct-1.8.3\",\n build_file = Label(\"@crates//crates:BUILD.base64ct-1.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bigdecimal-0.4.10\",\n sha256 = \"4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bigdecimal/0.4.10/download\"],\n strip_prefix = \"bigdecimal-0.4.10\",\n build_file = Label(\"@crates//crates:BUILD.bigdecimal-0.4.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__binary-heap-plus-0.5.0\",\n sha256 = \"e4551d8382e911ecc0d0f0ffb602777988669be09447d536ff4388d1def11296\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/binary-heap-plus/0.5.0/download\"],\n strip_prefix = \"binary-heap-plus-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.binary-heap-plus-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bincode-1.3.3\",\n sha256 = \"b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bincode/1.3.3/download\"],\n strip_prefix = \"bincode-1.3.3\",\n build_file = Label(\"@crates//crates:BUILD.bincode-1.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bindgen-0.72.1\",\n sha256 = \"993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bindgen/0.72.1/download\"],\n strip_prefix = \"bindgen-0.72.1\",\n build_file = Label(\"@crates//crates:BUILD.bindgen-0.72.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-set-0.8.0\",\n sha256 = \"08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-set/0.8.0/download\"],\n strip_prefix = \"bit-set-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.bit-set-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-vec-0.8.0\",\n sha256 = \"5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-vec/0.8.0/download\"],\n strip_prefix = \"bit-vec-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.bit-vec-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitflags-1.3.2\",\n sha256 = \"bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitflags/1.3.2/download\"],\n strip_prefix = \"bitflags-1.3.2\",\n build_file = Label(\"@crates//crates:BUILD.bitflags-1.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitflags-2.13.1\",\n sha256 = \"b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitflags/2.13.1/download\"],\n strip_prefix = \"bitflags-2.13.1\",\n build_file = Label(\"@crates//crates:BUILD.bitflags-2.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitvec-1.1.1\",\n sha256 = \"ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitvec/1.1.1/download\"],\n strip_prefix = \"bitvec-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.bitvec-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__blake2b_simd-1.0.4\",\n sha256 = \"b79834656f71332577234b50bfc009996f7449e0c056884e6a02492ded0ca2f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/blake2b_simd/1.0.4/download\"],\n strip_prefix = \"blake2b_simd-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.blake2b_simd-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__blake3-1.8.6\",\n sha256 = \"76ae7bad254120e9e4c63bafc385310756f90c484eac0e36b8317cf09cb92a77\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/blake3/1.8.6/download\"],\n strip_prefix = \"blake3-1.8.6\",\n build_file = Label(\"@crates//crates:BUILD.blake3-1.8.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-buffer-0.10.4\",\n sha256 = \"3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-buffer/0.10.4/download\"],\n strip_prefix = \"block-buffer-0.10.4\",\n build_file = Label(\"@crates//crates:BUILD.block-buffer-0.10.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-buffer-0.12.1\",\n sha256 = \"d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-buffer/0.12.1/download\"],\n strip_prefix = \"block-buffer-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.block-buffer-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-padding-0.3.3\",\n sha256 = \"a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-padding/0.3.3/download\"],\n strip_prefix = \"block-padding-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.block-padding-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block2-0.6.2\",\n sha256 = \"cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block2/0.6.2/download\"],\n strip_prefix = \"block2-0.6.2\",\n build_file = Label(\"@crates//crates:BUILD.block2-0.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__blocking-1.6.2\",\n sha256 = \"e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/blocking/1.6.2/download\"],\n strip_prefix = \"blocking-1.6.2\",\n build_file = Label(\"@crates//crates:BUILD.blocking-1.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bon-3.9.3\",\n sha256 = \"a602c73c7b0148ec6d12af6fd5cc7a46e2eacc8878271a999abac56eed12f561\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bon/3.9.3/download\"],\n strip_prefix = \"bon-3.9.3\",\n build_file = Label(\"@crates//crates:BUILD.bon-3.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bon-macros-3.9.3\",\n sha256 = \"6dee98b0db6a962de883bf5d20362dee4d7ca0d12fe39a7c6c73c844e1cd7c1f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bon-macros/3.9.3/download\"],\n strip_prefix = \"bon-macros-3.9.3\",\n build_file = Label(\"@crates//crates:BUILD.bon-macros-3.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__brush-parser-0.3.0\",\n sha256 = \"f7367124d4f38fdcd65f4b815bda7caeb3de377b9cd95ffa1b23627989c93718\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/brush-parser/0.3.0/download\"],\n strip_prefix = \"brush-parser-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.brush-parser-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__brush-parser-0.4.0\",\n sha256 = \"9f64b19efc02f0dd6cac1d462e20a1098f425f09cb13624efbb1b7d63f061735\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/brush-parser/0.4.0/download\"],\n strip_prefix = \"brush-parser-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.brush-parser-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bstr-1.13.0\",\n sha256 = \"1f7dc094d718f2e1c1559ad110e27eeaae14a5465d3d56dd6dbd793079fbd530\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bstr/1.13.0/download\"],\n strip_prefix = \"bstr-1.13.0\",\n build_file = Label(\"@crates//crates:BUILD.bstr-1.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bumpalo-3.20.3\",\n sha256 = \"72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bumpalo/3.20.3/download\"],\n strip_prefix = \"bumpalo-3.20.3\",\n build_file = Label(\"@crates//crates:BUILD.bumpalo-3.20.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__by_address-1.2.1\",\n sha256 = \"64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/by_address/1.2.1/download\"],\n strip_prefix = \"by_address-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.by_address-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecheck-0.8.3\",\n sha256 = \"26333eeac754f0ad8a6bcd0eb0ac012156302e4e16b852b72ee399aea4f12c29\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecheck/0.8.3/download\"],\n strip_prefix = \"bytecheck-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.bytecheck-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecheck_derive-0.8.3\",\n sha256 = \"46d07918caa9eeaaf06b7873925c53a61daac173539b4f7715090745e44e4e69\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecheck_derive/0.8.3/download\"],\n strip_prefix = \"bytecheck_derive-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.bytecheck_derive-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecount-0.6.9\",\n sha256 = \"175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecount/0.6.9/download\"],\n strip_prefix = \"bytecount-0.6.9\",\n build_file = Label(\"@crates//crates:BUILD.bytecount-0.6.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytemuck-1.25.2\",\n sha256 = \"95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytemuck/1.25.2/download\"],\n strip_prefix = \"bytemuck-1.25.2\",\n build_file = Label(\"@crates//crates:BUILD.bytemuck-1.25.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytemuck_derive-1.12.0\",\n sha256 = \"fc0e56a716f1e132ff6bf4bdac1c944a3fcdc1cae65f70a4a2a1ac3b401d2d1f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytemuck_derive/1.12.0/download\"],\n strip_prefix = \"bytemuck_derive-1.12.0\",\n build_file = Label(\"@crates//crates:BUILD.bytemuck_derive-1.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__byteorder-1.5.0\",\n sha256 = \"1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/byteorder/1.5.0/download\"],\n strip_prefix = \"byteorder-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.byteorder-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__byteorder-lite-0.1.0\",\n sha256 = \"8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/byteorder-lite/0.1.0/download\"],\n strip_prefix = \"byteorder-lite-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.byteorder-lite-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytes-1.12.1\",\n sha256 = \"fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytes/1.12.1/download\"],\n strip_prefix = \"bytes-1.12.1\",\n build_file = Label(\"@crates//crates:BUILD.bytes-1.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached-0.56.0\",\n sha256 = \"801927ee168e17809ab8901d9f01f700cd7d8d6a6527997fee44e4b0327a253c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached/0.56.0/download\"],\n strip_prefix = \"cached-0.56.0\",\n build_file = Label(\"@crates//crates:BUILD.cached-0.56.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached-0.59.0\",\n sha256 = \"53b6f5d101f0f6322c8646a45b7c581a673e476329040d97565815c2461dd0c4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached/0.59.0/download\"],\n strip_prefix = \"cached-0.59.0\",\n build_file = Label(\"@crates//crates:BUILD.cached-0.59.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached_proc_macro-0.25.0\",\n sha256 = \"9225bdcf4e4a9a4c08bf16607908eb2fbf746828d5e0b5e019726dbf6571f201\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached_proc_macro/0.25.0/download\"],\n strip_prefix = \"cached_proc_macro-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.cached_proc_macro-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached_proc_macro-0.27.0\",\n sha256 = \"8ebcf9c75f17a17d55d11afc98e46167d4790a263f428891b8705ab2f793eca3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached_proc_macro/0.27.0/download\"],\n strip_prefix = \"cached_proc_macro-0.27.0\",\n build_file = Label(\"@crates//crates:BUILD.cached_proc_macro-0.27.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached_proc_macro_types-0.1.1\",\n sha256 = \"ade8366b8bd5ba243f0a58f036cc0ca8a2f069cff1a2351ef1cac6b083e16fc0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached_proc_macro_types/0.1.1/download\"],\n strip_prefix = \"cached_proc_macro_types-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.cached_proc_macro_types-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__calendrical_calculations-0.2.4\",\n sha256 = \"5abbd6eeda6885048d357edc66748eea6e0268e3dd11f326fff5bd248d779c26\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/calendrical_calculations/0.2.4/download\"],\n strip_prefix = \"calendrical_calculations-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.calendrical_calculations-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cbc-0.1.2\",\n sha256 = \"26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cbc/0.1.2/download\"],\n strip_prefix = \"cbc-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.cbc-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cc-1.2.67\",\n sha256 = \"e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cc/1.2.67/download\"],\n strip_prefix = \"cc-1.2.67\",\n build_file = Label(\"@crates//crates:BUILD.cc-1.2.67.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ccm-0.5.0\",\n sha256 = \"9ae3c82e4355234767756212c570e29833699ab63e6ffd161887314cc5b43847\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ccm/0.5.0/download\"],\n strip_prefix = \"ccm-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.ccm-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cexpr-0.6.0\",\n sha256 = \"6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cexpr/0.6.0/download\"],\n strip_prefix = \"cexpr-0.6.0\",\n build_file = Label(\"@crates//crates:BUILD.cexpr-0.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg-expr-0.20.8\",\n sha256 = \"fb693542bcafa528e198be0ebd9d3632ca5b7c93dbe7237460e199910835997c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg-expr/0.20.8/download\"],\n strip_prefix = \"cfg-expr-0.20.8\",\n build_file = Label(\"@crates//crates:BUILD.cfg-expr-0.20.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg-if-1.0.4\",\n sha256 = \"9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg-if/1.0.4/download\"],\n strip_prefix = \"cfg-if-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.cfg-if-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg_aliases-0.1.1\",\n sha256 = \"fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg_aliases/0.1.1/download\"],\n strip_prefix = \"cfg_aliases-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.cfg_aliases-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg_aliases-0.2.2\",\n sha256 = \"f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg_aliases/0.2.2/download\"],\n strip_prefix = \"cfg_aliases-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.cfg_aliases-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chacha20-0.10.1\",\n sha256 = \"d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chacha20/0.10.1/download\"],\n strip_prefix = \"chacha20-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.chacha20-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chacha20-0.9.1\",\n sha256 = \"c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chacha20/0.9.1/download\"],\n strip_prefix = \"chacha20-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.chacha20-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chacha20poly1305-0.10.1\",\n sha256 = \"10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chacha20poly1305/0.10.1/download\"],\n strip_prefix = \"chacha20poly1305-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.chacha20poly1305-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__check_elevation-0.2.7\",\n sha256 = \"a7fe1fbbd8bd3174109071530f12932ff471eeff30d83e9c485d6ff424ac534b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/check_elevation/0.2.7/download\"],\n strip_prefix = \"check_elevation-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.check_elevation-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chrono-0.4.45\",\n sha256 = \"1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chrono/0.4.45/download\"],\n strip_prefix = \"chrono-0.4.45\",\n build_file = Label(\"@crates//crates:BUILD.chrono-0.4.45.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cipher-0.4.4\",\n sha256 = \"773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cipher/0.4.4/download\"],\n strip_prefix = \"cipher-0.4.4\",\n build_file = Label(\"@crates//crates:BUILD.cipher-0.4.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clang-sys-1.9.1\",\n sha256 = \"157a8ba7b480713b56f4c09fd13fc3e0a22a5dfab8097ba61cbc5feef950788a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clang-sys/1.9.1/download\"],\n strip_prefix = \"clang-sys-1.9.1\",\n build_file = Label(\"@crates//crates:BUILD.clang-sys-1.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap-4.6.6\",\n sha256 = \"473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap/4.6.6/download\"],\n strip_prefix = \"clap-4.6.6\",\n build_file = Label(\"@crates//crates:BUILD.clap-4.6.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_builder-4.6.6\",\n sha256 = \"7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_builder/4.6.6/download\"],\n strip_prefix = \"clap_builder-4.6.6\",\n build_file = Label(\"@crates//crates:BUILD.clap_builder-4.6.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_derive-4.6.4\",\n sha256 = \"d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_derive/4.6.4/download\"],\n strip_prefix = \"clap_derive-4.6.4\",\n build_file = Label(\"@crates//crates:BUILD.clap_derive-4.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_lex-1.1.0\",\n sha256 = \"c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_lex/1.1.0/download\"],\n strip_prefix = \"clap_lex-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.clap_lex-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clipboard-win-5.4.1\",\n sha256 = \"bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clipboard-win/5.4.1/download\"],\n strip_prefix = \"clipboard-win-5.4.1\",\n build_file = Label(\"@crates//crates:BUILD.clipboard-win-5.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cmake-0.1.58\",\n sha256 = \"c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cmake/0.1.58/download\"],\n strip_prefix = \"cmake-0.1.58\",\n build_file = Label(\"@crates//crates:BUILD.cmake-0.1.58.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__codesnake-0.2.1\",\n sha256 = \"2205f7f6d3de68ecf4c291c789b3edf07b6569268abd0188819086f71ae42225\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/codesnake/0.2.1/download\"],\n strip_prefix = \"codesnake-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.codesnake-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__color-print-0.3.7\",\n sha256 = \"3aa954171903797d5623e047d9ab69d91b493657917bdfb8c2c80ecaf9cdb6f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/color-print/0.3.7/download\"],\n strip_prefix = \"color-print-0.3.7\",\n build_file = Label(\"@crates//crates:BUILD.color-print-0.3.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__color-print-proc-macro-0.3.7\",\n sha256 = \"692186b5ebe54007e45a59aea47ece9eb4108e141326c304cdc91699a7118a22\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/color-print-proc-macro/0.3.7/download\"],\n strip_prefix = \"color-print-proc-macro-0.3.7\",\n build_file = Label(\"@crates//crates:BUILD.color-print-proc-macro-0.3.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__color_quant-1.1.0\",\n sha256 = \"3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/color_quant/1.1.0/download\"],\n strip_prefix = \"color_quant-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.color_quant-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colorchoice-1.0.5\",\n sha256 = \"1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colorchoice/1.0.5/download\"],\n strip_prefix = \"colorchoice-1.0.5\",\n build_file = Label(\"@crates//crates:BUILD.colorchoice-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__command-fds-0.3.3\",\n sha256 = \"1b60b5124979fccd9addd89d8b97a1d6eebb4950694520c75ddd722535ea443f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/command-fds/0.3.3/download\"],\n strip_prefix = \"command-fds-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.command-fds-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__compare-0.1.0\",\n sha256 = \"120133d4db2ec47efe2e26502ee984747630c67f51974fca0b6c1340cf2368d3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/compare/0.1.0/download\"],\n strip_prefix = \"compare-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.compare-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__concurrent-queue-2.5.0\",\n sha256 = \"4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/concurrent-queue/2.5.0/download\"],\n strip_prefix = \"concurrent-queue-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.concurrent-queue-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__console-0.16.4\",\n sha256 = \"4fe5f465a4f6fee88fad41b85d990f84c835335e85b5d9e6e63e0d06d28cba7c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/console/0.16.4/download\"],\n strip_prefix = \"console-0.16.4\",\n build_file = Label(\"@crates//crates:BUILD.console-0.16.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__const-oid-0.10.2\",\n sha256 = \"a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/const-oid/0.10.2/download\"],\n strip_prefix = \"const-oid-0.10.2\",\n build_file = Label(\"@crates//crates:BUILD.const-oid-0.10.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__const-oid-0.9.6\",\n sha256 = \"c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/const-oid/0.9.6/download\"],\n strip_prefix = \"const-oid-0.9.6\",\n build_file = Label(\"@crates//crates:BUILD.const-oid-0.9.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__const-random-0.1.18\",\n sha256 = \"87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/const-random/0.1.18/download\"],\n strip_prefix = \"const-random-0.1.18\",\n build_file = Label(\"@crates//crates:BUILD.const-random-0.1.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__const-random-macro-0.1.16\",\n sha256 = \"f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/const-random-macro/0.1.16/download\"],\n strip_prefix = \"const-random-macro-0.1.16\",\n build_file = Label(\"@crates//crates:BUILD.const-random-macro-0.1.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__constant_time_eq-0.4.2\",\n sha256 = \"3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/constant_time_eq/0.4.2/download\"],\n strip_prefix = \"constant_time_eq-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.constant_time_eq-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__convert_case-0.11.0\",\n sha256 = \"affbf0190ed2caf063e3def54ff444b449371d55c58e513a95ab98eca50adb49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/convert_case/0.11.0/download\"],\n strip_prefix = \"convert_case-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.convert_case-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__convert_case-0.8.0\",\n sha256 = \"baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/convert_case/0.8.0/download\"],\n strip_prefix = \"convert_case-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.convert_case-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cookie-factory-0.3.3\",\n sha256 = \"9885fa71e26b8ab7855e2ec7cae6e9b380edff76cd052e07c683a0319d51b3a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cookie-factory/0.3.3/download\"],\n strip_prefix = \"cookie-factory-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.cookie-factory-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-foundation-0.10.1\",\n sha256 = \"b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-foundation/0.10.1/download\"],\n strip_prefix = \"core-foundation-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.core-foundation-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-foundation-sys-0.8.7\",\n sha256 = \"773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-foundation-sys/0.8.7/download\"],\n strip_prefix = \"core-foundation-sys-0.8.7\",\n build_file = Label(\"@crates//crates:BUILD.core-foundation-sys-0.8.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-graphics-0.25.0\",\n sha256 = \"064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-graphics/0.25.0/download\"],\n strip_prefix = \"core-graphics-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.core-graphics-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-graphics-types-0.2.0\",\n sha256 = \"3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-graphics-types/0.2.0/download\"],\n strip_prefix = \"core-graphics-types-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.core-graphics-types-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core_maths-0.1.1\",\n sha256 = \"77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core_maths/0.1.1/download\"],\n strip_prefix = \"core_maths-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.core_maths-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cpufeatures-0.2.17\",\n sha256 = \"59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cpufeatures/0.2.17/download\"],\n strip_prefix = \"cpufeatures-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.cpufeatures-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cpufeatures-0.3.0\",\n sha256 = \"8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cpufeatures/0.3.0/download\"],\n strip_prefix = \"cpufeatures-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.cpufeatures-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crc-3.4.0\",\n sha256 = \"5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crc/3.4.0/download\"],\n strip_prefix = \"crc-3.4.0\",\n build_file = Label(\"@crates//crates:BUILD.crc-3.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crc-catalog-2.5.0\",\n sha256 = \"217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crc-catalog/2.5.0/download\"],\n strip_prefix = \"crc-catalog-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.crc-catalog-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crc-fast-1.8.2\",\n sha256 = \"85d9be5297a59f1b7651fd2711a1f4461929f53b182b394df0df15b3a387ef51\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crc-fast/1.8.2/download\"],\n strip_prefix = \"crc-fast-1.8.2\",\n build_file = Label(\"@crates//crates:BUILD.crc-fast-1.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crc32fast-1.5.0\",\n sha256 = \"9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crc32fast/1.5.0/download\"],\n strip_prefix = \"crc32fast-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.crc32fast-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-deque-0.8.7\",\n sha256 = \"5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-deque/0.8.7/download\"],\n strip_prefix = \"crossbeam-deque-0.8.7\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-deque-0.8.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-epoch-0.9.20\",\n sha256 = \"2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-epoch/0.9.20/download\"],\n strip_prefix = \"crossbeam-epoch-0.9.20\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-epoch-0.9.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-utils-0.8.22\",\n sha256 = \"61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-utils/0.8.22/download\"],\n strip_prefix = \"crossbeam-utils-0.8.22\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-utils-0.8.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crunchy-0.2.4\",\n sha256 = \"460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crunchy/0.2.4/download\"],\n strip_prefix = \"crunchy-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.crunchy-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-bigint-0.5.5\",\n sha256 = \"0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-bigint/0.5.5/download\"],\n strip_prefix = \"crypto-bigint-0.5.5\",\n build_file = Label(\"@crates//crates:BUILD.crypto-bigint-0.5.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-common-0.1.7\",\n sha256 = \"78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-common/0.1.7/download\"],\n strip_prefix = \"crypto-common-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.crypto-common-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-common-0.2.2\",\n sha256 = \"ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-common/0.2.2/download\"],\n strip_prefix = \"crypto-common-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.crypto-common-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ctor-1.0.12\",\n sha256 = \"2d83cb7e7a873830708d6b02a78cd36a592c6fa14bf267b68725103b85c0d77f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ctor/1.0.12/download\"],\n strip_prefix = \"ctor-1.0.12\",\n build_file = Label(\"@crates//crates:BUILD.ctor-1.0.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ctr-0.9.2\",\n sha256 = \"0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ctr/0.9.2/download\"],\n strip_prefix = \"ctr-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.ctr-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__curve25519-dalek-4.1.3\",\n sha256 = \"97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/curve25519-dalek/4.1.3/download\"],\n strip_prefix = \"curve25519-dalek-4.1.3\",\n build_file = Label(\"@crates//crates:BUILD.curve25519-dalek-4.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__curve25519-dalek-derive-0.1.1\",\n sha256 = \"f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/curve25519-dalek-derive/0.1.1/download\"],\n strip_prefix = \"curve25519-dalek-derive-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.curve25519-dalek-derive-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling-0.20.11\",\n sha256 = \"fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling/0.20.11/download\"],\n strip_prefix = \"darling-0.20.11\",\n build_file = Label(\"@crates//crates:BUILD.darling-0.20.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling-0.23.0\",\n sha256 = \"25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling/0.23.0/download\"],\n strip_prefix = \"darling-0.23.0\",\n build_file = Label(\"@crates//crates:BUILD.darling-0.23.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling_core-0.20.11\",\n sha256 = \"0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling_core/0.20.11/download\"],\n strip_prefix = \"darling_core-0.20.11\",\n build_file = Label(\"@crates//crates:BUILD.darling_core-0.20.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling_core-0.23.0\",\n sha256 = \"9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling_core/0.23.0/download\"],\n strip_prefix = \"darling_core-0.23.0\",\n build_file = Label(\"@crates//crates:BUILD.darling_core-0.23.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling_macro-0.20.11\",\n sha256 = \"fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling_macro/0.20.11/download\"],\n strip_prefix = \"darling_macro-0.20.11\",\n build_file = Label(\"@crates//crates:BUILD.darling_macro-0.20.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling_macro-0.23.0\",\n sha256 = \"ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling_macro/0.23.0/download\"],\n strip_prefix = \"darling_macro-0.23.0\",\n build_file = Label(\"@crates//crates:BUILD.darling_macro-0.23.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dashmap-6.2.1\",\n sha256 = \"e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dashmap/6.2.1/download\"],\n strip_prefix = \"dashmap-6.2.1\",\n build_file = Label(\"@crates//crates:BUILD.dashmap-6.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__data-encoding-2.11.1\",\n sha256 = \"4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/data-encoding/2.11.1/download\"],\n strip_prefix = \"data-encoding-2.11.1\",\n build_file = Label(\"@crates//crates:BUILD.data-encoding-2.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__data-encoding-macro-0.1.21\",\n sha256 = \"c6a127ecbb3c4632e1525380e04c0c3fcf8dcb44d32a79ea290d8a36906edcd8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/data-encoding-macro/0.1.21/download\"],\n strip_prefix = \"data-encoding-macro-0.1.21\",\n build_file = Label(\"@crates//crates:BUILD.data-encoding-macro-0.1.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__data-encoding-macro-internal-0.1.19\",\n sha256 = \"c54e03a951783e8b327515db3f2a2fd0e3bed362a96b066f341ce66ed49b4ead\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/data-encoding-macro-internal/0.1.19/download\"],\n strip_prefix = \"data-encoding-macro-internal-0.1.19\",\n build_file = Label(\"@crates//crates:BUILD.data-encoding-macro-internal-0.1.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__defmt-1.1.1\",\n sha256 = \"e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/defmt/1.1.1/download\"],\n strip_prefix = \"defmt-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.defmt-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__defmt-macros-1.1.1\",\n sha256 = \"bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/defmt-macros/1.1.1/download\"],\n strip_prefix = \"defmt-macros-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.defmt-macros-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__defmt-parser-1.0.0\",\n sha256 = \"10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/defmt-parser/1.0.0/download\"],\n strip_prefix = \"defmt-parser-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.defmt-parser-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__der-0.7.10\",\n sha256 = \"e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/der/0.7.10/download\"],\n strip_prefix = \"der-0.7.10\",\n build_file = Label(\"@crates//crates:BUILD.der-0.7.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__der-parser-9.0.0\",\n sha256 = \"5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/der-parser/9.0.0/download\"],\n strip_prefix = \"der-parser-9.0.0\",\n build_file = Label(\"@crates//crates:BUILD.der-parser-9.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__deranged-0.5.8\",\n sha256 = \"7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/deranged/0.5.8/download\"],\n strip_prefix = \"deranged-0.5.8\",\n build_file = Label(\"@crates//crates:BUILD.deranged-0.5.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__diff-0.1.13\",\n sha256 = \"56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/diff/0.1.13/download\"],\n strip_prefix = \"diff-0.1.13\",\n build_file = Label(\"@crates//crates:BUILD.diff-0.1.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__digest-0.10.7\",\n sha256 = \"9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/digest/0.10.7/download\"],\n strip_prefix = \"digest-0.10.7\",\n build_file = Label(\"@crates//crates:BUILD.digest-0.10.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__digest-0.11.3\",\n sha256 = \"f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/digest/0.11.3/download\"],\n strip_prefix = \"digest-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.digest-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dispatch2-0.3.1\",\n sha256 = \"1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dispatch2/0.3.1/download\"],\n strip_prefix = \"dispatch2-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.dispatch2-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__displaydoc-0.2.7\",\n sha256 = \"c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/displaydoc/0.2.7/download\"],\n strip_prefix = \"displaydoc-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.displaydoc-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dlib-0.5.3\",\n sha256 = \"ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dlib/0.5.3/download\"],\n strip_prefix = \"dlib-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.dlib-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dns-lookup-3.0.1\",\n sha256 = \"6e39034cee21a2f5bbb66ba0e3689819c4bb5d00382a282006e802a7ffa6c41d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dns-lookup/3.0.1/download\"],\n strip_prefix = \"dns-lookup-3.0.1\",\n build_file = Label(\"@crates//crates:BUILD.dns-lookup-3.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__downcast-rs-1.2.1\",\n sha256 = \"75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/downcast-rs/1.2.1/download\"],\n strip_prefix = \"downcast-rs-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.downcast-rs-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-0.14.1\",\n sha256 = \"80bc8c5c6c2941f70a55c15f8d9f00f9710ebda3ffda98075f996a0e6c92756f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm/0.14.1/download\"],\n strip_prefix = \"drm-0.14.1\",\n build_file = Label(\"@crates//crates:BUILD.drm-0.14.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-0.15.0\",\n sha256 = \"7a41816e58f47f49acfd956651055ddcf137c4882c2098c30c448817af21183a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm/0.15.0/download\"],\n strip_prefix = \"drm-0.15.0\",\n build_file = Label(\"@crates//crates:BUILD.drm-0.15.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-ffi-0.9.1\",\n sha256 = \"51a91c9b32ac4e8105dec255e849e0d66e27d7c34d184364fb93e469db08f690\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm-ffi/0.9.1/download\"],\n strip_prefix = \"drm-ffi-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.drm-ffi-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-fourcc-2.2.0\",\n sha256 = \"0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm-fourcc/2.2.0/download\"],\n strip_prefix = \"drm-fourcc-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.drm-fourcc-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-sys-0.8.1\",\n sha256 = \"ecc8e1361066d91f5ffccff060a3c3be9c3ecde15be2959c1937595f7a82a9f8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm-sys/0.8.1/download\"],\n strip_prefix = \"drm-sys-0.8.1\",\n build_file = Label(\"@crates//crates:BUILD.drm-sys-0.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dtls-0.17.2\",\n sha256 = \"01a431e87fc386bd5e02deb554a013f97bc406e47a7d8e97efb7c6366b980e9c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dtls/0.17.2/download\"],\n strip_prefix = \"dtls-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.dtls-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dunce-1.0.5\",\n sha256 = \"92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dunce/1.0.5/download\"],\n strip_prefix = \"dunce-1.0.5\",\n build_file = Label(\"@crates//crates:BUILD.dunce-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dyn-clone-1.0.20\",\n sha256 = \"d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dyn-clone/1.0.20/download\"],\n strip_prefix = \"dyn-clone-1.0.20\",\n build_file = Label(\"@crates//crates:BUILD.dyn-clone-1.0.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ecdsa-0.16.9\",\n sha256 = \"ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ecdsa/0.16.9/download\"],\n strip_prefix = \"ecdsa-0.16.9\",\n build_file = Label(\"@crates//crates:BUILD.ecdsa-0.16.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__either-1.17.0\",\n sha256 = \"9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/either/1.17.0/download\"],\n strip_prefix = \"either-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.either-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__elliptic-curve-0.13.8\",\n sha256 = \"b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/elliptic-curve/0.13.8/download\"],\n strip_prefix = \"elliptic-curve-0.13.8\",\n build_file = Label(\"@crates//crates:BUILD.elliptic-curve-0.13.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__encode_unicode-1.0.0\",\n sha256 = \"34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/encode_unicode/1.0.0/download\"],\n strip_prefix = \"encode_unicode-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.encode_unicode-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__encoding_rs-0.8.35\",\n sha256 = \"75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/encoding_rs/0.8.35/download\"],\n strip_prefix = \"encoding_rs-0.8.35\",\n build_file = Label(\"@crates//crates:BUILD.encoding_rs-0.8.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__encoding_rs_io-0.1.8\",\n sha256 = \"fba3fe847045ecff794b9c138293a80db914678c453ad63fbf0c6a9eb6e00b22\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/encoding_rs_io/0.1.8/download\"],\n strip_prefix = \"encoding_rs_io-0.1.8\",\n build_file = Label(\"@crates//crates:BUILD.encoding_rs_io-0.1.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__endi-1.1.1\",\n sha256 = \"66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/endi/1.1.1/download\"],\n strip_prefix = \"endi-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.endi-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__enigo-0.6.1\",\n sha256 = \"71c6c56e50f7acae2906a0dcbb34529ca647e40421119ad5d12e7f8ba6e50010\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/enigo/0.6.1/download\"],\n strip_prefix = \"enigo-0.6.1\",\n build_file = Label(\"@crates//crates:BUILD.enigo-0.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__enumflags2-0.7.12\",\n sha256 = \"1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/enumflags2/0.7.12/download\"],\n strip_prefix = \"enumflags2-0.7.12\",\n build_file = Label(\"@crates//crates:BUILD.enumflags2-0.7.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__enumflags2_derive-0.7.12\",\n sha256 = \"67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/enumflags2_derive/0.7.12/download\"],\n strip_prefix = \"enumflags2_derive-0.7.12\",\n build_file = Label(\"@crates//crates:BUILD.enumflags2_derive-0.7.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__equivalent-1.0.2\",\n sha256 = \"877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/equivalent/1.0.2/download\"],\n strip_prefix = \"equivalent-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.equivalent-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__errno-0.3.14\",\n sha256 = \"39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/errno/0.3.14/download\"],\n strip_prefix = \"errno-0.3.14\",\n build_file = Label(\"@crates//crates:BUILD.errno-0.3.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__error-code-3.3.2\",\n sha256 = \"dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/error-code/3.3.2/download\"],\n strip_prefix = \"error-code-3.3.2\",\n build_file = Label(\"@crates//crates:BUILD.error-code-3.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__event-listener-5.4.2\",\n sha256 = \"5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/event-listener/5.4.2/download\"],\n strip_prefix = \"event-listener-5.4.2\",\n build_file = Label(\"@crates//crates:BUILD.event-listener-5.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__event-listener-strategy-0.5.4\",\n sha256 = \"8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/event-listener-strategy/0.5.4/download\"],\n strip_prefix = \"event-listener-strategy-0.5.4\",\n build_file = Label(\"@crates//crates:BUILD.event-listener-strategy-0.5.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__faccess-0.2.4\",\n sha256 = \"59ae66425802d6a903e268ae1a08b8c38ba143520f227a205edf4e9c7e3e26d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/faccess/0.2.4/download\"],\n strip_prefix = \"faccess-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.faccess-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fancy-regex-0.16.2\",\n sha256 = \"998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fancy-regex/0.16.2/download\"],\n strip_prefix = \"fancy-regex-0.16.2\",\n build_file = Label(\"@crates//crates:BUILD.fancy-regex-0.16.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fancy-regex-0.17.0\",\n sha256 = \"72cf461f865c862bb7dc573f643dd6a2b6842f7c30b07882b56bd148cc2761b8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fancy-regex/0.17.0/download\"],\n strip_prefix = \"fancy-regex-0.17.0\",\n build_file = Label(\"@crates//crates:BUILD.fancy-regex-0.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fastrand-2.5.0\",\n sha256 = \"da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fastrand/2.5.0/download\"],\n strip_prefix = \"fastrand-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.fastrand-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fax-0.2.7\",\n sha256 = \"caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fax/0.2.7/download\"],\n strip_prefix = \"fax-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.fax-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fdeflate-0.3.7\",\n sha256 = \"1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fdeflate/0.3.7/download\"],\n strip_prefix = \"fdeflate-0.3.7\",\n build_file = Label(\"@crates//crates:BUILD.fdeflate-0.3.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ff-0.13.1\",\n sha256 = \"c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ff/0.13.1/download\"],\n strip_prefix = \"ff-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.ff-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fiat-crypto-0.2.9\",\n sha256 = \"28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fiat-crypto/0.2.9/download\"],\n strip_prefix = \"fiat-crypto-0.2.9\",\n build_file = Label(\"@crates//crates:BUILD.fiat-crypto-0.2.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__filedescriptor-0.8.3\",\n sha256 = \"e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/filedescriptor/0.8.3/download\"],\n strip_prefix = \"filedescriptor-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.filedescriptor-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__filetime-0.2.29\",\n sha256 = \"5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/filetime/0.2.29/download\"],\n strip_prefix = \"filetime-0.2.29\",\n build_file = Label(\"@crates//crates:BUILD.filetime-0.2.29.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__find-msvc-tools-0.1.10\",\n sha256 = \"26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/find-msvc-tools/0.1.10/download\"],\n strip_prefix = \"find-msvc-tools-0.1.10\",\n build_file = Label(\"@crates//crates:BUILD.find-msvc-tools-0.1.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fixed_decimal-0.7.2\",\n sha256 = \"79c3c892f121fff406e5dd6b28c1b30096b95111c30701a899d4f2b18da6d1bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fixed_decimal/0.7.2/download\"],\n strip_prefix = \"fixed_decimal-0.7.2\",\n build_file = Label(\"@crates//crates:BUILD.fixed_decimal-0.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fixedbitset-0.5.7\",\n sha256 = \"1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fixedbitset/0.5.7/download\"],\n strip_prefix = \"fixedbitset-0.5.7\",\n build_file = Label(\"@crates//crates:BUILD.fixedbitset-0.5.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__flate2-1.1.9\",\n sha256 = \"843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/flate2/1.1.9/download\"],\n strip_prefix = \"flate2-1.1.9\",\n build_file = Label(\"@crates//crates:BUILD.flate2-1.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fluent-0.17.0\",\n sha256 = \"8137a6d5a2c50d6b0ebfcb9aaa91a28154e0a70605f112d30cb0cd4a78670477\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fluent/0.17.0/download\"],\n strip_prefix = \"fluent-0.17.0\",\n build_file = Label(\"@crates//crates:BUILD.fluent-0.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fluent-bundle-0.16.0\",\n sha256 = \"01203cb8918f5711e73891b347816d932046f95f54207710bda99beaeb423bf4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fluent-bundle/0.16.0/download\"],\n strip_prefix = \"fluent-bundle-0.16.0\",\n build_file = Label(\"@crates//crates:BUILD.fluent-bundle-0.16.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fluent-langneg-0.13.1\",\n sha256 = \"7eebbe59450baee8282d71676f3bfed5689aeab00b27545e83e5f14b1195e8b0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fluent-langneg/0.13.1/download\"],\n strip_prefix = \"fluent-langneg-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.fluent-langneg-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fluent-syntax-0.12.0\",\n sha256 = \"54f0d287c53ffd184d04d8677f590f4ac5379785529e5e08b1c8083acdd5c198\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fluent-syntax/0.12.0/download\"],\n strip_prefix = \"fluent-syntax-0.12.0\",\n build_file = Label(\"@crates//crates:BUILD.fluent-syntax-0.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__flume-0.11.1\",\n sha256 = \"da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/flume/0.11.1/download\"],\n strip_prefix = \"flume-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.flume-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fnv-1.0.7\",\n sha256 = \"3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fnv/1.0.7/download\"],\n strip_prefix = \"fnv-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.fnv-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foldhash-0.1.5\",\n sha256 = \"d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foldhash/0.1.5/download\"],\n strip_prefix = \"foldhash-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.foldhash-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foldhash-0.2.0\",\n sha256 = \"77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foldhash/0.2.0/download\"],\n strip_prefix = \"foldhash-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.foldhash-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fontdue-0.9.4\",\n sha256 = \"7894823fa221401399e2598f8b63f81ac77ff5c63248b7656779bff1632d7d3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fontdue/0.9.4/download\"],\n strip_prefix = \"fontdue-0.9.4\",\n build_file = Label(\"@crates//crates:BUILD.fontdue-0.9.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foreign-types-0.5.0\",\n sha256 = \"d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foreign-types/0.5.0/download\"],\n strip_prefix = \"foreign-types-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.foreign-types-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foreign-types-macros-0.2.4\",\n sha256 = \"ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foreign-types-macros/0.2.4/download\"],\n strip_prefix = \"foreign-types-macros-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.foreign-types-macros-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foreign-types-shared-0.3.1\",\n sha256 = \"aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foreign-types-shared/0.3.1/download\"],\n strip_prefix = \"foreign-types-shared-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.foreign-types-shared-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__form_urlencoded-1.2.2\",\n sha256 = \"cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/form_urlencoded/1.2.2/download\"],\n strip_prefix = \"form_urlencoded-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.form_urlencoded-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fs_extra-1.3.0\",\n sha256 = \"42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fs_extra/1.3.0/download\"],\n strip_prefix = \"fs_extra-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fs_extra-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fsevent-sys-4.1.0\",\n sha256 = \"76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fsevent-sys/4.1.0/download\"],\n strip_prefix = \"fsevent-sys-4.1.0\",\n build_file = Label(\"@crates//crates:BUILD.fsevent-sys-4.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__funty-2.0.0\",\n sha256 = \"e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/funty/2.0.0/download\"],\n strip_prefix = \"funty-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.funty-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-0.3.33\",\n sha256 = \"a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures/0.3.33/download\"],\n strip_prefix = \"futures-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-channel-0.3.33\",\n sha256 = \"262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-channel/0.3.33/download\"],\n strip_prefix = \"futures-channel-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-channel-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-core-0.3.33\",\n sha256 = \"2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-core/0.3.33/download\"],\n strip_prefix = \"futures-core-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-core-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-executor-0.3.33\",\n sha256 = \"6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-executor/0.3.33/download\"],\n strip_prefix = \"futures-executor-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-executor-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-io-0.3.33\",\n sha256 = \"4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-io/0.3.33/download\"],\n strip_prefix = \"futures-io-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-io-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-lite-2.6.1\",\n sha256 = \"f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-lite/2.6.1/download\"],\n strip_prefix = \"futures-lite-2.6.1\",\n build_file = Label(\"@crates//crates:BUILD.futures-lite-2.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-macro-0.3.33\",\n sha256 = \"2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-macro/0.3.33/download\"],\n strip_prefix = \"futures-macro-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-macro-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-sink-0.3.33\",\n sha256 = \"e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-sink/0.3.33/download\"],\n strip_prefix = \"futures-sink-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-sink-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-task-0.3.33\",\n sha256 = \"b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-task/0.3.33/download\"],\n strip_prefix = \"futures-task-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-task-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-util-0.3.33\",\n sha256 = \"a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-util/0.3.33/download\"],\n strip_prefix = \"futures-util-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-util-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gbm-0.18.0\",\n sha256 = \"ce852e998d3ca5e4a97014fb31c940dc5ef344ec7d364984525fd11e8a547e6a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gbm/0.18.0/download\"],\n strip_prefix = \"gbm-0.18.0\",\n build_file = Label(\"@crates//crates:BUILD.gbm-0.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gbm-sys-0.4.0\",\n sha256 = \"c13a5f2acc785d8fb6bf6b7ab6bfb0ef5dad4f4d97e8e70bb8e470722312f76f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gbm-sys/0.4.0/download\"],\n strip_prefix = \"gbm-sys-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.gbm-sys-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__generic-array-0.14.7\",\n sha256 = \"85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/generic-array/0.14.7/download\"],\n strip_prefix = \"generic-array-0.14.7\",\n build_file = Label(\"@crates//crates:BUILD.generic-array-0.14.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gethostname-1.1.0\",\n sha256 = \"1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gethostname/1.1.0/download\"],\n strip_prefix = \"gethostname-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.gethostname-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.2.17\",\n sha256 = \"ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.2.17/download\"],\n strip_prefix = \"getrandom-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.3.4\",\n sha256 = \"899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.3.4/download\"],\n strip_prefix = \"getrandom-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.4.3\",\n sha256 = \"300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.4.3/download\"],\n strip_prefix = \"getrandom-0.4.3\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.4.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ghash-0.5.1\",\n sha256 = \"f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ghash/0.5.1/download\"],\n strip_prefix = \"ghash-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.ghash-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gif-0.14.2\",\n sha256 = \"ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gif/0.14.2/download\"],\n strip_prefix = \"gif-0.14.2\",\n build_file = Label(\"@crates//crates:BUILD.gif-0.14.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gl-0.14.0\",\n sha256 = \"a94edab108827d67608095e269cf862e60d920f144a5026d3dbcfd8b877fb404\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gl/0.14.0/download\"],\n strip_prefix = \"gl-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.gl-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gl_generator-0.14.0\",\n sha256 = \"1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gl_generator/0.14.0/download\"],\n strip_prefix = \"gl_generator-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.gl_generator-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__glob-0.3.4\",\n sha256 = \"e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/glob/0.3.4/download\"],\n strip_prefix = \"glob-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.glob-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__globset-0.4.20\",\n sha256 = \"07c34a9410465b45bd9787443bc7370f37735bad04b0f0cd57ff1a3186c98988\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/globset/0.4.20/download\"],\n strip_prefix = \"globset-0.4.20\",\n build_file = Label(\"@crates//crates:BUILD.globset-0.4.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-cli-0.1.12\",\n sha256 = \"cf32d263c5d5cc2a23ce587097f5ddafdb188492ba2e6fb638eaccdc22453631\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-cli/0.1.12/download\"],\n strip_prefix = \"grep-cli-0.1.12\",\n build_file = Label(\"@crates//crates:BUILD.grep-cli-0.1.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-matcher-0.1.9\",\n sha256 = \"f9417543f4870fc8f1c8e1af870afae2431007626d9e703fce6471c468d33847\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-matcher/0.1.9/download\"],\n strip_prefix = \"grep-matcher-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.grep-matcher-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-pcre2-0.1.10\",\n sha256 = \"b752bb6f57dd3716e55b63a33ca05b5825c3d66cd427468874a5564af6ca365c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-pcre2/0.1.10/download\"],\n strip_prefix = \"grep-pcre2-0.1.10\",\n build_file = Label(\"@crates//crates:BUILD.grep-pcre2-0.1.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-printer-0.3.1\",\n sha256 = \"fd76035e87871f51c1ee5b793e32122b3ccf9c692662d9622ef1686ff5321acb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-printer/0.3.1/download\"],\n strip_prefix = \"grep-printer-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.grep-printer-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-regex-0.1.14\",\n sha256 = \"0ce0c256c3ad82bcc07b812c15a45ec1d398122e8e15124f96695234db7112ef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-regex/0.1.14/download\"],\n strip_prefix = \"grep-regex-0.1.14\",\n build_file = Label(\"@crates//crates:BUILD.grep-regex-0.1.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-searcher-0.1.17\",\n sha256 = \"72348823a0eafc4bc2e9051064f28b5b42cc100b571b3a35d67918d711efcbc6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-searcher/0.1.17/download\"],\n strip_prefix = \"grep-searcher-0.1.17\",\n build_file = Label(\"@crates//crates:BUILD.grep-searcher-0.1.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__group-0.13.0\",\n sha256 = \"f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/group/0.13.0/download\"],\n strip_prefix = \"group-0.13.0\",\n build_file = Label(\"@crates//crates:BUILD.group-0.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__half-2.7.1\",\n sha256 = \"6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/half/2.7.1/download\"],\n strip_prefix = \"half-2.7.1\",\n build_file = Label(\"@crates//crates:BUILD.half-2.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.14.5\",\n sha256 = \"e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.14.5/download\"],\n strip_prefix = \"hashbrown-0.14.5\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.14.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.15.5\",\n sha256 = \"9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.15.5/download\"],\n strip_prefix = \"hashbrown-0.15.5\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.15.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.16.1\",\n sha256 = \"841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.16.1/download\"],\n strip_prefix = \"hashbrown-0.16.1\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.16.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.17.1\",\n sha256 = \"ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.17.1/download\"],\n strip_prefix = \"hashbrown-0.17.1\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.17.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__heck-0.5.0\",\n sha256 = \"2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/heck/0.5.0/download\"],\n strip_prefix = \"heck-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.heck-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hermit-abi-0.5.2\",\n sha256 = \"fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hermit-abi/0.5.2/download\"],\n strip_prefix = \"hermit-abi-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.hermit-abi-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hex-0.4.3\",\n sha256 = \"7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hex/0.4.3/download\"],\n strip_prefix = \"hex-0.4.3\",\n build_file = Label(\"@crates//crates:BUILD.hex-0.4.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hifijson-0.2.3\",\n sha256 = \"0a7763b98ba8a24f59e698bf9ab197e7676c640d6455d1580b4ce7dc560f0f0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hifijson/0.2.3/download\"],\n strip_prefix = \"hifijson-0.2.3\",\n build_file = Label(\"@crates//crates:BUILD.hifijson-0.2.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hkdf-0.12.4\",\n sha256 = \"7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hkdf/0.12.4/download\"],\n strip_prefix = \"hkdf-0.12.4\",\n build_file = Label(\"@crates//crates:BUILD.hkdf-0.12.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hmac-0.12.1\",\n sha256 = \"6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hmac/0.12.1/download\"],\n strip_prefix = \"hmac-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.hmac-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hostname-0.4.2\",\n sha256 = \"617aaa3557aef3810a6369d0a99fac8a080891b68bd9f9812a1eeda0c0730cbd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hostname/0.4.2/download\"],\n strip_prefix = \"hostname-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.hostname-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__html-escape-0.2.15\",\n sha256 = \"c9356095b4b41197bba32173600e1582792cda618f65d12f68e2e77d273413c5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/html-escape/0.2.15/download\"],\n strip_prefix = \"html-escape-0.2.15\",\n build_file = Label(\"@crates//crates:BUILD.html-escape-0.2.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__html-to-markdown-rs-3.10.6\",\n sha256 = \"e0736be7417aaf65e02124703aa8db88ad42ceff95df99783d0d48bbed4da3a8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/html-to-markdown-rs/3.10.6/download\"],\n strip_prefix = \"html-to-markdown-rs-3.10.6\",\n build_file = Label(\"@crates//crates:BUILD.html-to-markdown-rs-3.10.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__html5ever-0.39.0\",\n sha256 = \"46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/html5ever/0.39.0/download\"],\n strip_prefix = \"html5ever-0.39.0\",\n build_file = Label(\"@crates//crates:BUILD.html5ever-0.39.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hybrid-array-0.4.14\",\n sha256 = \"707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hybrid-array/0.4.14/download\"],\n strip_prefix = \"hybrid-array-0.4.14\",\n build_file = Label(\"@crates//crates:BUILD.hybrid-array-0.4.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__iana-time-zone-0.1.65\",\n sha256 = \"e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/iana-time-zone/0.1.65/download\"],\n strip_prefix = \"iana-time-zone-0.1.65\",\n build_file = Label(\"@crates//crates:BUILD.iana-time-zone-0.1.65.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__iana-time-zone-haiku-0.1.2\",\n sha256 = \"f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/iana-time-zone-haiku/0.1.2/download\"],\n strip_prefix = \"iana-time-zone-haiku-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.iana-time-zone-haiku-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_calendar-2.2.1\",\n sha256 = \"a2b2acc6263f494f1df50685b53ff8e57869e47d5c6fe39c23d518ae9a4f3e45\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_calendar/2.2.1/download\"],\n strip_prefix = \"icu_calendar-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_calendar-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_calendar_data-2.2.0\",\n sha256 = \"118577bcf3a0fa7c6ac0a7d6e951814da84ee56b9b1f68fb4d8d10b08cefaf4d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_calendar_data/2.2.0/download\"],\n strip_prefix = \"icu_calendar_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_calendar_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collator-2.2.1\",\n sha256 = \"8bbdf98e5e0aa827770acee171ebb568aaab975a36b56afdb5fd0e2f525750bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collator/2.2.1/download\"],\n strip_prefix = \"icu_collator-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_collator-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collator_data-2.2.0\",\n sha256 = \"038ed8e5817f2059c2f3efb0945ba78d060d3d25e8f1a1bea5139f821a21a2f0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collator_data/2.2.0/download\"],\n strip_prefix = \"icu_collator_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_collator_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collections-2.2.0\",\n sha256 = \"2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collections/2.2.0/download\"],\n strip_prefix = \"icu_collections-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_collections-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_datetime-2.2.0\",\n sha256 = \"989d56ea5bbc43ae2b4e0388874b002884eaf4ed3a76c84a6c8c5ad575e04d72\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_datetime/2.2.0/download\"],\n strip_prefix = \"icu_datetime-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_datetime-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_datetime_data-2.2.0\",\n sha256 = \"40d3cc1b690d9703202bc319692ac8a1f3a6390686f0930ff40542450fa34f0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_datetime_data/2.2.0/download\"],\n strip_prefix = \"icu_datetime_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_datetime_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_decimal-2.2.0\",\n sha256 = \"288247df2e32aa776ac54fdd64de552149ac43cb840f2761811f0e8d09719dd4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_decimal/2.2.0/download\"],\n strip_prefix = \"icu_decimal-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_decimal-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_decimal_data-2.2.0\",\n sha256 = \"6f14a5ca9e8af29eef62064f269078424283d90dbaffeac5225addf62aaabc22\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_decimal_data/2.2.0/download\"],\n strip_prefix = \"icu_decimal_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_decimal_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale-2.2.0\",\n sha256 = \"d5a396343c7208121dc86e35623d3dfe19814a7613cfd14964994cdc9c9a2e26\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale/2.2.0/download\"],\n strip_prefix = \"icu_locale-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale_core-2.2.0\",\n sha256 = \"92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale_core/2.2.0/download\"],\n strip_prefix = \"icu_locale_core-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale_core-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale_data-2.2.0\",\n sha256 = \"d5fdcc9ac77c6d74ff5cf6e65ef3181d6af32003b16fce3a77fb451d2f695993\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale_data/2.2.0/download\"],\n strip_prefix = \"icu_locale_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer-2.2.0\",\n sha256 = \"c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer/2.2.0/download\"],\n strip_prefix = \"icu_normalizer-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer_data-2.2.0\",\n sha256 = \"da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer_data/2.2.0/download\"],\n strip_prefix = \"icu_normalizer_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_pattern-0.4.2\",\n sha256 = \"1c4c568054ffe735398a9f4c55aec37ad7c768844553cc0978f09cc9b933a1fb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_pattern/0.4.2/download\"],\n strip_prefix = \"icu_pattern-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.icu_pattern-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_plurals-2.2.0\",\n sha256 = \"2a50023f1d49ad5c4333380328a0d4a19e4b9d6d842ec06639affd5ba47c8103\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_plurals/2.2.0/download\"],\n strip_prefix = \"icu_plurals-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_plurals-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_plurals_data-2.2.0\",\n sha256 = \"8485497155dc865f901decb93ecc20d3e467df67bfeceb91e3ba34e2b11e8e1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_plurals_data/2.2.0/download\"],\n strip_prefix = \"icu_plurals_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_plurals_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties-2.2.0\",\n sha256 = \"bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties/2.2.0/download\"],\n strip_prefix = \"icu_properties-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties_data-2.2.0\",\n sha256 = \"8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties_data/2.2.0/download\"],\n strip_prefix = \"icu_properties_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_provider-2.2.0\",\n sha256 = \"139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_provider/2.2.0/download\"],\n strip_prefix = \"icu_provider-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_provider-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_time-2.2.0\",\n sha256 = \"ec3af0c141da0a61d4f6970cd1d5f4b388b17ea22f8124f8f6049d3d5147586a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_time/2.2.0/download\"],\n strip_prefix = \"icu_time-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_time-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_time_data-2.2.1\",\n sha256 = \"2e0ee79a0bb29772465234bfbad6ea04fbc5220bef9fa4f318cc53eb8897070e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_time_data/2.2.1/download\"],\n strip_prefix = \"icu_time_data-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_time_data-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icy_sixel-0.5.0\",\n sha256 = \"85518b9086bf01117761b90e7691c0ef3236fa8adfb1fb44dd248fe5f87215d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icy_sixel/0.5.0/download\"],\n strip_prefix = \"icy_sixel-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.icy_sixel-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ident_case-1.0.1\",\n sha256 = \"b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ident_case/1.0.1/download\"],\n strip_prefix = \"ident_case-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.ident_case-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna-1.1.0\",\n sha256 = \"3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna/1.1.0/download\"],\n strip_prefix = \"idna-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.idna-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna_adapter-1.2.2\",\n sha256 = \"cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna_adapter/1.2.2/download\"],\n strip_prefix = \"idna_adapter-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.idna_adapter-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ignore-0.4.33\",\n sha256 = \"00b69833ed729dc5aa7d19541d96d6cf8e9137194207a04916d658e43168402f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ignore/0.4.33/download\"],\n strip_prefix = \"ignore-0.4.33\",\n build_file = Label(\"@crates//crates:BUILD.ignore-0.4.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__image-0.25.10\",\n sha256 = \"85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/image/0.25.10/download\"],\n strip_prefix = \"image-0.25.10\",\n build_file = Label(\"@crates//crates:BUILD.image-0.25.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__image-webp-0.2.4\",\n sha256 = \"525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/image-webp/0.2.4/download\"],\n strip_prefix = \"image-webp-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.image-webp-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indenter-0.3.4\",\n sha256 = \"964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indenter/0.3.4/download\"],\n strip_prefix = \"indenter-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.indenter-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indexmap-2.14.0\",\n sha256 = \"d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indexmap/2.14.0/download\"],\n strip_prefix = \"indexmap-2.14.0\",\n build_file = Label(\"@crates//crates:BUILD.indexmap-2.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indicatif-0.18.6\",\n sha256 = \"9433806cd6b4ec1aba79c021c7e4c58fb4c3b9977c085062e611ac929998fb0c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indicatif/0.18.6/download\"],\n strip_prefix = \"indicatif-0.18.6\",\n build_file = Label(\"@crates//crates:BUILD.indicatif-0.18.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inferno-0.12.8\",\n sha256 = \"0c460d4fa06223667240720ab69a8045133755ae6dfbe100cf481b95e3a014f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inferno/0.12.8/download\"],\n strip_prefix = \"inferno-0.12.8\",\n build_file = Label(\"@crates//crates:BUILD.inferno-0.12.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inherent-1.0.14\",\n sha256 = \"bee2c455ca60511a054699102d40ce7153621cb2429558f9eaa600e4499b5984\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inherent/1.0.14/download\"],\n strip_prefix = \"inherent-1.0.14\",\n build_file = Label(\"@crates//crates:BUILD.inherent-1.0.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inotify-0.11.4\",\n sha256 = \"153be1941a183ec9ccd095ddbe17a8b8d435ef6c76e9e02451b933c3999af2c8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inotify/0.11.4/download\"],\n strip_prefix = \"inotify-0.11.4\",\n build_file = Label(\"@crates//crates:BUILD.inotify-0.11.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inotify-sys-0.1.8\",\n sha256 = \"c033f80b2c113cdf91ab7a33faa9cbc014726dcad99880c8609af2a370edf37d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inotify-sys/0.1.8/download\"],\n strip_prefix = \"inotify-sys-0.1.8\",\n build_file = Label(\"@crates//crates:BUILD.inotify-sys-0.1.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inout-0.1.4\",\n sha256 = \"879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inout/0.1.4/download\"],\n strip_prefix = \"inout-0.1.4\",\n build_file = Label(\"@crates//crates:BUILD.inout-0.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__insta-1.48.0\",\n sha256 = \"86f0f8fee8c926415c58d6ae43a08523a26faccb2323f5e6b644fe7dd4ef6b82\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/insta/1.48.0/download\"],\n strip_prefix = \"insta-1.48.0\",\n build_file = Label(\"@crates//crates:BUILD.insta-1.48.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__interceptor-0.17.2\",\n sha256 = \"88c11a956a48159f7fe539b8198f12b4db9b709ae5f94385b840db38f97fed74\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/interceptor/0.17.2/download\"],\n strip_prefix = \"interceptor-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.interceptor-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__intl-memoizer-0.5.3\",\n sha256 = \"310da2e345f5eb861e7a07ee182262e94975051db9e4223e909ba90f392f163f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/intl-memoizer/0.5.3/download\"],\n strip_prefix = \"intl-memoizer-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.intl-memoizer-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__intl_pluralrules-7.0.2\",\n sha256 = \"078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/intl_pluralrules/7.0.2/download\"],\n strip_prefix = \"intl_pluralrules-7.0.2\",\n build_file = Label(\"@crates//crates:BUILD.intl_pluralrules-7.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ipnet-2.12.1\",\n sha256 = \"6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ipnet/2.12.1/download\"],\n strip_prefix = \"ipnet-2.12.1\",\n build_file = Label(\"@crates//crates:BUILD.ipnet-2.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__is_terminal_polyfill-1.70.2\",\n sha256 = \"a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/is_terminal_polyfill/1.70.2/download\"],\n strip_prefix = \"is_terminal_polyfill-1.70.2\",\n build_file = Label(\"@crates//crates:BUILD.is_terminal_polyfill-1.70.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.13.0\",\n sha256 = \"413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.13.0/download\"],\n strip_prefix = \"itertools-0.13.0\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.14.0\",\n sha256 = \"2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.14.0/download\"],\n strip_prefix = \"itertools-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itoa-1.0.18\",\n sha256 = \"8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itoa/1.0.18/download\"],\n strip_prefix = \"itoa-1.0.18\",\n build_file = Label(\"@crates//crates:BUILD.itoa-1.0.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jaq-core-2.2.1\",\n sha256 = \"77526a72eb79412c29fd141767a6549bbfcb1cb40e00556fe16532d5e878e098\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jaq-core/2.2.1/download\"],\n strip_prefix = \"jaq-core-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.jaq-core-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jaq-json-1.1.3\",\n sha256 = \"01dbdbd07b076e8403abac68ce7744d93e2ecd953bbc44bf77bf00e1e81172bc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jaq-json/1.1.3/download\"],\n strip_prefix = \"jaq-json-1.1.3\",\n build_file = Label(\"@crates//crates:BUILD.jaq-json-1.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jaq-std-2.1.2\",\n sha256 = \"2c264fe397c981705976c71f1bfe020382b9eda52ae950e57fe885e147bdd67d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jaq-std/2.1.2/download\"],\n strip_prefix = \"jaq-std-2.1.2\",\n build_file = Label(\"@crates//crates:BUILD.jaq-std-2.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-0.2.35\",\n sha256 = \"668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff/0.2.35/download\"],\n strip_prefix = \"jiff-0.2.35\",\n build_file = Label(\"@crates//crates:BUILD.jiff-0.2.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-core-0.1.0\",\n sha256 = \"7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-core/0.1.0/download\"],\n strip_prefix = \"jiff-core-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.jiff-core-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-icu-0.2.2\",\n sha256 = \"0e67c2beaae8b10a82d849b9aabb698a43a682f32b17bcdc035d5ecadb44d646\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-icu/0.2.2/download\"],\n strip_prefix = \"jiff-icu-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.jiff-icu-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-static-0.2.35\",\n sha256 = \"3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-static/0.2.35/download\"],\n strip_prefix = \"jiff-static-0.2.35\",\n build_file = Label(\"@crates//crates:BUILD.jiff-static-0.2.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-tzdb-0.1.8\",\n sha256 = \"142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-tzdb/0.1.8/download\"],\n strip_prefix = \"jiff-tzdb-0.1.8\",\n build_file = Label(\"@crates//crates:BUILD.jiff-tzdb-0.1.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-tzdb-platform-0.1.3\",\n sha256 = \"875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-tzdb-platform/0.1.3/download\"],\n strip_prefix = \"jiff-tzdb-platform-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.jiff-tzdb-platform-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jobserver-0.1.35\",\n sha256 = \"1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jobserver/0.1.35/download\"],\n strip_prefix = \"jobserver-0.1.35\",\n build_file = Label(\"@crates//crates:BUILD.jobserver-0.1.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__js-sys-0.3.103\",\n sha256 = \"53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/js-sys/0.3.103/download\"],\n strip_prefix = \"js-sys-0.3.103\",\n build_file = Label(\"@crates//crates:BUILD.js-sys-0.3.103.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__keccak-0.1.6\",\n sha256 = \"cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/keccak/0.1.6/download\"],\n strip_prefix = \"keccak-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.keccak-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__khronos-egl-6.0.0\",\n sha256 = \"6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/khronos-egl/6.0.0/download\"],\n strip_prefix = \"khronos-egl-6.0.0\",\n build_file = Label(\"@crates//crates:BUILD.khronos-egl-6.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__khronos_api-3.1.0\",\n sha256 = \"e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/khronos_api/3.1.0/download\"],\n strip_prefix = \"khronos_api-3.1.0\",\n build_file = Label(\"@crates//crates:BUILD.khronos_api-3.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__kqueue-1.2.1\",\n sha256 = \"8d763e5b24120b4ddf50de6c92308156765aabfbbccebf401da7cff2d70a41ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/kqueue/1.2.1/download\"],\n strip_prefix = \"kqueue-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.kqueue-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__kqueue-sys-1.1.2\",\n sha256 = \"07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/kqueue-sys/1.1.2/download\"],\n strip_prefix = \"kqueue-sys-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.kqueue-sys-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lazy_static-1.5.0\",\n sha256 = \"bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lazy_static/1.5.0/download\"],\n strip_prefix = \"lazy_static-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.lazy_static-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libc-0.2.189\",\n sha256 = \"3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libc/0.2.189/download\"],\n strip_prefix = \"libc-0.2.189\",\n build_file = Label(\"@crates//crates:BUILD.libc-0.2.189.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libloading-0.8.9\",\n sha256 = \"d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libloading/0.8.9/download\"],\n strip_prefix = \"libloading-0.8.9\",\n build_file = Label(\"@crates//crates:BUILD.libloading-0.8.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libloading-0.9.0\",\n sha256 = \"754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libloading/0.9.0/download\"],\n strip_prefix = \"libloading-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.libloading-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libm-0.2.16\",\n sha256 = \"b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libm/0.2.16/download\"],\n strip_prefix = \"libm-0.2.16\",\n build_file = Label(\"@crates//crates:BUILD.libm-0.2.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libredox-0.1.19\",\n sha256 = \"2026a5056764a10b2bf5d56488cba40da507f5493a6a429340e2004d9ed085fa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libredox/0.1.19/download\"],\n strip_prefix = \"libredox-0.1.19\",\n build_file = Label(\"@crates//crates:BUILD.libredox-0.1.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libspa-0.9.2\",\n sha256 = \"b6b8cfa2a7656627b4c92c6b9ef929433acd673d5ab3708cda1b18478ac00df4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libspa/0.9.2/download\"],\n strip_prefix = \"libspa-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.libspa-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libspa-sys-0.9.2\",\n sha256 = \"901049455d2eb6decf9058235d745237952f4804bc584c5fcb41412e6adcc6e0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libspa-sys/0.9.2/download\"],\n strip_prefix = \"libspa-sys-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.libspa-sys-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libwayshot-xcap-0.3.3\",\n sha256 = \"ea8a46e4d016ef464e386e4970f5415fe0939c2d63abe0c2f539c05ef88c5fe5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libwayshot-xcap/0.3.3/download\"],\n strip_prefix = \"libwayshot-xcap-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.libwayshot-xcap-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linked-hash-map-0.5.6\",\n sha256 = \"0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linked-hash-map/0.5.6/download\"],\n strip_prefix = \"linked-hash-map-0.5.6\",\n build_file = Label(\"@crates//crates:BUILD.linked-hash-map-0.5.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.12.1\",\n sha256 = \"32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.12.1/download\"],\n strip_prefix = \"linux-raw-sys-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.4.15\",\n sha256 = \"d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.4.15/download\"],\n strip_prefix = \"linux-raw-sys-0.4.15\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.4.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.9.4\",\n sha256 = \"cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.9.4/download\"],\n strip_prefix = \"linux-raw-sys-0.9.4\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.9.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__litemap-0.8.2\",\n sha256 = \"92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/litemap/0.8.2/download\"],\n strip_prefix = \"litemap-0.8.2\",\n build_file = Label(\"@crates//crates:BUILD.litemap-0.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lock_api-0.4.14\",\n sha256 = \"224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lock_api/0.4.14/download\"],\n strip_prefix = \"lock_api-0.4.14\",\n build_file = Label(\"@crates//crates:BUILD.lock_api-0.4.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__log-0.4.33\",\n sha256 = \"0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/log/0.4.33/download\"],\n strip_prefix = \"log-0.4.33\",\n build_file = Label(\"@crates//crates:BUILD.log-0.4.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lru-0.18.2\",\n sha256 = \"5d2f2f9b4ba7e6b24d95e7e899329d35be83bcded72c8540cdd5368932d1d90a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lru/0.18.2/download\"],\n strip_prefix = \"lru-0.18.2\",\n build_file = Label(\"@crates//crates:BUILD.lru-0.18.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lscolors-0.21.0\",\n sha256 = \"d60e266dfb1426eb2d24792602e041131fdc0236bb7007abc0e589acafd60929\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lscolors/0.21.0/download\"],\n strip_prefix = \"lscolors-0.21.0\",\n build_file = Label(\"@crates//crates:BUILD.lscolors-0.21.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__markup5ever-0.39.0\",\n sha256 = \"7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/markup5ever/0.39.0/download\"],\n strip_prefix = \"markup5ever-0.39.0\",\n build_file = Label(\"@crates//crates:BUILD.markup5ever-0.39.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__md-5-0.10.6\",\n sha256 = \"d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/md-5/0.10.6/download\"],\n strip_prefix = \"md-5-0.10.6\",\n build_file = Label(\"@crates//crates:BUILD.md-5-0.10.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memchr-2.8.3\",\n sha256 = \"cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memchr/2.8.3/download\"],\n strip_prefix = \"memchr-2.8.3\",\n build_file = Label(\"@crates//crates:BUILD.memchr-2.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memmap2-0.9.11\",\n sha256 = \"d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memmap2/0.9.11/download\"],\n strip_prefix = \"memmap2-0.9.11\",\n build_file = Label(\"@crates//crates:BUILD.memmap2-0.9.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memoffset-0.7.1\",\n sha256 = \"5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memoffset/0.7.1/download\"],\n strip_prefix = \"memoffset-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.memoffset-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memoffset-0.9.1\",\n sha256 = \"488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memoffset/0.9.1/download\"],\n strip_prefix = \"memoffset-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.memoffset-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__minimal-lexical-0.2.1\",\n sha256 = \"68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/minimal-lexical/0.2.1/download\"],\n strip_prefix = \"minimal-lexical-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.minimal-lexical-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__miniz_oxide-0.8.9\",\n sha256 = \"1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/miniz_oxide/0.8.9/download\"],\n strip_prefix = \"miniz_oxide-0.8.9\",\n build_file = Label(\"@crates//crates:BUILD.miniz_oxide-0.8.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mio-1.2.2\",\n sha256 = \"30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mio/1.2.2/download\"],\n strip_prefix = \"mio-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.mio-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__moxcms-0.8.1\",\n sha256 = \"bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/moxcms/0.8.1/download\"],\n strip_prefix = \"moxcms-0.8.1\",\n build_file = Label(\"@crates//crates:BUILD.moxcms-0.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__munge-0.4.7\",\n sha256 = \"5e17401f259eba956ca16491461b6e8f72913a0a114e39736ce404410f915a0c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/munge/0.4.7/download\"],\n strip_prefix = \"munge-0.4.7\",\n build_file = Label(\"@crates//crates:BUILD.munge-0.4.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__munge_macro-0.4.7\",\n sha256 = \"4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/munge_macro/0.4.7/download\"],\n strip_prefix = \"munge_macro-0.4.7\",\n build_file = Label(\"@crates//crates:BUILD.munge_macro-0.4.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nanorand-0.7.0\",\n sha256 = \"6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nanorand/0.7.0/download\"],\n strip_prefix = \"nanorand-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.nanorand-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-3.12.0\",\n sha256 = \"6f71d6bc097c4a6eb853c3f24991ab8c9f50f57d1f719e305175541482217e36\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi/3.12.0/download\"],\n strip_prefix = \"napi-3.12.0\",\n build_file = Label(\"@crates//crates:BUILD.napi-3.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-build-2.4.0\",\n sha256 = \"5282704fbe8d49b0cf8b08e3f33233416a528658f205c7e5ace63b582de0b11c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi-build/2.4.0/download\"],\n strip_prefix = \"napi-build-2.4.0\",\n build_file = Label(\"@crates//crates:BUILD.napi-build-2.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-derive-3.6.2\",\n sha256 = \"6d9002b2940f0184444754546e0fcd15182f56948e6f381968b019d549387c42\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi-derive/3.6.2/download\"],\n strip_prefix = \"napi-derive-3.6.2\",\n build_file = Label(\"@crates//crates:BUILD.napi-derive-3.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-derive-backend-6.1.1\",\n sha256 = \"d60b5d773ad46c698c8cc2cd9fde0b283d39cbb7f71c04bee633c7bdba4423bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi-derive-backend/6.1.1/download\"],\n strip_prefix = \"napi-derive-backend-6.1.1\",\n build_file = Label(\"@crates//crates:BUILD.napi-derive-backend-6.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-sys-3.3.0\",\n sha256 = \"85fbf1fa9f1babfe396d74bbbf52b3643770243e8f5b0b46715d4caf7f0dfc9a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi-sys/3.3.0/download\"],\n strip_prefix = \"napi-sys-3.3.0\",\n build_file = Label(\"@crates//crates:BUILD.napi-sys-3.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__new_debug_unreachable-1.0.6\",\n sha256 = \"650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/new_debug_unreachable/1.0.6/download\"],\n strip_prefix = \"new_debug_unreachable-1.0.6\",\n build_file = Label(\"@crates//crates:BUILD.new_debug_unreachable-1.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.24.3\",\n sha256 = \"fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.24.3/download\"],\n strip_prefix = \"nix-0.24.3\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.24.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.26.4\",\n sha256 = \"598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.26.4/download\"],\n strip_prefix = \"nix-0.26.4\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.26.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.28.0\",\n sha256 = \"ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.28.0/download\"],\n strip_prefix = \"nix-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.30.1\",\n sha256 = \"74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.30.1/download\"],\n strip_prefix = \"nix-0.30.1\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.30.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.31.3\",\n sha256 = \"cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.31.3/download\"],\n strip_prefix = \"nix-0.31.3\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.31.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nohash-hasher-0.2.0\",\n sha256 = \"2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nohash-hasher/0.2.0/download\"],\n strip_prefix = \"nohash-hasher-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.nohash-hasher-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nom-7.1.3\",\n sha256 = \"d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nom/7.1.3/download\"],\n strip_prefix = \"nom-7.1.3\",\n build_file = Label(\"@crates//crates:BUILD.nom-7.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nom-8.0.0\",\n sha256 = \"df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nom/8.0.0/download\"],\n strip_prefix = \"nom-8.0.0\",\n build_file = Label(\"@crates//crates:BUILD.nom-8.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__normalize-path-0.2.1\",\n sha256 = \"f5438dd2b2ff4c6df6e1ce22d825ed2fa93ee2922235cc45186991717f0a892d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/normalize-path/0.2.1/download\"],\n strip_prefix = \"normalize-path-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.normalize-path-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__notify-8.2.0\",\n sha256 = \"4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/notify/8.2.0/download\"],\n strip_prefix = \"notify-8.2.0\",\n build_file = Label(\"@crates//crates:BUILD.notify-8.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__notify-types-2.1.0\",\n sha256 = \"42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/notify-types/2.1.0/download\"],\n strip_prefix = \"notify-types-2.1.0\",\n build_file = Label(\"@crates//crates:BUILD.notify-types-2.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nu-ansi-term-0.50.3\",\n sha256 = \"7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nu-ansi-term/0.50.3/download\"],\n strip_prefix = \"nu-ansi-term-0.50.3\",\n build_file = Label(\"@crates//crates:BUILD.nu-ansi-term-0.50.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-bigint-0.4.8\",\n sha256 = \"c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-bigint/0.4.8/download\"],\n strip_prefix = \"num-bigint-0.4.8\",\n build_file = Label(\"@crates//crates:BUILD.num-bigint-0.4.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-conv-0.2.2\",\n sha256 = \"521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-conv/0.2.2/download\"],\n strip_prefix = \"num-conv-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.num-conv-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-format-0.4.4\",\n sha256 = \"a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-format/0.4.4/download\"],\n strip_prefix = \"num-format-0.4.4\",\n build_file = Label(\"@crates//crates:BUILD.num-format-0.4.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-integer-0.1.46\",\n sha256 = \"7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-integer/0.1.46/download\"],\n strip_prefix = \"num-integer-0.1.46\",\n build_file = Label(\"@crates//crates:BUILD.num-integer-0.1.46.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-traits-0.2.19\",\n sha256 = \"071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-traits/0.2.19/download\"],\n strip_prefix = \"num-traits-0.2.19\",\n build_file = Label(\"@crates//crates:BUILD.num-traits-0.2.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-0.6.4\",\n sha256 = \"3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2/0.6.4/download\"],\n strip_prefix = \"objc2-0.6.4\",\n build_file = Label(\"@crates//crates:BUILD.objc2-0.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-app-kit-0.3.2\",\n sha256 = \"d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-app-kit/0.3.2/download\"],\n strip_prefix = \"objc2-app-kit-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-app-kit-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-application-services-0.3.2\",\n sha256 = \"69282c2b5bc58fba07cb9de2113619532eb551e98efe3d8d695509ef45fbd53b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-application-services/0.3.2/download\"],\n strip_prefix = \"objc2-application-services-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-application-services-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-av-foundation-0.3.2\",\n sha256 = \"478ae33fcac9df0a18db8302387c666b8ef08a3e2d62b510ca4fc278a384b6c0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-av-foundation/0.3.2/download\"],\n strip_prefix = \"objc2-av-foundation-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-av-foundation-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-avf-audio-0.3.2\",\n sha256 = \"13a380031deed8e99db00065c45937da434ca987c034e13b87e4441f9e4090be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-avf-audio/0.3.2/download\"],\n strip_prefix = \"objc2-avf-audio-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-avf-audio-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-cloud-kit-0.3.2\",\n sha256 = \"73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-cloud-kit/0.3.2/download\"],\n strip_prefix = \"objc2-cloud-kit-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-cloud-kit-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-audio-0.3.2\",\n sha256 = \"e1eebcea8b0dbff5f7c8504f3107c68fc061a3eb44932051c8cf8a68d969c3b2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-audio/0.3.2/download\"],\n strip_prefix = \"objc2-core-audio-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-audio-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-audio-types-0.3.2\",\n sha256 = \"5a89f2ec274a0cf4a32642b2991e8b351a404d290da87bb6a9a9d8632490bd1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-audio-types/0.3.2/download\"],\n strip_prefix = \"objc2-core-audio-types-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-audio-types-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-data-0.3.2\",\n sha256 = \"0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-data/0.3.2/download\"],\n strip_prefix = \"objc2-core-data-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-data-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-foundation-0.3.2\",\n sha256 = \"2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-foundation/0.3.2/download\"],\n strip_prefix = \"objc2-core-foundation-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-foundation-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-graphics-0.3.2\",\n sha256 = \"e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-graphics/0.3.2/download\"],\n strip_prefix = \"objc2-core-graphics-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-graphics-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-image-0.3.2\",\n sha256 = \"e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-image/0.3.2/download\"],\n strip_prefix = \"objc2-core-image-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-image-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-media-0.3.2\",\n sha256 = \"05ec576860167a15dd9fce7fbee7512beb4e31f532159d3482d1f9c6caedf31d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-media/0.3.2/download\"],\n strip_prefix = \"objc2-core-media-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-media-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-services-0.3.2\",\n sha256 = \"583300ad934cba24ff5292aee751ecc070f7ca6b39a574cc21b7b5e588e06a0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-services/0.3.2/download\"],\n strip_prefix = \"objc2-core-services-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-services-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-text-0.3.2\",\n sha256 = \"0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-text/0.3.2/download\"],\n strip_prefix = \"objc2-core-text-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-text-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-video-0.3.2\",\n sha256 = \"d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-video/0.3.2/download\"],\n strip_prefix = \"objc2-core-video-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-video-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-encode-4.1.0\",\n sha256 = \"ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-encode/4.1.0/download\"],\n strip_prefix = \"objc2-encode-4.1.0\",\n build_file = Label(\"@crates//crates:BUILD.objc2-encode-4.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-foundation-0.3.2\",\n sha256 = \"e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-foundation/0.3.2/download\"],\n strip_prefix = \"objc2-foundation-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-foundation-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-image-io-0.3.2\",\n sha256 = \"32b0446e98cf4a784cc7a0177715ff317eeaa8463841c616cfc78aa4f953c4ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-image-io/0.3.2/download\"],\n strip_prefix = \"objc2-image-io-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-image-io-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-io-surface-0.3.2\",\n sha256 = \"180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-io-surface/0.3.2/download\"],\n strip_prefix = \"objc2-io-surface-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-io-surface-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-media-toolbox-0.3.2\",\n sha256 = \"edd9fdde720df3da7046bb9097811000c1e7ab5cd579fa89d96b27d56781fb30\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-media-toolbox/0.3.2/download\"],\n strip_prefix = \"objc2-media-toolbox-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-media-toolbox-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-metal-0.3.2\",\n sha256 = \"a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-metal/0.3.2/download\"],\n strip_prefix = \"objc2-metal-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-metal-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-quartz-core-0.3.2\",\n sha256 = \"96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-quartz-core/0.3.2/download\"],\n strip_prefix = \"objc2-quartz-core-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-quartz-core-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-security-0.3.2\",\n sha256 = \"709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-security/0.3.2/download\"],\n strip_prefix = \"objc2-security-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-security-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-system-configuration-0.3.2\",\n sha256 = \"7216bd11cbda54ccabcab84d523dc93b858ec75ecfb3a7d89513fa22464da396\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-system-configuration/0.3.2/download\"],\n strip_prefix = \"objc2-system-configuration-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-system-configuration-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__oid-registry-0.7.1\",\n sha256 = \"a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/oid-registry/0.7.1/download\"],\n strip_prefix = \"oid-registry-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.oid-registry-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell-1.21.4\",\n sha256 = \"9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell/1.21.4/download\"],\n strip_prefix = \"once_cell-1.21.4\",\n build_file = Label(\"@crates//crates:BUILD.once_cell-1.21.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell_polyfill-1.70.2\",\n sha256 = \"384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell_polyfill/1.70.2/download\"],\n strip_prefix = \"once_cell_polyfill-1.70.2\",\n build_file = Label(\"@crates//crates:BUILD.once_cell_polyfill-1.70.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__onig-6.5.3\",\n sha256 = \"0cc3cbf698f9438986c11a880c90a6d04b9de27575afd28bbf45b154b6c709e2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/onig/6.5.3/download\"],\n strip_prefix = \"onig-6.5.3\",\n build_file = Label(\"@crates//crates:BUILD.onig-6.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__onig_sys-69.9.3\",\n sha256 = \"1e68317604e77e53b85896388e1a803c1d21b74c899ec9e5e1112db90735edd7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/onig_sys/69.9.3/download\"],\n strip_prefix = \"onig_sys-69.9.3\",\n build_file = Label(\"@crates//crates:BUILD.onig_sys-69.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__opaque-debug-0.3.1\",\n sha256 = \"c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/opaque-debug/0.3.1/download\"],\n strip_prefix = \"opaque-debug-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.opaque-debug-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__opus-0.3.1\",\n sha256 = \"4d3809943dff6fbad5f0484449ea26bdb9cb7d8efdf26ed50d3c7f227f69eb5c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/opus/0.3.1/download\"],\n strip_prefix = \"opus-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.opus-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ordered-float-5.3.0\",\n sha256 = \"b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ordered-float/5.3.0/download\"],\n strip_prefix = \"ordered-float-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.ordered-float-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ordered-stream-0.2.0\",\n sha256 = \"9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ordered-stream/0.2.0/download\"],\n strip_prefix = \"ordered-stream-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.ordered-stream-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__os_display-0.1.4\",\n sha256 = \"ad5fd71b79026fb918650dde6d125000a233764f1c2f1659a1c71118e33ea08f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/os_display/0.1.4/download\"],\n strip_prefix = \"os_display-0.1.4\",\n build_file = Label(\"@crates//crates:BUILD.os_display-0.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__os_pipe-1.2.3\",\n sha256 = \"7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/os_pipe/1.2.3/download\"],\n strip_prefix = \"os_pipe-1.2.3\",\n build_file = Label(\"@crates//crates:BUILD.os_pipe-1.2.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__outref-0.5.2\",\n sha256 = \"1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/outref/0.5.2/download\"],\n strip_prefix = \"outref-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.outref-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__p256-0.13.2\",\n sha256 = \"c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/p256/0.13.2/download\"],\n strip_prefix = \"p256-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.p256-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__p384-0.13.1\",\n sha256 = \"fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/p384/0.13.1/download\"],\n strip_prefix = \"p384-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.p384-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__palette-0.7.7\",\n sha256 = \"ddeed8580d347d2abf3dcf06a5f0b3dc020258338526b277847cd4248a70fc64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/palette/0.7.7/download\"],\n strip_prefix = \"palette-0.7.7\",\n build_file = Label(\"@crates//crates:BUILD.palette-0.7.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__palette_derive-0.7.7\",\n sha256 = \"88537020289b719d81be994ccf1bbf4990f477e2f69ee52fe3e45f43a02e56be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/palette_derive/0.7.7/download\"],\n strip_prefix = \"palette_derive-0.7.7\",\n build_file = Label(\"@crates//crates:BUILD.palette_derive-0.7.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__palette_math-0.7.7\",\n sha256 = \"6e6eb142958d64335fb0e345c5b9ead2ecd6fc438c307e9d7d3c4fd428dbaf12\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/palette_math/0.7.7/download\"],\n strip_prefix = \"palette_math-0.7.7\",\n build_file = Label(\"@crates//crates:BUILD.palette_math-0.7.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking-2.2.1\",\n sha256 = \"f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking/2.2.1/download\"],\n strip_prefix = \"parking-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.parking-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot-0.12.5\",\n sha256 = \"93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot/0.12.5/download\"],\n strip_prefix = \"parking_lot-0.12.5\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot-0.12.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot_core-0.9.12\",\n sha256 = \"2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot_core/0.9.12/download\"],\n strip_prefix = \"parking_lot_core-0.9.12\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot_core-0.9.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parse_datetime-0.14.0\",\n sha256 = \"413775a7eac2261d2211a79d10ef275e5b6f7b527eec42ad09adce2ffa92b6e5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parse_datetime/0.14.0/download\"],\n strip_prefix = \"parse_datetime-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.parse_datetime-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pcre2-0.2.11\",\n sha256 = \"9e970b0fcce0c7ee6ef662744ff711f21ccd6f11b7cf03cd187a80e89797fc67\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pcre2/0.2.11/download\"],\n strip_prefix = \"pcre2-0.2.11\",\n build_file = Label(\"@crates//crates:BUILD.pcre2-0.2.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pcre2-sys-0.2.10\",\n sha256 = \"18b9073c1a2549bd409bf4a32c94d903bb1a09bf845bc306ae148897fa0760a4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pcre2-sys/0.2.10/download\"],\n strip_prefix = \"pcre2-sys-0.2.10\",\n build_file = Label(\"@crates//crates:BUILD.pcre2-sys-0.2.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__peg-0.8.6\",\n sha256 = \"0aad070be5b63aa72103f2fcdd70a83adbd5e90112ce5b574171ff1c65501773\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/peg/0.8.6/download\"],\n strip_prefix = \"peg-0.8.6\",\n build_file = Label(\"@crates//crates:BUILD.peg-0.8.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__peg-macros-0.8.6\",\n sha256 = \"ddd8ef6825cae95355031ae26a99b616a2a21f22ba2de0197c43dfb05acbe7ee\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/peg-macros/0.8.6/download\"],\n strip_prefix = \"peg-macros-0.8.6\",\n build_file = Label(\"@crates//crates:BUILD.peg-macros-0.8.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__peg-runtime-0.8.6\",\n sha256 = \"7011d97b484a5ebdc4b1fdb3b12d5e4bbbea56e9d22b688f2e79e04b65a7d8a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/peg-runtime/0.8.6/download\"],\n strip_prefix = \"peg-runtime-0.8.6\",\n build_file = Label(\"@crates//crates:BUILD.peg-runtime-0.8.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pem-3.0.6\",\n sha256 = \"1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pem/3.0.6/download\"],\n strip_prefix = \"pem-3.0.6\",\n build_file = Label(\"@crates//crates:BUILD.pem-3.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pem-rfc7468-0.7.0\",\n sha256 = \"88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pem-rfc7468/0.7.0/download\"],\n strip_prefix = \"pem-rfc7468-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.pem-rfc7468-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__percent-encoding-2.3.2\",\n sha256 = \"9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/percent-encoding/2.3.2/download\"],\n strip_prefix = \"percent-encoding-2.3.2\",\n build_file = Label(\"@crates//crates:BUILD.percent-encoding-2.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pest-2.8.8\",\n sha256 = \"7df728be843c7070fab6ab7c328c4e9e9d78e23bf749c0669c86ee7ebfa050a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pest/2.8.8/download\"],\n strip_prefix = \"pest-2.8.8\",\n build_file = Label(\"@crates//crates:BUILD.pest-2.8.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pest_derive-2.8.8\",\n sha256 = \"9e2dd6fc3b26b3462ee188aac870f5a41d398f1cd5e2408d16531bd71c9591fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pest_derive/2.8.8/download\"],\n strip_prefix = \"pest_derive-2.8.8\",\n build_file = Label(\"@crates//crates:BUILD.pest_derive-2.8.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pest_generator-2.8.8\",\n sha256 = \"6a7a9205cfb6f596a9e8b689c0a15f9ceb7a1aafae7aaf788150ac65b29975b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pest_generator/2.8.8/download\"],\n strip_prefix = \"pest_generator-2.8.8\",\n build_file = Label(\"@crates//crates:BUILD.pest_generator-2.8.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pest_meta-2.8.8\",\n sha256 = \"85abd351c0de1e8384fc791a0737111a350394937e92b956b743dac12429f57c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pest_meta/2.8.8/download\"],\n strip_prefix = \"pest_meta-2.8.8\",\n build_file = Label(\"@crates//crates:BUILD.pest_meta-2.8.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__petgraph-0.8.3\",\n sha256 = \"8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/petgraph/0.8.3/download\"],\n strip_prefix = \"petgraph-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.petgraph-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf-0.11.3\",\n sha256 = \"1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf/0.11.3/download\"],\n strip_prefix = \"phf-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.phf-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf-0.13.1\",\n sha256 = \"c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf/0.13.1/download\"],\n strip_prefix = \"phf-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf-0.14.0\",\n sha256 = \"010378780309880b08997fae13be7834dba947d36393bd372f2b1556deb2a2f6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf/0.14.0/download\"],\n strip_prefix = \"phf-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.phf-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_codegen-0.11.3\",\n sha256 = \"aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_codegen/0.11.3/download\"],\n strip_prefix = \"phf_codegen-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.phf_codegen-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_codegen-0.13.1\",\n sha256 = \"49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_codegen/0.13.1/download\"],\n strip_prefix = \"phf_codegen-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_codegen-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_generator-0.11.3\",\n sha256 = \"3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_generator/0.11.3/download\"],\n strip_prefix = \"phf_generator-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.phf_generator-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_generator-0.13.1\",\n sha256 = \"135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_generator/0.13.1/download\"],\n strip_prefix = \"phf_generator-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_generator-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_generator-0.14.0\",\n sha256 = \"aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_generator/0.14.0/download\"],\n strip_prefix = \"phf_generator-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.phf_generator-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_macros-0.13.1\",\n sha256 = \"812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_macros/0.13.1/download\"],\n strip_prefix = \"phf_macros-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_macros-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_macros-0.14.0\",\n sha256 = \"5fa8d0ca26d424d27630da600c6624696e7dec8bf7b3b492b383c5dc49e5e085\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_macros/0.14.0/download\"],\n strip_prefix = \"phf_macros-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.phf_macros-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_shared-0.11.3\",\n sha256 = \"67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_shared/0.11.3/download\"],\n strip_prefix = \"phf_shared-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.phf_shared-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_shared-0.13.1\",\n sha256 = \"e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_shared/0.13.1/download\"],\n strip_prefix = \"phf_shared-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_shared-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_shared-0.14.0\",\n sha256 = \"c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_shared/0.14.0/download\"],\n strip_prefix = \"phf_shared-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.phf_shared-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-project-lite-0.2.17\",\n sha256 = \"a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-project-lite/0.2.17/download\"],\n strip_prefix = \"pin-project-lite-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.pin-project-lite-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-utils-0.1.0\",\n sha256 = \"8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-utils/0.1.0/download\"],\n strip_prefix = \"pin-utils-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.pin-utils-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__piper-0.2.5\",\n sha256 = \"c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/piper/0.2.5/download\"],\n strip_prefix = \"piper-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.piper-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pipewire-0.9.2\",\n sha256 = \"9688b89abf11d756499f7c6190711d6dbe5a3acdb30c8fbf001d6596d06a8d44\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pipewire/0.9.2/download\"],\n strip_prefix = \"pipewire-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.pipewire-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pipewire-sys-0.9.2\",\n sha256 = \"cb028afee0d6ca17020b090e3b8fa2d7de23305aef975c7e5192a5050246ea36\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pipewire-sys/0.9.2/download\"],\n strip_prefix = \"pipewire-sys-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.pipewire-sys-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pkcs8-0.10.2\",\n sha256 = \"f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pkcs8/0.10.2/download\"],\n strip_prefix = \"pkcs8-0.10.2\",\n build_file = Label(\"@crates//crates:BUILD.pkcs8-0.10.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pkg-config-0.3.33\",\n sha256 = \"19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pkg-config/0.3.33/download\"],\n strip_prefix = \"pkg-config-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.pkg-config-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__platform-info-2.1.0\",\n sha256 = \"9368d62437c8cbb7c31ee37fd8c08a7d390e09a3ff75698a674953f46705ffcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/platform-info/2.1.0/download\"],\n strip_prefix = \"platform-info-2.1.0\",\n build_file = Label(\"@crates//crates:BUILD.platform-info-2.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__png-0.18.1\",\n sha256 = \"60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/png/0.18.1/download\"],\n strip_prefix = \"png-0.18.1\",\n build_file = Label(\"@crates//crates:BUILD.png-0.18.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__polling-3.11.0\",\n sha256 = \"5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/polling/3.11.0/download\"],\n strip_prefix = \"polling-3.11.0\",\n build_file = Label(\"@crates//crates:BUILD.polling-3.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__poly1305-0.8.0\",\n sha256 = \"8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/poly1305/0.8.0/download\"],\n strip_prefix = \"poly1305-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.poly1305-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__polyval-0.6.2\",\n sha256 = \"9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/polyval/0.6.2/download\"],\n strip_prefix = \"polyval-0.6.2\",\n build_file = Label(\"@crates//crates:BUILD.polyval-0.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__portable-atomic-1.14.0\",\n sha256 = \"3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/portable-atomic/1.14.0/download\"],\n strip_prefix = \"portable-atomic-1.14.0\",\n build_file = Label(\"@crates//crates:BUILD.portable-atomic-1.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__portable-atomic-util-0.2.7\",\n sha256 = \"c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/portable-atomic-util/0.2.7/download\"],\n strip_prefix = \"portable-atomic-util-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.portable-atomic-util-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__portable-pty-0.9.0\",\n sha256 = \"b4a596a2b3d2752d94f51fac2d4a96737b8705dddd311a32b9af47211f08671e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/portable-pty/0.9.0/download\"],\n strip_prefix = \"portable-pty-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.portable-pty-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__potential_utf-0.1.5\",\n sha256 = \"0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/potential_utf/0.1.5/download\"],\n strip_prefix = \"potential_utf-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.potential_utf-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__powerfmt-0.2.0\",\n sha256 = \"439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/powerfmt/0.2.0/download\"],\n strip_prefix = \"powerfmt-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.powerfmt-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ppv-lite86-0.2.21\",\n sha256 = \"85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ppv-lite86/0.2.21/download\"],\n strip_prefix = \"ppv-lite86-0.2.21\",\n build_file = Label(\"@crates//crates:BUILD.ppv-lite86-0.2.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__precomputed-hash-0.1.1\",\n sha256 = \"925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/precomputed-hash/0.1.1/download\"],\n strip_prefix = \"precomputed-hash-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.precomputed-hash-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pretty_assertions-1.4.1\",\n sha256 = \"3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pretty_assertions/1.4.1/download\"],\n strip_prefix = \"pretty_assertions-1.4.1\",\n build_file = Label(\"@crates//crates:BUILD.pretty_assertions-1.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prettyplease-0.2.37\",\n sha256 = \"479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prettyplease/0.2.37/download\"],\n strip_prefix = \"prettyplease-0.2.37\",\n build_file = Label(\"@crates//crates:BUILD.prettyplease-0.2.37.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__primeorder-0.13.6\",\n sha256 = \"353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/primeorder/0.13.6/download\"],\n strip_prefix = \"primeorder-0.13.6\",\n build_file = Label(\"@crates//crates:BUILD.primeorder-0.13.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro-crate-3.5.0\",\n sha256 = \"e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro-crate/3.5.0/download\"],\n strip_prefix = \"proc-macro-crate-3.5.0\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro-crate-3.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro2-1.0.107\",\n sha256 = \"985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro2/1.0.107/download\"],\n strip_prefix = \"proc-macro2-1.0.107\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro2-1.0.107.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__procfs-0.18.0\",\n sha256 = \"25485360a54d6861439d60facef26de713b1e126bf015ec8f98239467a2b82f7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/procfs/0.18.0/download\"],\n strip_prefix = \"procfs-0.18.0\",\n build_file = Label(\"@crates//crates:BUILD.procfs-0.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__procfs-core-0.18.0\",\n sha256 = \"e6401bf7b6af22f78b563665d15a22e9aef27775b79b149a66ca022468a4e405\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/procfs-core/0.18.0/download\"],\n strip_prefix = \"procfs-core-0.18.0\",\n build_file = Label(\"@crates//crates:BUILD.procfs-core-0.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ptr_meta-0.3.2\",\n sha256 = \"743da816b98c921cdbe8628ef7381b76f25ecf4da599fc80aca90eae7ef70cc0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ptr_meta/0.3.2/download\"],\n strip_prefix = \"ptr_meta-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.ptr_meta-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ptr_meta_derive-0.3.2\",\n sha256 = \"1c8d9ca532f185d5d4db7a7c9d51420b452168ea1c2b913953281bd6fe1fcbd0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ptr_meta_derive/0.3.2/download\"],\n strip_prefix = \"ptr_meta_derive-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.ptr_meta_derive-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pxfm-0.1.30\",\n sha256 = \"d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pxfm/0.1.30/download\"],\n strip_prefix = \"pxfm-0.1.30\",\n build_file = Label(\"@crates//crates:BUILD.pxfm-0.1.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quantette-0.5.1\",\n sha256 = \"c98fecda8b16396ff9adac67644a523dd1778c42b58606a29df5c31ca925d174\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quantette/0.5.1/download\"],\n strip_prefix = \"quantette-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.quantette-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quick-error-2.0.1\",\n sha256 = \"a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quick-error/2.0.1/download\"],\n strip_prefix = \"quick-error-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.quick-error-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quick-xml-0.30.0\",\n sha256 = \"eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quick-xml/0.30.0/download\"],\n strip_prefix = \"quick-xml-0.30.0\",\n build_file = Label(\"@crates//crates:BUILD.quick-xml-0.30.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quick-xml-0.41.0\",\n sha256 = \"e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quick-xml/0.41.0/download\"],\n strip_prefix = \"quick-xml-0.41.0\",\n build_file = Label(\"@crates//crates:BUILD.quick-xml-0.41.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quote-1.0.47\",\n sha256 = \"1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quote/1.0.47/download\"],\n strip_prefix = \"quote-1.0.47\",\n build_file = Label(\"@crates//crates:BUILD.quote-1.0.47.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-5.3.0\",\n sha256 = \"69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/5.3.0/download\"],\n strip_prefix = \"r-efi-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-6.0.0\",\n sha256 = \"f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/6.0.0/download\"],\n strip_prefix = \"r-efi-6.0.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-6.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__radium-0.7.0\",\n sha256 = \"dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/radium/0.7.0/download\"],\n strip_prefix = \"radium-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.radium-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rancor-0.1.3\",\n sha256 = \"9b534442d0fcdb55d66f373d9cac6d33b6293a2335bc2136dbd06ce0e87d2572\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rancor/0.1.3/download\"],\n strip_prefix = \"rancor-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.rancor-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand-0.10.2\",\n sha256 = \"c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand/0.10.2/download\"],\n strip_prefix = \"rand-0.10.2\",\n build_file = Label(\"@crates//crates:BUILD.rand-0.10.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand-0.8.7\",\n sha256 = \"22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand/0.8.7/download\"],\n strip_prefix = \"rand-0.8.7\",\n build_file = Label(\"@crates//crates:BUILD.rand-0.8.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand-0.9.5\",\n sha256 = \"b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand/0.9.5/download\"],\n strip_prefix = \"rand-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.rand-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_chacha-0.9.0\",\n sha256 = \"d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_chacha/0.9.0/download\"],\n strip_prefix = \"rand_chacha-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.rand_chacha-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_core-0.10.1\",\n sha256 = \"63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_core/0.10.1/download\"],\n strip_prefix = \"rand_core-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.rand_core-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_core-0.6.4\",\n sha256 = \"ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_core/0.6.4/download\"],\n strip_prefix = \"rand_core-0.6.4\",\n build_file = Label(\"@crates//crates:BUILD.rand_core-0.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_core-0.9.5\",\n sha256 = \"76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_core/0.9.5/download\"],\n strip_prefix = \"rand_core-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.rand_core-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_xoshiro-0.7.0\",\n sha256 = \"f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_xoshiro/0.7.0/download\"],\n strip_prefix = \"rand_xoshiro-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.rand_xoshiro-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rayon-1.12.0\",\n sha256 = \"fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rayon/1.12.0/download\"],\n strip_prefix = \"rayon-1.12.0\",\n build_file = Label(\"@crates//crates:BUILD.rayon-1.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rayon-core-1.13.0\",\n sha256 = \"22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rayon-core/1.13.0/download\"],\n strip_prefix = \"rayon-core-1.13.0\",\n build_file = Label(\"@crates//crates:BUILD.rayon-core-1.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rcgen-0.13.2\",\n sha256 = \"75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rcgen/0.13.2/download\"],\n strip_prefix = \"rcgen-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.rcgen-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__redox_syscall-0.5.18\",\n sha256 = \"ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/redox_syscall/0.5.18/download\"],\n strip_prefix = \"redox_syscall-0.5.18\",\n build_file = Label(\"@crates//crates:BUILD.redox_syscall-0.5.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ref-cast-1.0.26\",\n sha256 = \"216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ref-cast/1.0.26/download\"],\n strip_prefix = \"ref-cast-1.0.26\",\n build_file = Label(\"@crates//crates:BUILD.ref-cast-1.0.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ref-cast-impl-1.0.26\",\n sha256 = \"2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ref-cast-impl/1.0.26/download\"],\n strip_prefix = \"ref-cast-impl-1.0.26\",\n build_file = Label(\"@crates//crates:BUILD.ref-cast-impl-1.0.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-1.13.1\",\n sha256 = \"f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex/1.13.1/download\"],\n strip_prefix = \"regex-1.13.1\",\n build_file = Label(\"@crates//crates:BUILD.regex-1.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-automata-0.4.18\",\n sha256 = \"ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-automata/0.4.18/download\"],\n strip_prefix = \"regex-automata-0.4.18\",\n build_file = Label(\"@crates//crates:BUILD.regex-automata-0.4.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-lite-0.1.9\",\n sha256 = \"cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-lite/0.1.9/download\"],\n strip_prefix = \"regex-lite-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.regex-lite-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-syntax-0.8.11\",\n sha256 = \"d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-syntax/0.8.11/download\"],\n strip_prefix = \"regex-syntax-0.8.11\",\n build_file = Label(\"@crates//crates:BUILD.regex-syntax-0.8.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__reis-0.5.0\",\n sha256 = \"00939c5c526a1b4054ef8d9d96b3f92227f08ca355965e986741b556eda6d289\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/reis/0.5.0/download\"],\n strip_prefix = \"reis-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.reis-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rend-0.5.4\",\n sha256 = \"663ba70707f96e871406fe10d68128412e619b06d1d47cb91c3a4c6501176240\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rend/0.5.4/download\"],\n strip_prefix = \"rend-0.5.4\",\n build_file = Label(\"@crates//crates:BUILD.rend-0.5.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rfc6979-0.4.0\",\n sha256 = \"f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rfc6979/0.4.0/download\"],\n strip_prefix = \"rfc6979-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.rfc6979-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rgb-0.8.53\",\n sha256 = \"47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rgb/0.8.53/download\"],\n strip_prefix = \"rgb-0.8.53\",\n build_file = Label(\"@crates//crates:BUILD.rgb-0.8.53.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ring-0.17.14\",\n sha256 = \"a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ring/0.17.14/download\"],\n strip_prefix = \"ring-0.17.14\",\n build_file = Label(\"@crates//crates:BUILD.ring-0.17.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rkyv-0.8.18\",\n sha256 = \"d9776093b7ca170454ab1406954f7b7d97a57c51dc6c0642957fb2ef25c2d399\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rkyv/0.8.18/download\"],\n strip_prefix = \"rkyv-0.8.18\",\n build_file = Label(\"@crates//crates:BUILD.rkyv-0.8.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rkyv_derive-0.8.18\",\n sha256 = \"1c25ef604ac7dd839d44d64648952ea23c97866f124ff671b0ed2cf3ad9bb06e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rkyv_derive/0.8.18/download\"],\n strip_prefix = \"rkyv_derive-0.8.18\",\n build_file = Label(\"@crates//crates:BUILD.rkyv_derive-0.8.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rlimit-0.11.0\",\n sha256 = \"f35ee2729c56bb610f6dba436bf78135f728b7373bdffae2ec815b2d3eb98cc3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rlimit/0.11.0/download\"],\n strip_prefix = \"rlimit-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.rlimit-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rpds-1.2.1\",\n sha256 = \"e025feb26210bc196b908e72deb063b1b4000754304341cbc168a1e72c857ebc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rpds/1.2.1/download\"],\n strip_prefix = \"rpds-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.rpds-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rtcp-0.17.2\",\n sha256 = \"adad7f6a501162881032fc84b4bc78ae11f1b30748180b9f5cbe8810bf613aab\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rtcp/0.17.2/download\"],\n strip_prefix = \"rtcp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.rtcp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rtp-0.17.2\",\n sha256 = \"149329e78ada26b5e174a4c281a7a7e5c8bda6008adc90daddd6f98fce56db29\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rtp/0.17.2/download\"],\n strip_prefix = \"rtp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.rtp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc-hash-1.1.0\",\n sha256 = \"08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc-hash/1.1.0/download\"],\n strip_prefix = \"rustc-hash-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.rustc-hash-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc-hash-2.1.3\",\n sha256 = \"6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc-hash/2.1.3/download\"],\n strip_prefix = \"rustc-hash-2.1.3\",\n build_file = Label(\"@crates//crates:BUILD.rustc-hash-2.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc_version-0.4.1\",\n sha256 = \"cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc_version/0.4.1/download\"],\n strip_prefix = \"rustc_version-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.rustc_version-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rusticata-macros-4.1.0\",\n sha256 = \"faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rusticata-macros/4.1.0/download\"],\n strip_prefix = \"rusticata-macros-4.1.0\",\n build_file = Label(\"@crates//crates:BUILD.rusticata-macros-4.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustix-0.38.44\",\n sha256 = \"fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustix/0.38.44/download\"],\n strip_prefix = \"rustix-0.38.44\",\n build_file = Label(\"@crates//crates:BUILD.rustix-0.38.44.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustix-1.1.4\",\n sha256 = \"b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustix/1.1.4/download\"],\n strip_prefix = \"rustix-1.1.4\",\n build_file = Label(\"@crates//crates:BUILD.rustix-1.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-0.23.43\",\n sha256 = \"0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls/0.23.43/download\"],\n strip_prefix = \"rustls-0.23.43\",\n build_file = Label(\"@crates//crates:BUILD.rustls-0.23.43.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-pki-types-1.15.1\",\n sha256 = \"2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-pki-types/1.15.1/download\"],\n strip_prefix = \"rustls-pki-types-1.15.1\",\n build_file = Label(\"@crates//crates:BUILD.rustls-pki-types-1.15.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-webpki-0.103.13\",\n sha256 = \"61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-webpki/0.103.13/download\"],\n strip_prefix = \"rustls-webpki-0.103.13\",\n build_file = Label(\"@crates//crates:BUILD.rustls-webpki-0.103.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustversion-1.0.23\",\n sha256 = \"cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustversion/1.0.23/download\"],\n strip_prefix = \"rustversion-1.0.23\",\n build_file = Label(\"@crates//crates:BUILD.rustversion-1.0.23.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__safe_arch-0.9.3\",\n sha256 = \"629516c85c29fe757770fa03f2074cf1eac43d44c02a3de9fc2ef7b0e207dfdd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/safe_arch/0.9.3/download\"],\n strip_prefix = \"safe_arch-0.9.3\",\n build_file = Label(\"@crates//crates:BUILD.safe_arch-0.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__same-file-1.0.6\",\n sha256 = \"93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/same-file/1.0.6/download\"],\n strip_prefix = \"same-file-1.0.6\",\n build_file = Label(\"@crates//crates:BUILD.same-file-1.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__scoped-tls-1.0.1\",\n sha256 = \"e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/scoped-tls/1.0.1/download\"],\n strip_prefix = \"scoped-tls-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.scoped-tls-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__scopeguard-1.2.0\",\n sha256 = \"94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/scopeguard/1.2.0/download\"],\n strip_prefix = \"scopeguard-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.scopeguard-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sdp-0.17.2\",\n sha256 = \"66b6eecfa5151edef84d544ff3885dff98e5b5fe97586757a4b5118bde51c958\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sdp/0.17.2/download\"],\n strip_prefix = \"sdp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.sdp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sec1-0.7.3\",\n sha256 = \"d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sec1/0.7.3/download\"],\n strip_prefix = \"sec1-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.sec1-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__self_cell-1.3.0\",\n sha256 = \"2ab42ca02749e120097e328d91d415325bdf43b1c72c4c8badf37375fe40a813\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/self_cell/1.3.0/download\"],\n strip_prefix = \"self_cell-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.self_cell-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__semver-1.0.28\",\n sha256 = \"8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/semver/1.0.28/download\"],\n strip_prefix = \"semver-1.0.28\",\n build_file = Label(\"@crates//crates:BUILD.semver-1.0.28.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde-1.0.229\",\n sha256 = \"4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde/1.0.229/download\"],\n strip_prefix = \"serde-1.0.229\",\n build_file = Label(\"@crates//crates:BUILD.serde-1.0.229.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_core-1.0.229\",\n sha256 = \"67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_core/1.0.229/download\"],\n strip_prefix = \"serde_core-1.0.229\",\n build_file = Label(\"@crates//crates:BUILD.serde_core-1.0.229.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive-1.0.229\",\n sha256 = \"e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive/1.0.229/download\"],\n strip_prefix = \"serde_derive-1.0.229\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive-1.0.229.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_json-1.0.151\",\n sha256 = \"c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_json/1.0.151/download\"],\n strip_prefix = \"serde_json-1.0.151\",\n build_file = Label(\"@crates//crates:BUILD.serde_json-1.0.151.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_repr-0.1.21\",\n sha256 = \"8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_repr/0.1.21/download\"],\n strip_prefix = \"serde_repr-0.1.21\",\n build_file = Label(\"@crates//crates:BUILD.serde_repr-0.1.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_spanned-1.1.1\",\n sha256 = \"6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_spanned/1.1.1/download\"],\n strip_prefix = \"serde_spanned-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.serde_spanned-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serial2-0.2.38\",\n sha256 = \"b16809bc35793b19ce4e0c53924bc0dce3937f15487997cfdaed936004180730\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serial2/0.2.38/download\"],\n strip_prefix = \"serial2-0.2.38\",\n build_file = Label(\"@crates//crates:BUILD.serial2-0.2.38.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha1-0.10.7\",\n sha256 = \"a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha1/0.10.7/download\"],\n strip_prefix = \"sha1-0.10.7\",\n build_file = Label(\"@crates//crates:BUILD.sha1-0.10.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha2-0.10.9\",\n sha256 = \"a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha2/0.10.9/download\"],\n strip_prefix = \"sha2-0.10.9\",\n build_file = Label(\"@crates//crates:BUILD.sha2-0.10.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha3-0.10.9\",\n sha256 = \"77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha3/0.10.9/download\"],\n strip_prefix = \"sha3-0.10.9\",\n build_file = Label(\"@crates//crates:BUILD.sha3-0.10.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shared_library-0.1.9\",\n sha256 = \"5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shared_library/0.1.9/download\"],\n strip_prefix = \"shared_library-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.shared_library-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shell-words-1.1.1\",\n sha256 = \"dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shell-words/1.1.1/download\"],\n strip_prefix = \"shell-words-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.shell-words-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shlex-1.3.0\",\n sha256 = \"0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shlex/1.3.0/download\"],\n strip_prefix = \"shlex-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.shlex-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shlex-2.0.1\",\n sha256 = \"f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shlex/2.0.1/download\"],\n strip_prefix = \"shlex-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.shlex-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__signal-hook-registry-1.4.8\",\n sha256 = \"c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/signal-hook-registry/1.4.8/download\"],\n strip_prefix = \"signal-hook-registry-1.4.8\",\n build_file = Label(\"@crates//crates:BUILD.signal-hook-registry-1.4.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__signature-2.2.0\",\n sha256 = \"77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/signature/2.2.0/download\"],\n strip_prefix = \"signature-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.signature-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simd-adler32-0.3.10\",\n sha256 = \"3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simd-adler32/0.3.10/download\"],\n strip_prefix = \"simd-adler32-0.3.10\",\n build_file = Label(\"@crates//crates:BUILD.simd-adler32-0.3.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simdutf8-0.1.5\",\n sha256 = \"e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simdutf8/0.1.5/download\"],\n strip_prefix = \"simdutf8-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.simdutf8-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__similar-2.7.0\",\n sha256 = \"bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/similar/2.7.0/download\"],\n strip_prefix = \"similar-2.7.0\",\n build_file = Label(\"@crates//crates:BUILD.similar-2.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__similar-3.1.2\",\n sha256 = \"85ee016af5d736b69fc89e19254540fa4b5f5492853fb5503920f084011c78b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/similar/3.1.2/download\"],\n strip_prefix = \"similar-3.1.2\",\n build_file = Label(\"@crates//crates:BUILD.similar-3.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__siphasher-1.0.3\",\n sha256 = \"8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/siphasher/1.0.3/download\"],\n strip_prefix = \"siphasher-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.siphasher-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__slab-0.4.12\",\n sha256 = \"0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/slab/0.4.12/download\"],\n strip_prefix = \"slab-0.4.12\",\n build_file = Label(\"@crates//crates:BUILD.slab-0.4.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sm3-0.5.0\",\n sha256 = \"da6a89ba31723d185fd7413b98c576a575f356d9b84729d8ecb6ead60000a5b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sm3/0.5.0/download\"],\n strip_prefix = \"sm3-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.sm3-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__smallvec-1.15.2\",\n sha256 = \"8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/smallvec/1.15.2/download\"],\n strip_prefix = \"smallvec-1.15.2\",\n build_file = Label(\"@crates//crates:BUILD.smallvec-1.15.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__smol_str-0.2.2\",\n sha256 = \"dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/smol_str/0.2.2/download\"],\n strip_prefix = \"smol_str-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.smol_str-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__socket2-0.5.10\",\n sha256 = \"e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/socket2/0.5.10/download\"],\n strip_prefix = \"socket2-0.5.10\",\n build_file = Label(\"@crates//crates:BUILD.socket2-0.5.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__socket2-0.6.5\",\n sha256 = \"c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/socket2/0.6.5/download\"],\n strip_prefix = \"socket2-0.6.5\",\n build_file = Label(\"@crates//crates:BUILD.socket2-0.6.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__spin-0.10.1\",\n sha256 = \"023a211cb3138dbc438680b32560ad89f699977624c9f8dbb95a47d5b4c07dd3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/spin/0.10.1/download\"],\n strip_prefix = \"spin-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.spin-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__spin-0.9.9\",\n sha256 = \"3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/spin/0.9.9/download\"],\n strip_prefix = \"spin-0.9.9\",\n build_file = Label(\"@crates//crates:BUILD.spin-0.9.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__spki-0.7.3\",\n sha256 = \"d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/spki/0.7.3/download\"],\n strip_prefix = \"spki-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.spki-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__stable_deref_trait-1.2.1\",\n sha256 = \"6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/stable_deref_trait/1.2.1/download\"],\n strip_prefix = \"stable_deref_trait-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.stable_deref_trait-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__static_assertions-1.1.0\",\n sha256 = \"a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/static_assertions/1.1.0/download\"],\n strip_prefix = \"static_assertions-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.static_assertions-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__str_stack-0.1.1\",\n sha256 = \"7f446288b699d66d0fd2e30d1cfe7869194312524b3b9252594868ed26ef056a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/str_stack/0.1.1/download\"],\n strip_prefix = \"str_stack-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.str_stack-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__streaming-iterator-0.1.9\",\n sha256 = \"2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/streaming-iterator/0.1.9/download\"],\n strip_prefix = \"streaming-iterator-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.streaming-iterator-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__string_cache-0.9.0\",\n sha256 = \"a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/string_cache/0.9.0/download\"],\n strip_prefix = \"string_cache-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.string_cache-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__string_cache_codegen-0.6.1\",\n sha256 = \"585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/string_cache_codegen/0.6.1/download\"],\n strip_prefix = \"string_cache_codegen-0.6.1\",\n build_file = Label(\"@crates//crates:BUILD.string_cache_codegen-0.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strsim-0.11.1\",\n sha256 = \"7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strsim/0.11.1/download\"],\n strip_prefix = \"strsim-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.strsim-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strum-0.28.0\",\n sha256 = \"9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strum/0.28.0/download\"],\n strip_prefix = \"strum-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.strum-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strum_macros-0.28.0\",\n sha256 = \"ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strum_macros/0.28.0/download\"],\n strip_prefix = \"strum_macros-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.strum_macros-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__stun-0.17.2\",\n sha256 = \"2e3b8d5ad1dd4c8cd0595440f26521a71dd593cb5873ee8e06b91510b7d97269\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/stun/0.17.2/download\"],\n strip_prefix = \"stun-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.stun-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__substring-1.4.5\",\n sha256 = \"42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/substring/1.4.5/download\"],\n strip_prefix = \"substring-1.4.5\",\n build_file = Label(\"@crates//crates:BUILD.substring-1.4.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__subtle-2.6.1\",\n sha256 = \"13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/subtle/2.6.1/download\"],\n strip_prefix = \"subtle-2.6.1\",\n build_file = Label(\"@crates//crates:BUILD.subtle-2.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-2.0.119\",\n sha256 = \"872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/2.0.119/download\"],\n strip_prefix = \"syn-2.0.119\",\n build_file = Label(\"@crates//crates:BUILD.syn-2.0.119.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-3.0.3\",\n sha256 = \"53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/3.0.3/download\"],\n strip_prefix = \"syn-3.0.3\",\n build_file = Label(\"@crates//crates:BUILD.syn-3.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__synstructure-0.13.2\",\n sha256 = \"728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/synstructure/0.13.2/download\"],\n strip_prefix = \"synstructure-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.synstructure-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syntect-5.3.0\",\n sha256 = \"656b45c05d95a5704399aeef6bd0ddec7b2b3531b7c9e900abbf7c4d2190c925\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syntect/5.3.0/download\"],\n strip_prefix = \"syntect-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.syntect-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__system-deps-7.0.8\",\n sha256 = \"396a35feb67335377e0251fcbc1092fc85c484bd4e3a7a54319399da127796e7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/system-deps/7.0.8/download\"],\n strip_prefix = \"system-deps-7.0.8\",\n build_file = Label(\"@crates//crates:BUILD.system-deps-7.0.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tap-1.0.1\",\n sha256 = \"55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tap/1.0.1/download\"],\n strip_prefix = \"tap-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.tap-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__target-lexicon-0.13.5\",\n sha256 = \"adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/target-lexicon/0.13.5/download\"],\n strip_prefix = \"target-lexicon-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.target-lexicon-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tempfile-3.27.0\",\n sha256 = \"32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tempfile/3.27.0/download\"],\n strip_prefix = \"tempfile-3.27.0\",\n build_file = Label(\"@crates//crates:BUILD.tempfile-3.27.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tendril-0.5.1\",\n sha256 = \"5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tendril/0.5.1/download\"],\n strip_prefix = \"tendril-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.tendril-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__termcolor-1.4.1\",\n sha256 = \"06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/termcolor/1.4.1/download\"],\n strip_prefix = \"termcolor-1.4.1\",\n build_file = Label(\"@crates//crates:BUILD.termcolor-1.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__terminal_size-0.4.4\",\n sha256 = \"230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/terminal_size/0.4.4/download\"],\n strip_prefix = \"terminal_size-0.4.4\",\n build_file = Label(\"@crates//crates:BUILD.terminal_size-0.4.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__terminfo-0.9.0\",\n sha256 = \"d4ea810f0692f9f51b382fff5893887bb4580f5fa246fde546e0b13e7fcee662\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/terminfo/0.9.0/download\"],\n strip_prefix = \"terminfo-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.terminfo-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-1.0.69\",\n sha256 = \"b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror/1.0.69/download\"],\n strip_prefix = \"thiserror-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-2.0.19\",\n sha256 = \"09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror/2.0.19/download\"],\n strip_prefix = \"thiserror-2.0.19\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-2.0.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-impl-1.0.69\",\n sha256 = \"4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror-impl/1.0.69/download\"],\n strip_prefix = \"thiserror-impl-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-impl-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-impl-2.0.19\",\n sha256 = \"43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror-impl/2.0.19/download\"],\n strip_prefix = \"thiserror-impl-2.0.19\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-impl-2.0.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tiff-0.11.3\",\n sha256 = \"b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tiff/0.11.3/download\"],\n strip_prefix = \"tiff-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.tiff-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tiktoken-rs-0.11.0\",\n sha256 = \"fac4a168cfc1d8ed65bf17a6ee0843ad9a68f863c63c0fb2fa7eab67838782ee\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tiktoken-rs/0.11.0/download\"],\n strip_prefix = \"tiktoken-rs-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.tiktoken-rs-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-0.3.55\",\n sha256 = \"cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time/0.3.55/download\"],\n strip_prefix = \"time-0.3.55\",\n build_file = Label(\"@crates//crates:BUILD.time-0.3.55.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-core-0.1.9\",\n sha256 = \"9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-core/0.1.9/download\"],\n strip_prefix = \"time-core-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.time-core-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-macros-0.2.32\",\n sha256 = \"7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-macros/0.2.32/download\"],\n strip_prefix = \"time-macros-0.2.32\",\n build_file = Label(\"@crates//crates:BUILD.time-macros-0.2.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tiny-keccak-2.0.2\",\n sha256 = \"2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tiny-keccak/2.0.2/download\"],\n strip_prefix = \"tiny-keccak-2.0.2\",\n build_file = Label(\"@crates//crates:BUILD.tiny-keccak-2.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinystr-0.8.3\",\n sha256 = \"c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinystr/0.8.3/download\"],\n strip_prefix = \"tinystr-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.tinystr-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinyvec-1.12.0\",\n sha256 = \"bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinyvec/1.12.0/download\"],\n strip_prefix = \"tinyvec-1.12.0\",\n build_file = Label(\"@crates//crates:BUILD.tinyvec-1.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinyvec_macros-0.1.1\",\n sha256 = \"1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinyvec_macros/0.1.1/download\"],\n strip_prefix = \"tinyvec_macros-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tinyvec_macros-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-1.53.1\",\n sha256 = \"202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio/1.53.1/download\"],\n strip_prefix = \"tokio-1.53.1\",\n build_file = Label(\"@crates//crates:BUILD.tokio-1.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-macros-2.7.2\",\n sha256 = \"78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-macros/2.7.2/download\"],\n strip_prefix = \"tokio-macros-2.7.2\",\n build_file = Label(\"@crates//crates:BUILD.tokio-macros-2.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-util-0.7.19\",\n sha256 = \"494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-util/0.7.19/download\"],\n strip_prefix = \"tokio-util-0.7.19\",\n build_file = Label(\"@crates//crates:BUILD.tokio-util-0.7.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml-1.1.4-spec-1.1.0\",\n sha256 = \"3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml/1.1.4+spec-1.1.0/download\"],\n strip_prefix = \"toml-1.1.4+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml-1.1.4+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml_datetime-1.1.1-spec-1.1.0\",\n sha256 = \"3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_datetime/1.1.1+spec-1.1.0/download\"],\n strip_prefix = \"toml_datetime-1.1.1+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml_edit-0.25.13-spec-1.1.0\",\n sha256 = \"6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_edit/0.25.13+spec-1.1.0/download\"],\n strip_prefix = \"toml_edit-0.25.13+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml_edit-0.25.13+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml_parser-1.1.3-spec-1.1.0\",\n sha256 = \"1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_parser/1.1.3+spec-1.1.0/download\"],\n strip_prefix = \"toml_parser-1.1.3+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml_parser-1.1.3+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml_writer-1.1.2-spec-1.1.0\",\n sha256 = \"7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_writer/1.1.2+spec-1.1.0/download\"],\n strip_prefix = \"toml_writer-1.1.2+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml_writer-1.1.2+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-0.1.44\",\n sha256 = \"63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing/0.1.44/download\"],\n strip_prefix = \"tracing-0.1.44\",\n build_file = Label(\"@crates//crates:BUILD.tracing-0.1.44.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-attributes-0.1.31\",\n sha256 = \"7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-attributes/0.1.31/download\"],\n strip_prefix = \"tracing-attributes-0.1.31\",\n build_file = Label(\"@crates//crates:BUILD.tracing-attributes-0.1.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-core-0.1.36\",\n sha256 = \"db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-core/0.1.36/download\"],\n strip_prefix = \"tracing-core-0.1.36\",\n build_file = Label(\"@crates//crates:BUILD.tracing-core-0.1.36.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-0.25.10\",\n sha256 = \"78f873475d258561b06f1c595d93308a7ed124d9977cb26b148c2084a4a3cc87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter/0.25.10/download\"],\n strip_prefix = \"tree-sitter-0.25.10\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-0.25.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-astro-next-0.1.1\",\n sha256 = \"794a4a59fc2d88e49b4bc41fef9522d77184a36f4e68bbaf545cd1eb2364c46e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-astro-next/0.1.1/download\"],\n strip_prefix = \"tree-sitter-astro-next-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-astro-next-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-bash-0.25.1\",\n sha256 = \"9e5ec769279cc91b561d3df0d8a5deb26b0ad40d183127f409494d6d8fc53062\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-bash/0.25.1/download\"],\n strip_prefix = \"tree-sitter-bash-0.25.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-bash-0.25.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-c-0.24.2\",\n sha256 = \"a9b2eb57a55fed6b00812912e730b7a275cf4fe98bfd6a5d76263d4438371728\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-c/0.24.2/download\"],\n strip_prefix = \"tree-sitter-c-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-c-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-c-sharp-0.23.5\",\n sha256 = \"c1aac67f1ad71de1d6d39708d34811081c26dfa495658de6c14c34200849357c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-c-sharp/0.23.5/download\"],\n strip_prefix = \"tree-sitter-c-sharp-0.23.5\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-c-sharp-0.23.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-clojure-0.1.0\",\n sha256 = \"4004884cc509449a1d78fa3e1f02b4e953d0a8065984445304795e72e885338c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-clojure/0.1.0/download\"],\n strip_prefix = \"tree-sitter-clojure-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-clojure-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-cmake-0.7.4\",\n sha256 = \"164e0c4f4236ec5ceff14824a5528615cf462e100467e49826442ff57d327061\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-cmake/0.7.4/download\"],\n strip_prefix = \"tree-sitter-cmake-0.7.4\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-cmake-0.7.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-cpp-0.23.4\",\n sha256 = \"df2196ea9d47b4ab4a31b9297eaa5a5d19a0b121dceb9f118f6790ad0ab94743\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-cpp/0.23.4/download\"],\n strip_prefix = \"tree-sitter-cpp-0.23.4\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-cpp-0.23.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-css-0.25.0\",\n sha256 = \"a5cbc5e18f29a2c6d6435891f42569525cf95435a3e01c2f1947abcde178686f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-css/0.25.0/download\"],\n strip_prefix = \"tree-sitter-css-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-css-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-dart-0.2.0\",\n sha256 = \"325dd1e24ee9ee21111e9c43680ae7d6010aaa9f282b048a99b9c7163c1cf553\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-dart/0.2.0/download\"],\n strip_prefix = \"tree-sitter-dart-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-dart-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-diff-0.1.0\",\n sha256 = \"dfe1e5ca280a65dfe5ba4205c1bcc84edf486464fed315db53dee6da9a335889\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-diff/0.1.0/download\"],\n strip_prefix = \"tree-sitter-diff-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-diff-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-dockerfile-updated-0.2.0\",\n sha256 = \"5e61eb704364be179ab9be89e2891c8e77c0041eca5891a5c04164a21f6df7a0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-dockerfile-updated/0.2.0/download\"],\n strip_prefix = \"tree-sitter-dockerfile-updated-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-dockerfile-updated-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-elisp-1.7.2\",\n sha256 = \"6b8b82ab7474028f20d2119285566f219209ebdbeec767fa28025b70f94f8cf3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-elisp/1.7.2/download\"],\n strip_prefix = \"tree-sitter-elisp-1.7.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-elisp-1.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-elixir-0.3.5\",\n sha256 = \"66dd064a762ed95bfc29857fa3cb7403bb1e5cb88112de0f6341b7e47284ba40\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-elixir/0.3.5/download\"],\n strip_prefix = \"tree-sitter-elixir-0.3.5\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-elixir-0.3.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-erlang-0.16.0\",\n sha256 = \"ceb442e728225d601db0661f60d64e166bd9b9a55c587f71d4e4f27378717cce\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-erlang/0.16.0/download\"],\n strip_prefix = \"tree-sitter-erlang-0.16.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-erlang-0.16.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-fortran-0.6.0\",\n sha256 = \"ea5fea41363a9b59666001dc26c4b356d4e164da27c6ce31145e00aba6bf9b16\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-fortran/0.6.0/download\"],\n strip_prefix = \"tree-sitter-fortran-0.6.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-fortran-0.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-go-0.25.0\",\n sha256 = \"c8560a4d2f835cc0d4d2c2e03cbd0dde2f6114b43bc491164238d333e28b16ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-go/0.25.0/download\"],\n strip_prefix = \"tree-sitter-go-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-go-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-graphql-0.1.0\",\n sha256 = \"efedc4cac157161cc23a0adc4553a2cedc908e1cd754b6cd033a919bb81ce5d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-graphql/0.1.0/download\"],\n strip_prefix = \"tree-sitter-graphql-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-graphql-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-haskell-0.23.1\",\n sha256 = \"977c51e504548cba13fc27cb5a2edab2124cf6716a1934915d07ab99523b05a4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-haskell/0.23.1/download\"],\n strip_prefix = \"tree-sitter-haskell-0.23.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-haskell-0.23.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-hcl-1.1.0\",\n sha256 = \"5a7b2cc3d7121553b84309fab9d11b3ff3d420403eef9ae50f9fd1cd9d9cf012\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-hcl/1.1.0/download\"],\n strip_prefix = \"tree-sitter-hcl-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-hcl-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-html-0.23.2\",\n sha256 = \"261b708e5d92061ede329babaaa427b819329a9d427a1d710abb0f67bbef63ee\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-html/0.23.2/download\"],\n strip_prefix = \"tree-sitter-html-0.23.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-html-0.23.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-ini-1.4.0\",\n sha256 = \"387f79682cd53b7c0a5777c96e601a02b9965a787984ef86dbb8952bdab2d62f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-ini/1.4.0/download\"],\n strip_prefix = \"tree-sitter-ini-1.4.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-ini-1.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-java-0.23.5\",\n sha256 = \"0aa6cbcdc8c679b214e616fd3300da67da0e492e066df01bcf5a5921a71e90d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-java/0.23.5/download\"],\n strip_prefix = \"tree-sitter-java-0.23.5\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-java-0.23.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-javascript-0.25.0\",\n sha256 = \"68204f2abc0627a90bdf06e605f5c470aa26fdcb2081ea553a04bdad756693f5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-javascript/0.25.0/download\"],\n strip_prefix = \"tree-sitter-javascript-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-javascript-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-json-0.24.8\",\n sha256 = \"4d727acca406c0020cffc6cf35516764f36c8e3dc4408e5ebe2cb35a947ec471\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-json/0.24.8/download\"],\n strip_prefix = \"tree-sitter-json-0.24.8\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-json-0.24.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-julia-0.23.1\",\n sha256 = \"4144731a178812ee867619b1e98b3b91e54c1652304b26e5ebe3175b701de323\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-julia/0.23.1/download\"],\n strip_prefix = \"tree-sitter-julia-0.23.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-julia-0.23.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-just-0.2.0\",\n sha256 = \"bd46794f2c270f43d73b2f2c8c256992471f3493c903604da0886df984771920\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-just/0.2.0/download\"],\n strip_prefix = \"tree-sitter-just-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-just-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-kotlin-sg-0.4.1\",\n sha256 = \"c06ec43ae3c12165d4ac08afe4e1f5fc6757ffe274fa7bd5af9007ef11ba4319\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-kotlin-sg/0.4.1/download\"],\n strip_prefix = \"tree-sitter-kotlin-sg-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-kotlin-sg-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-language-0.1.7\",\n sha256 = \"009994f150cc0cd50ff54917d5bc8bffe8cad10ca10d81c34da2ec421ae61782\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-language/0.1.7/download\"],\n strip_prefix = \"tree-sitter-language-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-language-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-lua-0.5.0\",\n sha256 = \"8daaf5f4235188a58603c39760d5fa5d4b920d36a299c934adddae757f32a10c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-lua/0.5.0/download\"],\n strip_prefix = \"tree-sitter-lua-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-lua-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-make-1.1.1\",\n sha256 = \"c5998dc7cbcbdab19fae8aefef982bf2d6544513d8d2e69cc44aec4c63810104\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-make/1.1.1/download\"],\n strip_prefix = \"tree-sitter-make-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-make-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-md-0.5.3\",\n sha256 = \"2efd398be546456c814598ee56c0f51769a77241511b4a58077815d120afa882\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-md/0.5.3/download\"],\n strip_prefix = \"tree-sitter-md-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-md-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-nix-0.3.0\",\n sha256 = \"4952a9733f3a98f6683a0ccd1035d84ab7a52f7e84eeed58548d86765ad92de3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-nix/0.3.0/download\"],\n strip_prefix = \"tree-sitter-nix-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-nix-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-objc-3.0.2\",\n sha256 = \"9ca8bb556423fc176f0535e79d525f783a6684d3c9da81bf9d905303c129e1d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-objc/3.0.2/download\"],\n strip_prefix = \"tree-sitter-objc-3.0.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-objc-3.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-ocaml-0.24.2\",\n sha256 = \"7d19db582b3855f56b5f9ec484170fbfb9ee60b938ec7720d76d2ee788e8b640\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-ocaml/0.24.2/download\"],\n strip_prefix = \"tree-sitter-ocaml-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-ocaml-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-odin-1.3.0\",\n sha256 = \"24db210fe9ba2237c71c5030d7b146c7025420ba72dd8013d13cd822c3a8d77a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-odin/1.3.0/download\"],\n strip_prefix = \"tree-sitter-odin-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-odin-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-php-0.24.2\",\n sha256 = \"0d8c17c3ab69052c5eeaa7ff5cd972dd1bc25d1b97ee779fec391ad3b5df5592\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-php/0.24.2/download\"],\n strip_prefix = \"tree-sitter-php-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-php-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-powershell-0.26.4\",\n sha256 = \"3faf304d44b9ddd4a7d97804bb8de7daf564336dd5a526dc6de5b39238243022\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-powershell/0.26.4/download\"],\n strip_prefix = \"tree-sitter-powershell-0.26.4\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-powershell-0.26.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-proto-0.4.0\",\n sha256 = \"2e410ccb5fa3cbd6bf7b8e512ecf7ad9d5254395b822bfe9f751b50fa978f31c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-proto/0.4.0/download\"],\n strip_prefix = \"tree-sitter-proto-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-proto-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-python-0.25.0\",\n sha256 = \"6bf85fd39652e740bf60f46f4cda9492c3a9ad75880575bf14960f775cb74a1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-python/0.25.0/download\"],\n strip_prefix = \"tree-sitter-python-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-python-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-r-1.3.0\",\n sha256 = \"ffc9954ec870dcad6cffdd302b405306c68cf031ed79a78cd9746f6740d9fe20\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-r/1.3.0/download\"],\n strip_prefix = \"tree-sitter-r-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-r-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-regex-0.25.0\",\n sha256 = \"bd8a59be9f0ac131fd8f062eaaba14882b2fa5a6a7882a20134cb1d60df2e625\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-regex/0.25.0/download\"],\n strip_prefix = \"tree-sitter-regex-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-regex-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-ruby-0.23.1\",\n sha256 = \"be0484ea4ef6bb9c575b4fdabde7e31340a8d2dbc7d52b321ac83da703249f95\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-ruby/0.23.1/download\"],\n strip_prefix = \"tree-sitter-ruby-0.23.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-ruby-0.23.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-rust-0.24.2\",\n sha256 = \"439e577dbe07423ec2582ac62c7531120dbfccfa6e5f92406f93dd271a120e45\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-rust/0.24.2/download\"],\n strip_prefix = \"tree-sitter-rust-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-rust-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-scala-0.26.0\",\n sha256 = \"de5a4a7ff23a55474ce6a741d52aaeca7a82fe9421bb982b86e98c6ac8629397\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-scala/0.26.0/download\"],\n strip_prefix = \"tree-sitter-scala-0.26.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-scala-0.26.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-sequel-0.3.11\",\n sha256 = \"9d198ad3c319c02e43c21efa1ec796b837afcb96ffaef1a40c1978fbdcec7d17\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-sequel/0.3.11/download\"],\n strip_prefix = \"tree-sitter-sequel-0.3.11\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-sequel-0.3.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-solidity-1.2.13\",\n sha256 = \"4eacf8875b70879f0cb670c60b233ad0b68752d9e1474e6c3ef168eea8a90b25\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-solidity/1.2.13/download\"],\n strip_prefix = \"tree-sitter-solidity-1.2.13\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-solidity-1.2.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-starlark-1.3.0\",\n sha256 = \"8934f282d085cc4b9ee28aa688aa3fbe8aa3766201c2a6252f411d45b4c3a721\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-starlark/1.3.0/download\"],\n strip_prefix = \"tree-sitter-starlark-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-starlark-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-svelte-next-0.1.1\",\n sha256 = \"56f88190d0743e897c3e148a7e241aba0a8844b8afe816943851426e3f7b9753\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-svelte-next/0.1.1/download\"],\n strip_prefix = \"tree-sitter-svelte-next-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-svelte-next-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-swift-0.7.3\",\n sha256 = \"fe36052155b9dd69ca82b3b8f1b4ccfb2d867125ac1a4db1dd7331829242668c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-swift/0.7.3/download\"],\n strip_prefix = \"tree-sitter-swift-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-swift-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-tlaplus-1.5.0\",\n sha256 = \"ddaacc0337bfee38f233a91a704dc36b887a0c385348163f65344d64b73f79e1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-tlaplus/1.5.0/download\"],\n strip_prefix = \"tree-sitter-tlaplus-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-tlaplus-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-toml-ng-0.7.0\",\n sha256 = \"e9adc2c898ae49730e857d75be403da3f92bb81d8e37a2f918a08dd10de5ebb1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-toml-ng/0.7.0/download\"],\n strip_prefix = \"tree-sitter-toml-ng-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-toml-ng-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-typescript-0.23.2\",\n sha256 = \"6c5f76ed8d947a75cc446d5fccd8b602ebf0cde64ccf2ffa434d873d7a575eff\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-typescript/0.23.2/download\"],\n strip_prefix = \"tree-sitter-typescript-0.23.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-typescript-0.23.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-verilog-1.0.3\",\n sha256 = \"d4e7e0360395852f1f6ff5b7b82c72dc6557d181073188df1d60ec469ea69c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-verilog/1.0.3/download\"],\n strip_prefix = \"tree-sitter-verilog-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-verilog-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-vue-next-0.1.0\",\n sha256 = \"e9ac89acaa8165aaabfa8ae9683aa423b0d2bf42c815dae5ca031a36a75525f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-vue-next/0.1.0/download\"],\n strip_prefix = \"tree-sitter-vue-next-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-vue-next-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-xml-0.7.0\",\n sha256 = \"e670041f591d994f54d597ddcd8f4ebc930e282c4c76a42268743b71f0c8b6b3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-xml/0.7.0/download\"],\n strip_prefix = \"tree-sitter-xml-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-xml-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-yaml-0.7.2\",\n sha256 = \"53c223db85f05e34794f065454843b0668ebc15d240ada63e2b5939f43ce7c97\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-yaml/0.7.2/download\"],\n strip_prefix = \"tree-sitter-yaml-0.7.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-yaml-0.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-zig-1.1.2\",\n sha256 = \"ab11fc124851b0db4dd5e55983bbd9631192e93238389dcd44521715e5d53e28\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-zig/1.1.2/download\"],\n strip_prefix = \"tree-sitter-zig-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-zig-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree_magic_mini-3.2.2\",\n sha256 = \"b8765b90061cba6c22b5831f675da109ae5561588290f9fa2317adab2714d5a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree_magic_mini/3.2.2/download\"],\n strip_prefix = \"tree_magic_mini-3.2.2\",\n build_file = Label(\"@crates//crates:BUILD.tree_magic_mini-3.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__triomphe-0.1.16\",\n sha256 = \"b40688ea6389c8171614b25491f71d4a27946e0c7ce2da1c6de27e25abf1a0ae\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/triomphe/0.1.16/download\"],\n strip_prefix = \"triomphe-0.1.16\",\n build_file = Label(\"@crates//crates:BUILD.triomphe-0.1.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ttf-parser-0.25.1\",\n sha256 = \"d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ttf-parser/0.25.1/download\"],\n strip_prefix = \"ttf-parser-0.25.1\",\n build_file = Label(\"@crates//crates:BUILD.ttf-parser-0.25.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__turn-0.17.2\",\n sha256 = \"d99249a493335eb44c4d7943a8751b22561a82c9903d8eb2d29780b3927880a7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/turn/0.17.2/download\"],\n strip_prefix = \"turn-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.turn-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__type-map-0.5.1\",\n sha256 = \"cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/type-map/0.5.1/download\"],\n strip_prefix = \"type-map-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.type-map-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__typed-arena-2.0.2\",\n sha256 = \"6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/typed-arena/2.0.2/download\"],\n strip_prefix = \"typed-arena-2.0.2\",\n build_file = Label(\"@crates//crates:BUILD.typed-arena-2.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__typenum-1.20.1\",\n sha256 = \"b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/typenum/1.20.1/download\"],\n strip_prefix = \"typenum-1.20.1\",\n build_file = Label(\"@crates//crates:BUILD.typenum-1.20.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ucd-trie-0.1.7\",\n sha256 = \"2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ucd-trie/0.1.7/download\"],\n strip_prefix = \"ucd-trie-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.ucd-trie-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uds_windows-1.2.1\",\n sha256 = \"f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uds_windows/1.2.1/download\"],\n strip_prefix = \"uds_windows-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.uds_windows-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uiautomation-0.25.0\",\n sha256 = \"c68495a701b9f2f21f29353ac446f0d27dd0d7ce97aa9ccf9061bca0446cd744\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uiautomation/0.25.0/download\"],\n strip_prefix = \"uiautomation-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.uiautomation-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uiautomation_derive-0.7.8\",\n sha256 = \"ffcc4d404aa1c03a848f95cf5feadc3e63946d7f095bf388770b85550093d388\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uiautomation_derive/0.7.8/download\"],\n strip_prefix = \"uiautomation_derive-0.7.8\",\n build_file = Label(\"@crates//crates:BUILD.uiautomation_derive-0.7.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unic-langid-0.9.6\",\n sha256 = \"a28ba52c9b05311f4f6e62d5d9d46f094bd6e84cb8df7b3ef952748d752a7d05\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unic-langid/0.9.6/download\"],\n strip_prefix = \"unic-langid-0.9.6\",\n build_file = Label(\"@crates//crates:BUILD.unic-langid-0.9.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unic-langid-impl-0.9.6\",\n sha256 = \"dce1bf08044d4b7a94028c93786f8566047edc11110595914de93362559bc658\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unic-langid-impl/0.9.6/download\"],\n strip_prefix = \"unic-langid-impl-0.9.6\",\n build_file = Label(\"@crates//crates:BUILD.unic-langid-impl-0.9.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicase-2.9.0\",\n sha256 = \"dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicase/2.9.0/download\"],\n strip_prefix = \"unicase-2.9.0\",\n build_file = Label(\"@crates//crates:BUILD.unicase-2.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-ident-1.0.24\",\n sha256 = \"e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-ident/1.0.24/download\"],\n strip_prefix = \"unicode-ident-1.0.24\",\n build_file = Label(\"@crates//crates:BUILD.unicode-ident-1.0.24.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-segmentation-1.13.3\",\n sha256 = \"c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-segmentation/1.13.3/download\"],\n strip_prefix = \"unicode-segmentation-1.13.3\",\n build_file = Label(\"@crates//crates:BUILD.unicode-segmentation-1.13.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-width-0.1.14\",\n sha256 = \"7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-width/0.1.14/download\"],\n strip_prefix = \"unicode-width-0.1.14\",\n build_file = Label(\"@crates//crates:BUILD.unicode-width-0.1.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-width-0.2.2\",\n sha256 = \"b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-width/0.2.2/download\"],\n strip_prefix = \"unicode-width-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.unicode-width-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unit-prefix-0.5.2\",\n sha256 = \"81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unit-prefix/0.5.2/download\"],\n strip_prefix = \"unit-prefix-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.unit-prefix-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__universal-hash-0.5.1\",\n sha256 = \"fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/universal-hash/0.5.1/download\"],\n strip_prefix = \"universal-hash-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.universal-hash-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__untrusted-0.9.0\",\n sha256 = \"8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/untrusted/0.9.0/download\"],\n strip_prefix = \"untrusted-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.untrusted-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__url-2.5.8\",\n sha256 = \"ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/url/2.5.8/download\"],\n strip_prefix = \"url-2.5.8\",\n build_file = Label(\"@crates//crates:BUILD.url-2.5.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__urlencoding-2.1.3\",\n sha256 = \"daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/urlencoding/2.1.3/download\"],\n strip_prefix = \"urlencoding-2.1.3\",\n build_file = Label(\"@crates//crates:BUILD.urlencoding-2.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf16_iter-1.0.5\",\n sha256 = \"c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf16_iter/1.0.5/download\"],\n strip_prefix = \"utf16_iter-1.0.5\",\n build_file = Label(\"@crates//crates:BUILD.utf16_iter-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8-chars-3.0.7\",\n sha256 = \"92498c67ea3511b37eccff13b573ed871faf0ce9c4056ab032bd01a681f445a0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8-chars/3.0.7/download\"],\n strip_prefix = \"utf8-chars-3.0.7\",\n build_file = Label(\"@crates//crates:BUILD.utf8-chars-3.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8_iter-1.0.4\",\n sha256 = \"b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8_iter/1.0.4/download\"],\n strip_prefix = \"utf8_iter-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.utf8_iter-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8parse-0.2.2\",\n sha256 = \"06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8parse/0.2.2/download\"],\n strip_prefix = \"utf8parse-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.utf8parse-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore-0.8.0\",\n sha256 = \"07d779636d827cde4100f0e65ff3fd23b0b1f1195055475c6e6813d425f30c8e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore/0.8.0/download\"],\n strip_prefix = \"uucore-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.uucore-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore_procs-0.8.0\",\n sha256 = \"da865e8a648b260dbd89fca76d0801995877ab27a4e259b6dec30ba9743b86ab\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore_procs/0.8.0/download\"],\n strip_prefix = \"uucore_procs-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.uucore_procs-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uuid-1.24.0\",\n sha256 = \"bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uuid/1.24.0/download\"],\n strip_prefix = \"uuid-1.24.0\",\n build_file = Label(\"@crates//crates:BUILD.uuid-1.24.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uutils_term_grid-0.8.0\",\n sha256 = \"382d49b39de4a115f203305057741126b09a615892d773a2d419a2b816e30e39\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uutils_term_grid/0.8.0/download\"],\n strip_prefix = \"uutils_term_grid-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.uutils_term_grid-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uzers-0.12.2\",\n sha256 = \"0b8275fb1afee25b4111d2dc8b5c505dbbc4afd0b990cb96deb2d88bff8be18d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uzers/0.12.2/download\"],\n strip_prefix = \"uzers-0.12.2\",\n build_file = Label(\"@crates//crates:BUILD.uzers-0.12.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__version-compare-0.2.1\",\n sha256 = \"03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/version-compare/0.2.1/download\"],\n strip_prefix = \"version-compare-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.version-compare-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__version_check-0.9.5\",\n sha256 = \"0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/version_check/0.9.5/download\"],\n strip_prefix = \"version_check-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.version_check-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__vsimd-0.8.0\",\n sha256 = \"5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/vsimd/0.8.0/download\"],\n strip_prefix = \"vsimd-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.vsimd-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__waitgroup-0.1.2\",\n sha256 = \"d1f50000a783467e6c0200f9d10642f4bc424e39efc1b770203e88b488f79292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/waitgroup/0.1.2/download\"],\n strip_prefix = \"waitgroup-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.waitgroup-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__walkdir-2.5.0\",\n sha256 = \"29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/walkdir/2.5.0/download\"],\n strip_prefix = \"walkdir-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.walkdir-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.11.1-wasi-snapshot-preview1\",\n sha256 = \"ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download\"],\n strip_prefix = \"wasi-0.11.1+wasi-snapshot-preview1\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.14.7-wasi-0.2.4\",\n sha256 = \"883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.14.7+wasi-0.2.4/download\"],\n strip_prefix = \"wasi-0.14.7+wasi-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.14.7+wasi-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasip2-1.0.4-wasi-0.2.12\",\n sha256 = \"b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasip2/1.0.4+wasi-0.2.12/download\"],\n strip_prefix = \"wasip2-1.0.4+wasi-0.2.12\",\n build_file = Label(\"@crates//crates:BUILD.wasip2-1.0.4+wasi-0.2.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasite-1.0.2\",\n sha256 = \"66fe902b4a6b8028a753d5424909b764ccf79b7a209eac9bf97e59cda9f71a42\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasite/1.0.2/download\"],\n strip_prefix = \"wasite-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.wasite-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-0.2.126\",\n sha256 = \"4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-0.2.126\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-0.2.126\",\n sha256 = \"167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-macro-0.2.126\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-support-0.2.126\",\n sha256 = \"f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-macro-support-0.2.126\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-support-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-shared-0.2.126\",\n sha256 = \"dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-shared/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-shared-0.2.126\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-shared-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-backend-0.3.16\",\n sha256 = \"016ccf01d1c58b6f8999612813e17c9b2390f7d70671428869913310f83f54b8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-backend/0.3.16/download\"],\n strip_prefix = \"wayland-backend-0.3.16\",\n build_file = Label(\"@crates//crates:BUILD.wayland-backend-0.3.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-client-0.31.15\",\n sha256 = \"e3c36a0f861ad76d0901f2800b46321410d9f73f2ea88aac0650d86c32688073\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-client/0.31.15/download\"],\n strip_prefix = \"wayland-client-0.31.15\",\n build_file = Label(\"@crates//crates:BUILD.wayland-client-0.31.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-protocols-0.32.13\",\n sha256 = \"23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-protocols/0.32.13/download\"],\n strip_prefix = \"wayland-protocols-0.32.13\",\n build_file = Label(\"@crates//crates:BUILD.wayland-protocols-0.32.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-protocols-wlr-0.3.12\",\n sha256 = \"eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-protocols-wlr/0.3.12/download\"],\n strip_prefix = \"wayland-protocols-wlr-0.3.12\",\n build_file = Label(\"@crates//crates:BUILD.wayland-protocols-wlr-0.3.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-scanner-0.31.11\",\n sha256 = \"338e30461b3a2b67d70eb30a6d89f8e0c93a833e07d2ae89085cd070c4a00ac0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-scanner/0.31.11/download\"],\n strip_prefix = \"wayland-scanner-0.31.11\",\n build_file = Label(\"@crates//crates:BUILD.wayland-scanner-0.31.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-server-0.31.14\",\n sha256 = \"0dde9c29be0f723a573977de51ee455bf3dfa03652730a74f9dd3b337e374d75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-server/0.31.14/download\"],\n strip_prefix = \"wayland-server-0.31.14\",\n build_file = Label(\"@crates//crates:BUILD.wayland-server-0.31.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-sys-0.31.11\",\n sha256 = \"d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-sys/0.31.11/download\"],\n strip_prefix = \"wayland-sys-0.31.11\",\n build_file = Label(\"@crates//crates:BUILD.wayland-sys-0.31.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__web-sys-0.3.103\",\n sha256 = \"8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/web-sys/0.3.103/download\"],\n strip_prefix = \"web-sys-0.3.103\",\n build_file = Label(\"@crates//crates:BUILD.web-sys-0.3.103.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__web-time-1.1.0\",\n sha256 = \"5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/web-time/1.1.0/download\"],\n strip_prefix = \"web-time-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.web-time-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__web_atoms-0.2.5\",\n sha256 = \"075474b12bcb3d2e3d4546580e9de478eeeead668a1761e2a8860c836b7ef297\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/web_atoms/0.2.5/download\"],\n strip_prefix = \"web_atoms-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.web_atoms-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-0.17.2\",\n sha256 = \"baaacdf9d96224d7b6e2872ba065578f38775f7634367e3ac2cc87c7271da433\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc/0.17.2/download\"],\n strip_prefix = \"webrtc-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-data-0.17.2\",\n sha256 = \"bd470286275809f2fcfcdb1e73ef5f1500be82eff7fe98150ce81b20aad5a2a4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-data/0.17.2/download\"],\n strip_prefix = \"webrtc-data-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-data-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-ice-0.17.2\",\n sha256 = \"5b7fd30f52e6fda8664779b84b7904b2553b76fee24d9ca665e774ae32b13f53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-ice/0.17.2/download\"],\n strip_prefix = \"webrtc-ice-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-ice-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-mdns-0.17.2\",\n sha256 = \"91ffa0ea00c0fae979aafa5db285fec5eeb360e1ea246ebec529ba4e09f8e03e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-mdns/0.17.2/download\"],\n strip_prefix = \"webrtc-mdns-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-mdns-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-media-0.17.2\",\n sha256 = \"26a6c7335bdd03dc023cb9a3bd7966866d969c92c86987b73aa16dfa39c7ca29\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-media/0.17.2/download\"],\n strip_prefix = \"webrtc-media-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-media-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-sctp-0.17.2\",\n sha256 = \"1c4b637f0d8eb96d900ac0f79b3060ddd21ca88dfefa467e96e67ab0016f2574\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-sctp/0.17.2/download\"],\n strip_prefix = \"webrtc-sctp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-sctp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-srtp-0.17.2\",\n sha256 = \"45d2b667a0b5d04eebcb7cb22fd51b2af3721f418097b496e72de16386c8d0c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-srtp/0.17.2/download\"],\n strip_prefix = \"webrtc-srtp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-srtp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-util-0.17.2\",\n sha256 = \"1beae0b4f24969741c26ca282a257dc5823bd9cbe608f7e3ca3775102d323ad9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-util/0.17.2/download\"],\n strip_prefix = \"webrtc-util-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-util-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__weezl-0.1.12\",\n sha256 = \"a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/weezl/0.1.12/download\"],\n strip_prefix = \"weezl-0.1.12\",\n build_file = Label(\"@crates//crates:BUILD.weezl-0.1.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__whoami-2.1.2\",\n sha256 = \"998767ef88740d1f5b0682a9c53c24431453923962269c2db68ee43788c5a40d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/whoami/2.1.2/download\"],\n strip_prefix = \"whoami-2.1.2\",\n build_file = Label(\"@crates//crates:BUILD.whoami-2.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wide-0.8.3\",\n sha256 = \"13ca908d26e4786149c48efcf6c0ea09ab0e06d1fe3c17dc1b4b0f1ca4a7e788\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wide/0.8.3/download\"],\n strip_prefix = \"wide-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.wide-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__widestring-1.2.1\",\n sha256 = \"72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/widestring/1.2.1/download\"],\n strip_prefix = \"widestring-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.widestring-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wild-2.2.1\",\n sha256 = \"a3131afc8c575281e1e80f36ed6a092aa502c08b18ed7524e86fbbb12bb410e1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wild/2.2.1/download\"],\n strip_prefix = \"wild-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.wild-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-0.3.9\",\n sha256 = \"5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi/0.3.9/download\"],\n strip_prefix = \"winapi-0.3.9\",\n build_file = Label(\"@crates//crates:BUILD.winapi-0.3.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-i686-pc-windows-gnu-0.4.0\",\n sha256 = \"ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-i686-pc-windows-gnu/0.4.0/download\"],\n strip_prefix = \"winapi-i686-pc-windows-gnu-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.winapi-i686-pc-windows-gnu-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-util-0.1.11\",\n sha256 = \"c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-util/0.1.11/download\"],\n strip_prefix = \"winapi-util-0.1.11\",\n build_file = Label(\"@crates//crates:BUILD.winapi-util-0.1.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-x86_64-pc-windows-gnu-0.4.0\",\n sha256 = \"712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download\"],\n strip_prefix = \"winapi-x86_64-pc-windows-gnu-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.winapi-x86_64-pc-windows-gnu-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-0.51.1\",\n sha256 = \"ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows/0.51.1/download\"],\n strip_prefix = \"windows-0.51.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-0.51.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-0.61.3\",\n sha256 = \"9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows/0.61.3/download\"],\n strip_prefix = \"windows-0.61.3\",\n build_file = Label(\"@crates//crates:BUILD.windows-0.61.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-0.62.2\",\n sha256 = \"527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows/0.62.2/download\"],\n strip_prefix = \"windows-0.62.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-0.62.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-collections-0.2.0\",\n sha256 = \"3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-collections/0.2.0/download\"],\n strip_prefix = \"windows-collections-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-collections-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-collections-0.3.2\",\n sha256 = \"23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-collections/0.3.2/download\"],\n strip_prefix = \"windows-collections-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-collections-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-core-0.51.1\",\n sha256 = \"f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-core/0.51.1/download\"],\n strip_prefix = \"windows-core-0.51.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-core-0.51.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-core-0.61.2\",\n sha256 = \"c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-core/0.61.2/download\"],\n strip_prefix = \"windows-core-0.61.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-core-0.61.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-core-0.62.2\",\n sha256 = \"b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-core/0.62.2/download\"],\n strip_prefix = \"windows-core-0.62.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-core-0.62.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-future-0.2.1\",\n sha256 = \"fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-future/0.2.1/download\"],\n strip_prefix = \"windows-future-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-future-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-future-0.3.2\",\n sha256 = \"e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-future/0.3.2/download\"],\n strip_prefix = \"windows-future-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-future-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-implement-0.60.2\",\n sha256 = \"053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-implement/0.60.2/download\"],\n strip_prefix = \"windows-implement-0.60.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-implement-0.60.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-interface-0.59.3\",\n sha256 = \"3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-interface/0.59.3/download\"],\n strip_prefix = \"windows-interface-0.59.3\",\n build_file = Label(\"@crates//crates:BUILD.windows-interface-0.59.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-link-0.1.3\",\n sha256 = \"5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-link/0.1.3/download\"],\n strip_prefix = \"windows-link-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.windows-link-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-link-0.2.1\",\n sha256 = \"f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-link/0.2.1/download\"],\n strip_prefix = \"windows-link-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-link-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-numerics-0.2.0\",\n sha256 = \"9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-numerics/0.2.0/download\"],\n strip_prefix = \"windows-numerics-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-numerics-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-numerics-0.3.1\",\n sha256 = \"6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-numerics/0.3.1/download\"],\n strip_prefix = \"windows-numerics-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-numerics-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-result-0.3.4\",\n sha256 = \"56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-result/0.3.4/download\"],\n strip_prefix = \"windows-result-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.windows-result-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-result-0.4.1\",\n sha256 = \"7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-result/0.4.1/download\"],\n strip_prefix = \"windows-result-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-result-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-strings-0.4.2\",\n sha256 = \"56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-strings/0.4.2/download\"],\n strip_prefix = \"windows-strings-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-strings-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-strings-0.5.1\",\n sha256 = \"7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-strings/0.5.1/download\"],\n strip_prefix = \"windows-strings-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-strings-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.52.0\",\n sha256 = \"282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.52.0/download\"],\n strip_prefix = \"windows-sys-0.52.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.52.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.59.0\",\n sha256 = \"1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.59.0/download\"],\n strip_prefix = \"windows-sys-0.59.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.59.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.60.2\",\n sha256 = \"f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.60.2/download\"],\n strip_prefix = \"windows-sys-0.60.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.60.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.61.2\",\n sha256 = \"ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.61.2/download\"],\n strip_prefix = \"windows-sys-0.61.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.61.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.48.5\",\n sha256 = \"9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.48.5/download\"],\n strip_prefix = \"windows-targets-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.52.6\",\n sha256 = \"9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.52.6/download\"],\n strip_prefix = \"windows-targets-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.53.5\",\n sha256 = \"4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.53.5/download\"],\n strip_prefix = \"windows-targets-0.53.5\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.53.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-threading-0.1.0\",\n sha256 = \"b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-threading/0.1.0/download\"],\n strip_prefix = \"windows-threading-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-threading-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-threading-0.2.1\",\n sha256 = \"3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-threading/0.2.1/download\"],\n strip_prefix = \"windows-threading-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-threading-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.48.5\",\n sha256 = \"2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.52.6\",\n sha256 = \"32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.53.1\",\n sha256 = \"a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.48.5\",\n sha256 = \"dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.52.6\",\n sha256 = \"09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.53.1\",\n sha256 = \"b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.53.1/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.48.5\",\n sha256 = \"a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.48.5/download\"],\n strip_prefix = \"windows_i686_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.52.6\",\n sha256 = \"8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.53.1\",\n sha256 = \"960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.53.1/download\"],\n strip_prefix = \"windows_i686_gnu-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.52.6\",\n sha256 = \"0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.53.1\",\n sha256 = \"fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.48.5\",\n sha256 = \"8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.48.5/download\"],\n strip_prefix = \"windows_i686_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.52.6\",\n sha256 = \"240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.52.6/download\"],\n strip_prefix = \"windows_i686_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.53.1\",\n sha256 = \"1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.53.1/download\"],\n strip_prefix = \"windows_i686_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.48.5\",\n sha256 = \"53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.52.6\",\n sha256 = \"147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.53.1\",\n sha256 = \"9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.48.5\",\n sha256 = \"0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.52.6\",\n sha256 = \"24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.53.1\",\n sha256 = \"0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.48.5\",\n sha256 = \"ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.52.6\",\n sha256 = \"589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.53.1\",\n sha256 = \"d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winnow-0.7.15\",\n sha256 = \"df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winnow/0.7.15/download\"],\n strip_prefix = \"winnow-0.7.15\",\n build_file = Label(\"@crates//crates:BUILD.winnow-0.7.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winnow-1.0.4\",\n sha256 = \"23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winnow/1.0.4/download\"],\n strip_prefix = \"winnow-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.winnow-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winreg-0.10.1\",\n sha256 = \"80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winreg/0.10.1/download\"],\n strip_prefix = \"winreg-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.winreg-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winreg-0.56.0\",\n sha256 = \"7d6f32a0ff4a9f6f01231eb2059cc85479330739333e0e58cadf03b6af2cca10\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winreg/0.56.0/download\"],\n strip_prefix = \"winreg-0.56.0\",\n build_file = Label(\"@crates//crates:BUILD.winreg-0.56.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-0.57.1\",\n sha256 = \"1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen/0.57.1/download\"],\n strip_prefix = \"wit-bindgen-0.57.1\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-0.57.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wl-clipboard-rs-0.9.3\",\n sha256 = \"e9651471a32e87d96ef3a127715382b2d11cc7c8bb9822ded8a7cc94072eb0a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wl-clipboard-rs/0.9.3/download\"],\n strip_prefix = \"wl-clipboard-rs-0.9.3\",\n build_file = Label(\"@crates//crates:BUILD.wl-clipboard-rs-0.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__write16-1.0.0\",\n sha256 = \"d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/write16/1.0.0/download\"],\n strip_prefix = \"write16-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.write16-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__writeable-0.6.3\",\n sha256 = \"1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/writeable/0.6.3/download\"],\n strip_prefix = \"writeable-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.writeable-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wyz-0.5.1\",\n sha256 = \"05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wyz/0.5.1/download\"],\n strip_prefix = \"wyz-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.wyz-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__x11rb-0.13.2\",\n sha256 = \"9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/x11rb/0.13.2/download\"],\n strip_prefix = \"x11rb-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.x11rb-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__x11rb-protocol-0.13.2\",\n sha256 = \"ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/x11rb-protocol/0.13.2/download\"],\n strip_prefix = \"x11rb-protocol-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.x11rb-protocol-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__x25519-dalek-2.0.1\",\n sha256 = \"c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/x25519-dalek/2.0.1/download\"],\n strip_prefix = \"x25519-dalek-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.x25519-dalek-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__x509-parser-0.16.0\",\n sha256 = \"fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/x509-parser/0.16.0/download\"],\n strip_prefix = \"x509-parser-0.16.0\",\n build_file = Label(\"@crates//crates:BUILD.x509-parser-0.16.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xattr-1.6.1\",\n sha256 = \"32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xattr/1.6.1/download\"],\n strip_prefix = \"xattr-1.6.1\",\n build_file = Label(\"@crates//crates:BUILD.xattr-1.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xcap-0.9.6\",\n sha256 = \"b6ad471d5ba232bc276382d26a9d3b837d6853b7df389058b5bb1e94dcdd248c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xcap/0.9.6/download\"],\n strip_prefix = \"xcap-0.9.6\",\n build_file = Label(\"@crates//crates:BUILD.xcap-0.9.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xcb-1.7.0\",\n sha256 = \"ee4c580d8205abb0a5cf4eb7e927bd664e425b6c3263f9c5310583da96970cf6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xcb/1.7.0/download\"],\n strip_prefix = \"xcb-1.7.0\",\n build_file = Label(\"@crates//crates:BUILD.xcb-1.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xkbcommon-0.9.0\",\n sha256 = \"a7a974f48060a14e95705c01f24ad9c3345022f4d97441b8a36beb7ed5c4a02d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xkbcommon/0.9.0/download\"],\n strip_prefix = \"xkbcommon-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.xkbcommon-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xkeysym-0.2.1\",\n sha256 = \"b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xkeysym/0.2.1/download\"],\n strip_prefix = \"xkeysym-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.xkeysym-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xml-rs-0.8.29\",\n sha256 = \"e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xml-rs/0.8.29/download\"],\n strip_prefix = \"xml-rs-0.8.29\",\n build_file = Label(\"@crates//crates:BUILD.xml-rs-0.8.29.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xxhash-rust-0.8.18\",\n sha256 = \"aee1b19627c7c60102ab80d3a9cbe18de90bfe03bfa6c3715447681f0e8c8af6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xxhash-rust/0.8.18/download\"],\n strip_prefix = \"xxhash-rust-0.8.18\",\n build_file = Label(\"@crates//crates:BUILD.xxhash-rust-0.8.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yaml-rust-0.4.5\",\n sha256 = \"56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yaml-rust/0.4.5/download\"],\n strip_prefix = \"yaml-rust-0.4.5\",\n build_file = Label(\"@crates//crates:BUILD.yaml-rust-0.4.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yansi-1.0.1\",\n sha256 = \"cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yansi/1.0.1/download\"],\n strip_prefix = \"yansi-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.yansi-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yasna-0.5.2\",\n sha256 = \"e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yasna/0.5.2/download\"],\n strip_prefix = \"yasna-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.yasna-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-0.8.3\",\n sha256 = \"709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke/0.8.3/download\"],\n strip_prefix = \"yoke-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.yoke-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-derive-0.8.2\",\n sha256 = \"de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke-derive/0.8.2/download\"],\n strip_prefix = \"yoke-derive-0.8.2\",\n build_file = Label(\"@crates//crates:BUILD.yoke-derive-0.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__z85-3.0.7\",\n sha256 = \"c6e61e59a957b7ccee15d2049f86e8bfd6f66968fcd88f018950662d9b86e675\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/z85/3.0.7/download\"],\n strip_prefix = \"z85-3.0.7\",\n build_file = Label(\"@crates//crates:BUILD.z85-3.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus-5.18.0\",\n sha256 = \"fe18fb60dc696039e738717b76eaea21e7a4489bbb1885020b43c94236d7e98a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus/5.18.0/download\"],\n strip_prefix = \"zbus-5.18.0\",\n build_file = Label(\"@crates//crates:BUILD.zbus-5.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus-lockstep-0.5.2\",\n sha256 = \"6998de05217a084b7578728a9443d04ea4cd80f2a0839b8d78770b76ccd45863\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus-lockstep/0.5.2/download\"],\n strip_prefix = \"zbus-lockstep-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.zbus-lockstep-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus-lockstep-macros-0.5.2\",\n sha256 = \"10da05367f3a7b7553c8cdf8fa91aee6b64afebe32b51c95177957efc47ca3a0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus-lockstep-macros/0.5.2/download\"],\n strip_prefix = \"zbus-lockstep-macros-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.zbus-lockstep-macros-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus_macros-5.18.0\",\n sha256 = \"fe96480bed92df2b442a1a30df364e12d08eed03aeb061f2b8dc6afb2be91119\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus_macros/5.18.0/download\"],\n strip_prefix = \"zbus_macros-5.18.0\",\n build_file = Label(\"@crates//crates:BUILD.zbus_macros-5.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus_names-4.3.4\",\n sha256 = \"d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus_names/4.3.4/download\"],\n strip_prefix = \"zbus_names-4.3.4\",\n build_file = Label(\"@crates//crates:BUILD.zbus_names-4.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus_xml-5.2.1\",\n sha256 = \"d1586c021a01ca0a9216dcd874e546382e156a5cbab5fab6cb5f10087e22682a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus_xml/5.2.1/download\"],\n strip_prefix = \"zbus_xml-5.2.1\",\n build_file = Label(\"@crates//crates:BUILD.zbus_xml-5.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-0.8.56\",\n sha256 = \"556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy/0.8.56/download\"],\n strip_prefix = \"zerocopy-0.8.56\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-0.8.56.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-derive-0.8.56\",\n sha256 = \"f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy-derive/0.8.56/download\"],\n strip_prefix = \"zerocopy-derive-0.8.56\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-derive-0.8.56.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-0.1.8\",\n sha256 = \"0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom/0.1.8/download\"],\n strip_prefix = \"zerofrom-0.1.8\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-0.1.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-derive-0.1.7\",\n sha256 = \"11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom-derive/0.1.7/download\"],\n strip_prefix = \"zerofrom-derive-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-derive-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zeroize-1.9.0\",\n sha256 = \"e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zeroize/1.9.0/download\"],\n strip_prefix = \"zeroize-1.9.0\",\n build_file = Label(\"@crates//crates:BUILD.zeroize-1.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zeroize_derive-1.5.0\",\n sha256 = \"3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zeroize_derive/1.5.0/download\"],\n strip_prefix = \"zeroize_derive-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.zeroize_derive-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerotrie-0.2.4\",\n sha256 = \"0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerotrie/0.2.4/download\"],\n strip_prefix = \"zerotrie-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.zerotrie-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-0.11.6\",\n sha256 = \"90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec/0.11.6/download\"],\n strip_prefix = \"zerovec-0.11.6\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-0.11.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-derive-0.11.3\",\n sha256 = \"625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec-derive/0.11.3/download\"],\n strip_prefix = \"zerovec-derive-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-derive-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zmij-1.0.23\",\n sha256 = \"29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zmij/1.0.23/download\"],\n strip_prefix = \"zmij-1.0.23\",\n build_file = Label(\"@crates//crates:BUILD.zmij-1.0.23.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zune-core-0.5.3\",\n sha256 = \"d56377fd46368984a170bc5aac5567e52ca5da874caa60bea39fcbca78fb658b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zune-core/0.5.3/download\"],\n strip_prefix = \"zune-core-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.zune-core-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zune-jpeg-0.5.15\",\n sha256 = \"27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zune-jpeg/0.5.15/download\"],\n strip_prefix = \"zune-jpeg-0.5.15\",\n build_file = Label(\"@crates//crates:BUILD.zune-jpeg-0.5.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zvariant-5.13.1\",\n sha256 = \"bee2a0bcd2a907786a456fff45aaaaf54c9ba5f50b71ae9ec1a4edd200c94911\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zvariant/5.13.1/download\"],\n strip_prefix = \"zvariant-5.13.1\",\n build_file = Label(\"@crates//crates:BUILD.zvariant-5.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zvariant_derive-5.13.1\",\n sha256 = \"38a708216a18780796770bfe3f4739c7c83a3e8f789b755534bbbc06e4e23e12\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zvariant_derive/5.13.1/download\"],\n strip_prefix = \"zvariant_derive-5.13.1\",\n build_file = Label(\"@crates//crates:BUILD.zvariant_derive-5.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zvariant_utils-3.5.0\",\n sha256 = \"90cb9383f9b45290407a1258b202d3f8f01db719eb60b4e4055c6375af4fc7c7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zvariant_utils/3.5.0/download\"],\n strip_prefix = \"zvariant_utils-3.5.0\",\n build_file = Label(\"@crates//crates:BUILD.zvariant_utils-3.5.0.bazel\"),\n )\n\n return [\n struct(repo = \"crates\", is_dev_dep = False),\n struct(repo=\"crates__ansi-width-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__anyhow-1.0.104\", is_dev_dep = False),\n struct(repo=\"crates__arboard-3.6.1\", is_dev_dep = False),\n struct(repo=\"crates__argmax-0.3.1\", is_dev_dep = False),\n struct(repo=\"crates__ashpd-0.11.1\", is_dev_dep = False),\n struct(repo=\"crates__ast-grep-core-0.39.9\", is_dev_dep = False),\n struct(repo=\"crates__async-recursion-1.1.1\", is_dev_dep = False),\n struct(repo=\"crates__async-trait-0.1.91\", is_dev_dep = False),\n struct(repo=\"crates__atspi-0.30.0\", is_dev_dep = False),\n struct(repo=\"crates__audiopus_sys-0.2.2\", is_dev_dep = False),\n struct(repo=\"crates__base64-0.22.1\", is_dev_dep = False),\n struct(repo=\"crates__bigdecimal-0.4.10\", is_dev_dep = False),\n struct(repo=\"crates__binary-heap-plus-0.5.0\", is_dev_dep = False),\n struct(repo=\"crates__bon-3.9.3\", is_dev_dep = False),\n struct(repo=\"crates__brush-parser-0.3.0\", is_dev_dep = False),\n struct(repo=\"crates__brush-parser-0.4.0\", is_dev_dep = False),\n struct(repo=\"crates__bstr-1.13.0\", is_dev_dep = False),\n struct(repo=\"crates__bytecount-0.6.9\", is_dev_dep = False),\n struct(repo=\"crates__bytes-1.12.1\", is_dev_dep = False),\n struct(repo=\"crates__cached-0.59.0\", is_dev_dep = False),\n struct(repo=\"crates__cfg-if-1.0.4\", is_dev_dep = False),\n struct(repo=\"crates__check_elevation-0.2.7\", is_dev_dep = False),\n struct(repo=\"crates__chrono-0.4.45\", is_dev_dep = False),\n struct(repo=\"crates__clap-4.6.6\", is_dev_dep = False),\n struct(repo=\"crates__clipboard-win-5.4.1\", is_dev_dep = False),\n struct(repo=\"crates__codesnake-0.2.1\", is_dev_dep = False),\n struct(repo=\"crates__color-print-0.3.7\", is_dev_dep = False),\n struct(repo=\"crates__command-fds-0.3.3\", is_dev_dep = False),\n struct(repo=\"crates__compare-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__core-graphics-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__dashmap-6.2.1\", is_dev_dep = False),\n struct(repo=\"crates__dns-lookup-3.0.1\", is_dev_dep = False),\n struct(repo=\"crates__enigo-0.6.1\", is_dev_dep = False),\n struct(repo=\"crates__faccess-0.2.4\", is_dev_dep = False),\n struct(repo=\"crates__fancy-regex-0.17.0\", is_dev_dep = False),\n struct(repo=\"crates__filetime-0.2.29\", is_dev_dep = False),\n struct(repo=\"crates__flume-0.11.1\", is_dev_dep = False),\n struct(repo=\"crates__foldhash-0.2.0\", is_dev_dep = False),\n struct(repo=\"crates__fontdue-0.9.4\", is_dev_dep = False),\n struct(repo=\"crates__foreign-types-0.5.0\", is_dev_dep = False),\n struct(repo=\"crates__fs_extra-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__futures-0.3.33\", is_dev_dep = False),\n struct(repo=\"crates__getrandom-0.4.3\", is_dev_dep = False),\n struct(repo=\"crates__glob-0.3.4\", is_dev_dep = False),\n struct(repo=\"crates__globset-0.4.20\", is_dev_dep = False),\n struct(repo=\"crates__grep-cli-0.1.12\", is_dev_dep = False),\n struct(repo=\"crates__grep-matcher-0.1.9\", is_dev_dep = False),\n struct(repo=\"crates__grep-pcre2-0.1.10\", is_dev_dep = False),\n struct(repo=\"crates__grep-printer-0.3.1\", is_dev_dep = False),\n struct(repo=\"crates__grep-regex-0.1.14\", is_dev_dep = False),\n struct(repo=\"crates__grep-searcher-0.1.17\", is_dev_dep = False),\n struct(repo=\"crates__hex-0.4.3\", is_dev_dep = False),\n struct(repo=\"crates__hifijson-0.2.3\", is_dev_dep = False),\n struct(repo=\"crates__hostname-0.4.2\", is_dev_dep = False),\n struct(repo=\"crates__html-to-markdown-rs-3.10.6\", is_dev_dep = False),\n struct(repo=\"crates__icy_sixel-0.5.0\", is_dev_dep = False),\n struct(repo=\"crates__ignore-0.4.33\", is_dev_dep = False),\n struct(repo=\"crates__image-0.25.10\", is_dev_dep = False),\n struct(repo=\"crates__indicatif-0.18.6\", is_dev_dep = False),\n struct(repo=\"crates__inferno-0.12.8\", is_dev_dep = False),\n struct(repo=\"crates__inherent-1.0.14\", is_dev_dep = False),\n struct(repo=\"crates__itertools-0.14.0\", is_dev_dep = False),\n struct(repo=\"crates__jaq-core-2.2.1\", is_dev_dep = False),\n struct(repo=\"crates__jaq-json-1.1.3\", is_dev_dep = False),\n struct(repo=\"crates__jaq-std-2.1.2\", is_dev_dep = False),\n struct(repo=\"crates__jiff-0.2.35\", is_dev_dep = False),\n struct(repo=\"crates__libc-0.2.189\", is_dev_dep = False),\n struct(repo=\"crates__lscolors-0.21.0\", is_dev_dep = False),\n struct(repo=\"crates__memchr-2.8.3\", is_dev_dep = False),\n struct(repo=\"crates__memmap2-0.9.11\", is_dev_dep = False),\n struct(repo=\"crates__napi-3.12.0\", is_dev_dep = False),\n struct(repo=\"crates__napi-build-2.4.0\", is_dev_dep = False),\n struct(repo=\"crates__napi-derive-3.6.2\", is_dev_dep = False),\n struct(repo=\"crates__nix-0.31.3\", is_dev_dep = False),\n struct(repo=\"crates__nom-8.0.0\", is_dev_dep = False),\n struct(repo=\"crates__normalize-path-0.2.1\", is_dev_dep = False),\n struct(repo=\"crates__notify-8.2.0\", is_dev_dep = False),\n struct(repo=\"crates__num-bigint-0.4.8\", is_dev_dep = False),\n struct(repo=\"crates__num-traits-0.2.19\", is_dev_dep = False),\n struct(repo=\"crates__objc2-app-kit-0.3.2\", is_dev_dep = False),\n struct(repo=\"crates__objc2-application-services-0.3.2\", is_dev_dep = False),\n struct(repo=\"crates__objc2-core-foundation-0.3.2\", is_dev_dep = False),\n struct(repo=\"crates__objc2-core-graphics-0.3.2\", is_dev_dep = False),\n struct(repo=\"crates__objc2-foundation-0.3.2\", is_dev_dep = False),\n struct(repo=\"crates__onig-6.5.3\", is_dev_dep = False),\n struct(repo=\"crates__opus-0.3.1\", is_dev_dep = False),\n struct(repo=\"crates__os_display-0.1.4\", is_dev_dep = False),\n struct(repo=\"crates__os_pipe-1.2.3\", is_dev_dep = False),\n struct(repo=\"crates__parking_lot-0.12.5\", is_dev_dep = False),\n struct(repo=\"crates__parse_datetime-0.14.0\", is_dev_dep = False),\n struct(repo=\"crates__phf-0.13.1\", is_dev_dep = False),\n struct(repo=\"crates__platform-info-2.1.0\", is_dev_dep = False),\n struct(repo=\"crates__png-0.18.1\", is_dev_dep = False),\n struct(repo=\"crates__portable-pty-0.9.0\", is_dev_dep = False),\n struct(repo=\"crates__procfs-0.18.0\", is_dev_dep = False),\n struct(repo=\"crates__rand-0.10.2\", is_dev_dep = False),\n struct(repo=\"crates__rayon-1.12.0\", is_dev_dep = False),\n struct(repo=\"crates__regex-1.13.1\", is_dev_dep = False),\n struct(repo=\"crates__reis-0.5.0\", is_dev_dep = False),\n struct(repo=\"crates__rlimit-0.11.0\", is_dev_dep = False),\n struct(repo=\"crates__rpds-1.2.1\", is_dev_dep = False),\n struct(repo=\"crates__rustc-hash-2.1.3\", is_dev_dep = False),\n struct(repo=\"crates__rustix-1.1.4\", is_dev_dep = False),\n struct(repo=\"crates__self_cell-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__serde-1.0.229\", is_dev_dep = False),\n struct(repo=\"crates__serde_json-1.0.151\", is_dev_dep = False),\n struct(repo=\"crates__similar-3.1.2\", is_dev_dep = False),\n struct(repo=\"crates__smallvec-1.15.2\", is_dev_dep = False),\n struct(repo=\"crates__strum-0.28.0\", is_dev_dep = False),\n struct(repo=\"crates__strum_macros-0.28.0\", is_dev_dep = False),\n struct(repo=\"crates__syntect-5.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tempfile-3.27.0\", is_dev_dep = False),\n struct(repo=\"crates__terminfo-0.9.0\", is_dev_dep = False),\n struct(repo=\"crates__thiserror-2.0.19\", is_dev_dep = False),\n struct(repo=\"crates__tiktoken-rs-0.11.0\", is_dev_dep = False),\n struct(repo=\"crates__tokio-1.53.1\", is_dev_dep = False),\n struct(repo=\"crates__tokio-util-0.7.19\", is_dev_dep = False),\n struct(repo=\"crates__toml-1.1.4-spec-1.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tracing-0.1.44\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-0.25.10\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-astro-next-0.1.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-bash-0.25.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-c-0.24.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-c-sharp-0.23.5\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-clojure-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-cmake-0.7.4\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-cpp-0.23.4\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-css-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-dart-0.2.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-diff-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-dockerfile-updated-0.2.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-elisp-1.7.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-elixir-0.3.5\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-erlang-0.16.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-fortran-0.6.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-go-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-graphql-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-haskell-0.23.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-hcl-1.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-html-0.23.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-ini-1.4.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-java-0.23.5\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-javascript-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-json-0.24.8\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-julia-0.23.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-just-0.2.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-kotlin-sg-0.4.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-lua-0.5.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-make-1.1.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-md-0.5.3\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-nix-0.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-objc-3.0.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-ocaml-0.24.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-odin-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-php-0.24.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-powershell-0.26.4\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-proto-0.4.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-python-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-r-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-regex-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-ruby-0.23.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-rust-0.24.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-scala-0.26.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-sequel-0.3.11\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-solidity-1.2.13\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-starlark-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-svelte-next-0.1.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-swift-0.7.3\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-tlaplus-1.5.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-toml-ng-0.7.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-typescript-0.23.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-verilog-1.0.3\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-vue-next-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-xml-0.7.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-yaml-0.7.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-zig-1.1.2\", is_dev_dep = False),\n struct(repo=\"crates__uiautomation-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__unicode-segmentation-1.13.3\", is_dev_dep = False),\n struct(repo=\"crates__unicode-width-0.2.2\", is_dev_dep = False),\n struct(repo=\"crates__uucore-0.8.0\", is_dev_dep = False),\n struct(repo=\"crates__uuid-1.24.0\", is_dev_dep = False),\n struct(repo=\"crates__uutils_term_grid-0.8.0\", is_dev_dep = False),\n struct(repo=\"crates__uzers-0.12.2\", is_dev_dep = False),\n struct(repo=\"crates__webrtc-0.17.2\", is_dev_dep = False),\n struct(repo=\"crates__whoami-2.1.2\", is_dev_dep = False),\n struct(repo=\"crates__windows-sys-0.59.0\", is_dev_dep = False),\n struct(repo=\"crates__windows-sys-0.61.2\", is_dev_dep = False),\n struct(repo=\"crates__winreg-0.56.0\", is_dev_dep = False),\n struct(repo=\"crates__x11rb-0.13.2\", is_dev_dep = False),\n struct(repo=\"crates__xcap-0.9.6\", is_dev_dep = False),\n struct(repo=\"crates__xkeysym-0.2.1\", is_dev_dep = False),\n struct(repo=\"crates__xxhash-rust-0.8.18\", is_dev_dep = False),\n struct(repo=\"crates__yansi-1.0.1\", is_dev_dep = False),\n struct(repo=\"crates__zune-jpeg-0.5.15\", is_dev_dep = False),\n struct(repo = \"crates__pretty_assertions-1.4.1\", is_dev_dep = True),\n ]\n", "defs.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\"\"\"Deprecated: re-exports the crate_universe macros from `:crates.bzl`.\"\"\"\n\nload(\n \":crates.bzl\",\n _aliases = \"aliases\",\n _all_crate_deps = \"all_crate_deps\",\n _crate_deps = \"crate_deps\",\n _crate_edition = \"crate_edition\",\n _crate_repositories = \"crate_repositories\",\n)\n\naliases = _aliases\nall_crate_deps = _all_crate_deps\ncrate_deps = _crate_deps\ncrate_edition = _crate_edition\ncrate_repositories = _crate_repositories\n", "ansi-width-0.1.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"ansi-width-0.1.0\",\n actual = \"@crates__ansi-width-0.1.0//:ansi_width\",\n tags = [\"manual\"],\n)\n", "ansi-width/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"ansi-width\",\n actual = \"@crates__ansi-width-0.1.0//:ansi_width\",\n tags = [\"manual\"],\n)\n", @@ -593,8 +543,6 @@ "audiopus_sys/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"audiopus_sys\",\n actual = \"@crates__audiopus_sys-0.2.2//:audiopus_sys\",\n tags = [\"manual\"],\n)\n", "base64-0.22.1/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"base64-0.22.1\",\n actual = \"@crates__base64-0.22.1//:base64\",\n tags = [\"manual\"],\n)\n", "base64/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"base64\",\n actual = \"@crates__base64-0.22.1//:base64\",\n tags = [\"manual\"],\n)\n", - "base64-simd-0.8.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"base64-simd-0.8.0\",\n actual = \"@crates__base64-simd-0.8.0//:base64_simd\",\n tags = [\"manual\"],\n)\n", - "base64-simd/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"base64-simd\",\n actual = \"@crates__base64-simd-0.8.0//:base64_simd\",\n tags = [\"manual\"],\n)\n", "bigdecimal-0.4.10/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"bigdecimal-0.4.10\",\n actual = \"@crates__bigdecimal-0.4.10//:bigdecimal\",\n tags = [\"manual\"],\n)\n", "bigdecimal/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"bigdecimal\",\n actual = \"@crates__bigdecimal-0.4.10//:bigdecimal\",\n tags = [\"manual\"],\n)\n", "binary-heap-plus-0.5.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"binary-heap-plus-0.5.0\",\n actual = \"@crates__binary-heap-plus-0.5.0//:binary_heap_plus\",\n tags = [\"manual\"],\n)\n", @@ -640,7 +588,7 @@ "faccess-0.2.4/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"faccess-0.2.4\",\n actual = \"@crates__faccess-0.2.4//:faccess\",\n tags = [\"manual\"],\n)\n", "faccess/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"faccess\",\n actual = \"@crates__faccess-0.2.4//:faccess\",\n tags = [\"manual\"],\n)\n", "fancy-regex-0.17.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"fancy-regex-0.17.0\",\n actual = \"@crates__fancy-regex-0.17.0//:fancy_regex\",\n tags = [\"manual\"],\n)\n", - "fancy-regex-0.18.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"fancy-regex-0.18.0\",\n actual = \"@crates__fancy-regex-0.18.0//:fancy_regex\",\n tags = [\"manual\"],\n)\n", + "fancy-regex/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"fancy-regex\",\n actual = \"@crates__fancy-regex-0.17.0//:fancy_regex\",\n tags = [\"manual\"],\n)\n", "filetime-0.2.29/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"filetime-0.2.29\",\n actual = \"@crates__filetime-0.2.29//:filetime\",\n tags = [\"manual\"],\n)\n", "filetime/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"filetime\",\n actual = \"@crates__filetime-0.2.29//:filetime\",\n tags = [\"manual\"],\n)\n", "flume-0.11.1/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"flume-0.11.1\",\n actual = \"@crates__flume-0.11.1//:flume\",\n tags = [\"manual\"],\n)\n", @@ -717,8 +665,8 @@ "napi-build/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"napi-build\",\n actual = \"@crates__napi-build-2.4.0//:napi_build\",\n tags = [\"manual\"],\n)\n", "napi-derive-3.6.2/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"napi-derive-3.6.2\",\n actual = \"@crates__napi-derive-3.6.2//:napi_derive\",\n tags = [\"manual\"],\n)\n", "napi-derive/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"napi-derive\",\n actual = \"@crates__napi-derive-3.6.2//:napi_derive\",\n tags = [\"manual\"],\n)\n", - "nix-0.29.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"nix-0.29.0\",\n actual = \"@crates__nix-0.29.0//:nix\",\n tags = [\"manual\"],\n)\n", "nix-0.31.3/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"nix-0.31.3\",\n actual = \"@crates__nix-0.31.3//:nix\",\n tags = [\"manual\"],\n)\n", + "nix/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"nix\",\n actual = \"@crates__nix-0.31.3//:nix\",\n tags = [\"manual\"],\n)\n", "nom-8.0.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"nom-8.0.0\",\n actual = \"@crates__nom-8.0.0//:nom\",\n tags = [\"manual\"],\n)\n", "nom/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"nom\",\n actual = \"@crates__nom-8.0.0//:nom\",\n tags = [\"manual\"],\n)\n", "normalize-path-0.2.1/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"normalize-path-0.2.1\",\n actual = \"@crates__normalize-path-0.2.1//:normalize_path\",\n tags = [\"manual\"],\n)\n", @@ -777,8 +725,6 @@ "rlimit/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"rlimit\",\n actual = \"@crates__rlimit-0.11.0//:rlimit\",\n tags = [\"manual\"],\n)\n", "rpds-1.2.1/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"rpds-1.2.1\",\n actual = \"@crates__rpds-1.2.1//:rpds\",\n tags = [\"manual\"],\n)\n", "rpds/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"rpds\",\n actual = \"@crates__rpds-1.2.1//:rpds\",\n tags = [\"manual\"],\n)\n", - "rstest-0.26.1/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"rstest-0.26.1\",\n actual = \"@crates__rstest-0.26.1//:rstest\",\n tags = [\"manual\"],\n)\n", - "rstest/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"rstest\",\n actual = \"@crates__rstest-0.26.1//:rstest\",\n tags = [\"manual\"],\n)\n", "rustc-hash-2.1.3/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"rustc-hash-2.1.3\",\n actual = \"@crates__rustc-hash-2.1.3//:rustc_hash\",\n tags = [\"manual\"],\n)\n", "rustc-hash/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"rustc-hash\",\n actual = \"@crates__rustc-hash-2.1.3//:rustc_hash\",\n tags = [\"manual\"],\n)\n", "rustix-1.1.4/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"rustix-1.1.4\",\n actual = \"@crates__rustix-1.1.4//:rustix\",\n tags = [\"manual\"],\n)\n", @@ -939,11 +885,10 @@ "uiautomation/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"uiautomation\",\n actual = \"@crates__uiautomation-0.25.0//:uiautomation\",\n tags = [\"manual\"],\n)\n", "unicode-segmentation-1.13.3/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"unicode-segmentation-1.13.3\",\n actual = \"@crates__unicode-segmentation-1.13.3//:unicode_segmentation\",\n tags = [\"manual\"],\n)\n", "unicode-segmentation/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"unicode-segmentation\",\n actual = \"@crates__unicode-segmentation-1.13.3//:unicode_segmentation\",\n tags = [\"manual\"],\n)\n", - "unicode-width-0.1.14/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"unicode-width-0.1.14\",\n actual = \"@crates__unicode-width-0.1.14//:unicode_width\",\n tags = [\"manual\"],\n)\n", "unicode-width-0.2.2/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"unicode-width-0.2.2\",\n actual = \"@crates__unicode-width-0.2.2//:unicode_width\",\n tags = [\"manual\"],\n)\n", - "uucore-0.0.30/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"uucore-0.0.30\",\n actual = \"@crates__uucore-0.0.30//:uucore\",\n tags = [\"manual\"],\n)\n", + "unicode-width/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"unicode-width\",\n actual = \"@crates__unicode-width-0.2.2//:unicode_width\",\n tags = [\"manual\"],\n)\n", "uucore-0.8.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"uucore-0.8.0\",\n actual = \"@crates__uucore-0.8.0//:uucore\",\n tags = [\"manual\"],\n)\n", - "uucore-0.9.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"uucore-0.9.0\",\n actual = \"@crates__uucore-0.9.0//:uucore\",\n tags = [\"manual\"],\n)\n", + "uucore/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"uucore\",\n actual = \"@crates__uucore-0.8.0//:uucore\",\n tags = [\"manual\"],\n)\n", "uuid-1.24.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"uuid-1.24.0\",\n actual = \"@crates__uuid-1.24.0//:uuid\",\n tags = [\"manual\"],\n)\n", "uuid/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"uuid\",\n actual = \"@crates__uuid-1.24.0//:uuid\",\n tags = [\"manual\"],\n)\n", "uutils_term_grid-0.8.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"uutils_term_grid-0.8.0\",\n actual = \"@crates__uutils_term_grid-0.8.0//:term_grid\",\n tags = [\"manual\"],\n)\n", @@ -2279,19 +2224,6 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"chrono\",\n deps = [\n \"@crates__num-traits-0.2.19//:num_traits\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"@crates__iana-time-zone-0.1.65//:iana_time_zone\", # aarch64-apple-darwin\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"@crates__iana-time-zone-0.1.65//:iana_time_zone\", # aarch64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"@crates__iana-time-zone-0.1.65//:iana_time_zone\", # aarch64-unknown-linux-musl\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"@crates__iana-time-zone-0.1.65//:iana_time_zone\", # x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [\n \"@crates__windows-link-0.2.1//:windows_link\", # x86_64-pc-windows-msvc\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"@crates__iana-time-zone-0.1.65//:iana_time_zone\", # x86_64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"@crates__iana-time-zone-0.1.65//:iana_time_zone\", # x86_64-unknown-linux-musl\n ],\n \"//conditions:default\": [],\n }),\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"alloc\",\n \"clock\",\n \"default\",\n \"iana-time-zone\",\n \"js-sys\",\n \"now\",\n \"oldtime\",\n \"std\",\n \"wasm-bindgen\",\n \"wasmbind\",\n \"winapi\",\n \"windows-link\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=chrono\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.4.45\",\n)\n" } }, - "crates__chrono-tz-0.10.4": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "remote_patch_strip": 1, - "sha256": "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/chrono-tz/0.10.4/download" - ], - "strip_prefix": "chrono-tz-0.10.4", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"chrono_tz\",\n deps = [\n \"@crates__chrono-0.4.45//:chrono\",\n \"@crates__chrono-tz-0.10.4//:build_script_build\",\n \"@crates__phf-0.12.1//:phf\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=chrono-tz\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.10.4\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"std\",\n ],\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n emit_warnings = False,\n edition = \"2021\",\n pkg_name = \"chrono-tz\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=chrono-tz\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.10.4\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" - } - }, "crates__cipher-0.4.4": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -3553,19 +3485,6 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"fancy_regex\",\n deps = [\n \"@crates__bit-set-0.8.0//:bit_set\",\n \"@crates__regex-automata-0.4.18//:regex_automata\",\n \"@crates__regex-syntax-0.8.11//:regex_syntax\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"perf\",\n \"std\",\n \"unicode\",\n \"variable-lookbehinds\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=fancy-regex\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.17.0\",\n)\n" } }, - "crates__fancy-regex-0.18.0": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "remote_patch_strip": 1, - "sha256": "e1e1dacd0d2082dfcf1351c4bdd566bbe89a2b263235a2b50058f1e130a47277", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/fancy-regex/0.18.0/download" - ], - "strip_prefix": "fancy-regex-0.18.0", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"fancy_regex\",\n deps = [\n \"@crates__bit-set-0.8.0//:bit_set\",\n \"@crates__regex-automata-0.4.18//:regex_automata\",\n \"@crates__regex-syntax-0.8.11//:regex_syntax\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"perf\",\n \"std\",\n \"unicode\",\n \"variable-lookbehinds\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=fancy-regex\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.18.0\",\n)\n" - } - }, "crates__fastrand-2.5.0": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -4034,19 +3953,6 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"futures_task\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"alloc\",\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=futures-task\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.3.33\",\n)\n" } }, - "crates__futures-timer-3.0.4": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "remote_patch_strip": 1, - "sha256": "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/futures-timer/3.0.4/download" - ], - "strip_prefix": "futures-timer-3.0.4", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"futures_timer\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=futures-timer\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"3.0.4\",\n)\n" - } - }, "crates__futures-util-0.3.33": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -4538,7 +4444,7 @@ "https://static.crates.io/crates/iana-time-zone/0.1.65/download" ], "strip_prefix": "iana-time-zone-0.1.65", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"iana_time_zone\",\n deps = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"@crates__core-foundation-sys-0.8.7//:core_foundation_sys\", # cfg(target_vendor = \"apple\")\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"@crates__core-foundation-sys-0.8.7//:core_foundation_sys\", # cfg(target_vendor = \"apple\")\n ],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [\n \"@crates__windows-core-0.62.2//:windows_core\", # cfg(target_os = \"windows\")\n ],\n \"//conditions:default\": [],\n }),\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"fallback\", # aarch64-apple-darwin\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"fallback\", # aarch64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"fallback\", # aarch64-unknown-linux-musl\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"fallback\", # x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"fallback\", # x86_64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"fallback\", # x86_64-unknown-linux-musl\n ],\n \"//conditions:default\": [],\n }),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=iana-time-zone\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.1.65\",\n)\n" + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"iana_time_zone\",\n deps = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"@crates__core-foundation-sys-0.8.7//:core_foundation_sys\", # cfg(target_vendor = \"apple\")\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"@crates__core-foundation-sys-0.8.7//:core_foundation_sys\", # cfg(target_vendor = \"apple\")\n ],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [\n \"@crates__windows-core-0.62.2//:windows_core\", # cfg(target_os = \"windows\")\n ],\n \"//conditions:default\": [],\n }),\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"fallback\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=iana-time-zone\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.1.65\",\n)\n" } }, "crates__iana-time-zone-haiku-0.1.2": { @@ -5880,19 +5786,6 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"nix\",\n deps = [\n \"@crates__bitflags-2.13.1//:bitflags\",\n \"@crates__cfg-if-1.0.4//:cfg_if\",\n \"@crates__libc-0.2.189//:libc\",\n \"@crates__nix-0.28.0//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"fs\",\n \"term\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=nix\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.28.0\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"fs\",\n \"term\",\n ],\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n deps = [\n \"@crates__cfg_aliases-0.1.1//:cfg_aliases\",\n ],\n emit_warnings = False,\n edition = \"2021\",\n pkg_name = \"nix\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=nix\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.28.0\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" } }, - "crates__nix-0.29.0": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "remote_patch_strip": 1, - "sha256": "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/nix/0.29.0/download" - ], - "strip_prefix": "nix-0.29.0", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"nix\",\n deps = [\n \"@crates__bitflags-2.13.1//:bitflags\",\n \"@crates__cfg-if-1.0.4//:cfg_if\",\n \"@crates__libc-0.2.189//:libc\",\n \"@crates__nix-0.29.0//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"feature\",\n \"fs\",\n \"user\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"process\", # aarch64-apple-darwin\n \"signal\", # aarch64-apple-darwin\n \"uio\", # aarch64-apple-darwin\n \"zerocopy\", # aarch64-apple-darwin\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"process\", # aarch64-unknown-linux-gnu\n \"signal\", # aarch64-unknown-linux-gnu\n \"uio\", # aarch64-unknown-linux-gnu\n \"zerocopy\", # aarch64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"process\", # aarch64-unknown-linux-musl\n \"signal\", # aarch64-unknown-linux-musl\n \"uio\", # aarch64-unknown-linux-musl\n \"zerocopy\", # aarch64-unknown-linux-musl\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"process\", # x86_64-apple-darwin\n \"signal\", # x86_64-apple-darwin\n \"uio\", # x86_64-apple-darwin\n \"zerocopy\", # x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"process\", # x86_64-unknown-linux-gnu\n \"signal\", # x86_64-unknown-linux-gnu\n \"uio\", # x86_64-unknown-linux-gnu\n \"zerocopy\", # x86_64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"process\", # x86_64-unknown-linux-musl\n \"signal\", # x86_64-unknown-linux-musl\n \"uio\", # x86_64-unknown-linux-musl\n \"zerocopy\", # x86_64-unknown-linux-musl\n ],\n \"//conditions:default\": [],\n }),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=nix\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.29.0\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"feature\",\n \"fs\",\n \"user\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"process\", # aarch64-apple-darwin\n \"signal\", # aarch64-apple-darwin\n \"uio\", # aarch64-apple-darwin\n \"zerocopy\", # aarch64-apple-darwin\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"process\", # aarch64-unknown-linux-gnu\n \"signal\", # aarch64-unknown-linux-gnu\n \"uio\", # aarch64-unknown-linux-gnu\n \"zerocopy\", # aarch64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"process\", # aarch64-unknown-linux-musl\n \"signal\", # aarch64-unknown-linux-musl\n \"uio\", # aarch64-unknown-linux-musl\n \"zerocopy\", # aarch64-unknown-linux-musl\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"process\", # x86_64-apple-darwin\n \"signal\", # x86_64-apple-darwin\n \"uio\", # x86_64-apple-darwin\n \"zerocopy\", # x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"process\", # x86_64-unknown-linux-gnu\n \"signal\", # x86_64-unknown-linux-gnu\n \"uio\", # x86_64-unknown-linux-gnu\n \"zerocopy\", # x86_64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"process\", # x86_64-unknown-linux-musl\n \"signal\", # x86_64-unknown-linux-musl\n \"uio\", # x86_64-unknown-linux-musl\n \"zerocopy\", # x86_64-unknown-linux-musl\n ],\n \"//conditions:default\": [],\n }),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n deps = [\n \"@crates__cfg_aliases-0.2.2//:cfg_aliases\",\n ],\n emit_warnings = False,\n edition = \"2021\",\n pkg_name = \"nix\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=nix\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.29.0\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" - } - }, "crates__nix-0.30.1": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -5981,7 +5874,7 @@ "https://static.crates.io/crates/notify/8.2.0/download" ], "strip_prefix": "notify-8.2.0", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"notify\",\n deps = [\n \"@crates__libc-0.2.189//:libc\",\n \"@crates__log-0.4.33//:log\",\n \"@crates__notify-types-2.1.0//:notify_types\",\n \"@crates__walkdir-2.5.0//:walkdir\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"@crates__bitflags-2.13.1//:bitflags\", # cfg(target_os = \"macos\")\n \"@crates__fsevent-sys-4.1.0//:fsevent_sys\", # aarch64-apple-darwin\n \"@crates__kqueue-1.2.1//:kqueue\", # aarch64-apple-darwin\n \"@crates__mio-1.2.2//:mio\", # aarch64-apple-darwin\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"@crates__inotify-0.11.4//:inotify\", # cfg(any(target_os = \"linux\", target_os = \"android\"))\n \"@crates__mio-1.2.2//:mio\", # aarch64-unknown-linux-gnu, cfg(any(target_os = \"linux\", target_os = \"android\"))\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"@crates__inotify-0.11.4//:inotify\", # cfg(any(target_os = \"linux\", target_os = \"android\"))\n \"@crates__mio-1.2.2//:mio\", # aarch64-unknown-linux-musl, cfg(any(target_os = \"linux\", target_os = \"android\"))\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"@crates__bitflags-2.13.1//:bitflags\", # cfg(target_os = \"macos\")\n \"@crates__fsevent-sys-4.1.0//:fsevent_sys\", # x86_64-apple-darwin\n \"@crates__kqueue-1.2.1//:kqueue\", # x86_64-apple-darwin\n \"@crates__mio-1.2.2//:mio\", # x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [\n \"@crates__windows-sys-0.60.2//:windows_sys\", # cfg(windows)\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"@crates__inotify-0.11.4//:inotify\", # cfg(any(target_os = \"linux\", target_os = \"android\"))\n \"@crates__mio-1.2.2//:mio\", # cfg(any(target_os = \"linux\", target_os = \"android\")), x86_64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"@crates__inotify-0.11.4//:inotify\", # cfg(any(target_os = \"linux\", target_os = \"android\"))\n \"@crates__mio-1.2.2//:mio\", # cfg(any(target_os = \"linux\", target_os = \"android\")), x86_64-unknown-linux-musl\n ],\n \"//conditions:default\": [],\n }),\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"fsevent-sys\",\n \"kqueue\",\n \"macos_fsevent\",\n \"macos_kqueue\",\n \"mio\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=notify\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"8.2.0\",\n)\n" + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"notify\",\n deps = [\n \"@crates__libc-0.2.189//:libc\",\n \"@crates__log-0.4.33//:log\",\n \"@crates__notify-types-2.1.0//:notify_types\",\n \"@crates__walkdir-2.5.0//:walkdir\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"@crates__bitflags-2.13.1//:bitflags\", # cfg(target_os = \"macos\")\n \"@crates__fsevent-sys-4.1.0//:fsevent_sys\", # aarch64-apple-darwin\n \"@crates__kqueue-1.2.1//:kqueue\", # aarch64-apple-darwin\n \"@crates__mio-1.2.2//:mio\", # aarch64-apple-darwin\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"@crates__inotify-0.11.4//:inotify\", # cfg(any(target_os = \"linux\", target_os = \"android\"))\n \"@crates__mio-1.2.2//:mio\", # aarch64-unknown-linux-gnu, cfg(any(target_os = \"linux\", target_os = \"android\"))\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"@crates__inotify-0.11.4//:inotify\", # cfg(any(target_os = \"linux\", target_os = \"android\"))\n \"@crates__mio-1.2.2//:mio\", # aarch64-unknown-linux-musl, cfg(any(target_os = \"linux\", target_os = \"android\"))\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"@crates__bitflags-2.13.1//:bitflags\", # cfg(target_os = \"macos\")\n \"@crates__fsevent-sys-4.1.0//:fsevent_sys\", # x86_64-apple-darwin\n \"@crates__kqueue-1.2.1//:kqueue\", # x86_64-apple-darwin\n \"@crates__mio-1.2.2//:mio\", # x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [\n \"@crates__windows-sys-0.60.2//:windows_sys\", # cfg(windows)\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"@crates__inotify-0.11.4//:inotify\", # cfg(any(target_os = \"linux\", target_os = \"android\"))\n \"@crates__mio-1.2.2//:mio\", # cfg(any(target_os = \"linux\", target_os = \"android\")), x86_64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"@crates__inotify-0.11.4//:inotify\", # cfg(any(target_os = \"linux\", target_os = \"android\"))\n \"@crates__mio-1.2.2//:mio\", # cfg(any(target_os = \"linux\", target_os = \"android\")), x86_64-unknown-linux-musl\n ],\n \"//conditions:default\": [],\n }),\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"fsevent-sys\",\n \"macos_fsevent\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"kqueue\", # aarch64-apple-darwin\n \"macos_kqueue\", # aarch64-apple-darwin\n \"mio\", # aarch64-apple-darwin\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"kqueue\", # aarch64-unknown-linux-gnu\n \"macos_kqueue\", # aarch64-unknown-linux-gnu\n \"mio\", # aarch64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"kqueue\", # aarch64-unknown-linux-musl\n \"macos_kqueue\", # aarch64-unknown-linux-musl\n \"mio\", # aarch64-unknown-linux-musl\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"kqueue\", # x86_64-apple-darwin\n \"macos_kqueue\", # x86_64-apple-darwin\n \"mio\", # x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"kqueue\", # x86_64-unknown-linux-gnu\n \"macos_kqueue\", # x86_64-unknown-linux-gnu\n \"mio\", # x86_64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"kqueue\", # x86_64-unknown-linux-musl\n \"macos_kqueue\", # x86_64-unknown-linux-musl\n \"mio\", # x86_64-unknown-linux-musl\n ],\n \"//conditions:default\": [],\n }),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=notify\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"8.2.0\",\n)\n" } }, "crates__notify-types-2.1.0": { @@ -6075,19 +5968,6 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"num_traits\",\n deps = [\n \"@crates__libm-0.2.16//:libm\",\n \"@crates__num-traits-0.2.19//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"i128\",\n \"libm\",\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=num-traits\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.2.19\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"i128\",\n \"libm\",\n \"std\",\n ],\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n deps = [\n \"@crates__autocfg-1.5.1//:autocfg\",\n ],\n emit_warnings = False,\n edition = \"2021\",\n pkg_name = \"num-traits\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=num-traits\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.2.19\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" } }, - "crates__number_prefix-0.4.0": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "remote_patch_strip": 1, - "sha256": "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/number_prefix/0.4.0/download" - ], - "strip_prefix": "number_prefix-0.4.0", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"number_prefix\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2015\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=number_prefix\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.4.0\",\n)\n" - } - }, "crates__objc2-0.6.4": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -6868,19 +6748,6 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"phf\",\n deps = [\n \"@crates__phf_shared-0.11.3//:phf_shared\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=phf\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.11.3\",\n)\n" } }, - "crates__phf-0.12.1": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "remote_patch_strip": 1, - "sha256": "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/phf/0.12.1/download" - ], - "strip_prefix": "phf-0.12.1", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"phf\",\n deps = [\n \"@crates__phf_shared-0.12.1//:phf_shared\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=phf\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.12.1\",\n)\n" - } - }, "crates__phf-0.13.1": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -7011,19 +6878,6 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"phf_shared\",\n deps = [\n \"@crates__siphasher-1.0.3//:siphasher\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=phf_shared\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.11.3\",\n)\n" } }, - "crates__phf_shared-0.12.1": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "remote_patch_strip": 1, - "sha256": "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/phf_shared/0.12.1/download" - ], - "strip_prefix": "phf_shared-0.12.1", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"phf_shared\",\n deps = [\n \"@crates__siphasher-1.0.3//:siphasher\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=phf_shared\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.12.1\",\n)\n" - } - }, "crates__phf_shared-0.13.1": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -7791,19 +7645,6 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"reis\",\n deps = [\n \"@crates__futures-0.3.33//:futures\",\n \"@crates__rustix-0.38.44//:rustix\",\n \"@crates__tokio-1.53.1//:tokio\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"futures\",\n \"tokio\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=reis\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.5.0\",\n)\n" } }, - "crates__relative-path-1.9.3": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "remote_patch_strip": 1, - "sha256": "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/relative-path/1.9.3/download" - ], - "strip_prefix": "relative-path-1.9.3", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"relative_path\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=relative-path\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.9.3\",\n)\n" - } - }, "crates__rend-0.5.4": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -7908,32 +7749,6 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"rpds\",\n deps = [\n \"@crates__archery-1.2.2//:archery\",\n \"@crates__smallvec-1.15.2//:smallvec\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rpds\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.2.1\",\n)\n" } }, - "crates__rstest-0.26.1": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "remote_patch_strip": 1, - "sha256": "f5a3193c063baaa2a95a33f03035c8a72b83d97a54916055ba22d35ed3839d49", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rstest/0.26.1/download" - ], - "strip_prefix": "rstest-0.26.1", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"rstest\",\n deps = [\n \"@crates__futures-timer-3.0.4//:futures_timer\",\n \"@crates__futures-util-0.3.33//:futures_util\",\n ],\n proc_macro_deps = [\n \"@crates__rstest_macros-0.26.1//:rstest_macros\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"async-timeout\",\n \"crate-name\",\n \"default\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rstest\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.26.1\",\n)\n" - } - }, - "crates__rstest_macros-0.26.1": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "remote_patch_strip": 1, - "sha256": "9c845311f0ff7951c5506121a9ad75aec44d083c31583b2ea5a30bcb0b0abba0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rstest_macros/0.26.1/download" - ], - "strip_prefix": "rstest_macros-0.26.1", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"rstest_macros\",\n deps = [\n \"@crates__cfg-if-1.0.4//:cfg_if\",\n \"@crates__glob-0.3.4//:glob\",\n \"@crates__proc-macro-crate-3.5.0//:proc_macro_crate\",\n \"@crates__proc-macro2-1.0.107//:proc_macro2\",\n \"@crates__quote-1.0.47//:quote\",\n \"@crates__regex-1.13.1//:regex\",\n \"@crates__relative-path-1.9.3//:relative_path\",\n \"@crates__rstest_macros-0.26.1//:build_script_build\",\n \"@crates__syn-2.0.119//:syn\",\n \"@crates__unicode-ident-1.0.24//:unicode_ident\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"async-timeout\",\n \"crate-name\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rstest_macros\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.26.1\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"async-timeout\",\n \"crate-name\",\n ],\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n deps = [\n \"@crates__rustc_version-0.4.1//:rustc_version\",\n ],\n emit_warnings = False,\n edition = \"2021\",\n pkg_name = \"rstest_macros\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rstest_macros\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.26.1\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" - } - }, "crates__rtcp-0.17.2": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -8035,7 +7850,7 @@ "https://static.crates.io/crates/rustix/1.1.4/download" ], "strip_prefix": "rustix-1.1.4", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"rustix\",\n deps = [\n \"@crates__bitflags-2.13.1//:bitflags\",\n \"@crates__rustix-1.1.4//:build_script_build\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"@crates__errno-0.3.14//:errno\", # aarch64-apple-darwin, cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))\n \"@crates__libc-0.2.189//:libc\", # aarch64-apple-darwin, cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"@crates__linux-raw-sys-0.12.1//:linux_raw_sys\", # cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"@crates__linux-raw-sys-0.12.1//:linux_raw_sys\", # cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"@crates__errno-0.3.14//:errno\", # cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))))), x86_64-apple-darwin\n \"@crates__libc-0.2.189//:libc\", # cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))))), x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [\n \"@crates__errno-0.3.14//:errno\", # cfg(windows), x86_64-pc-windows-msvc\n \"@crates__windows-sys-0.61.2//:windows_sys\", # cfg(windows)\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"@crates__linux-raw-sys-0.12.1//:linux_raw_sys\", # cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"@crates__linux-raw-sys-0.12.1//:linux_raw_sys\", # cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))\n ],\n \"//conditions:default\": [],\n }),\n aliases = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": {\n \"@crates__errno-0.3.14//:errno\": \"libc_errno\", # aarch64-apple-darwin, cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))\n },\n \"@@//bazel/triples:x86_64-apple-darwin\": {\n \"@crates__errno-0.3.14//:errno\": \"libc_errno\", # cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))))), x86_64-apple-darwin\n },\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": {\n \"@crates__errno-0.3.14//:errno\": \"libc_errno\", # cfg(windows), x86_64-pc-windows-msvc\n },\n \"//conditions:default\": {},\n }),\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"alloc\",\n \"default\",\n \"fs\",\n \"net\",\n \"param\",\n \"pipe\",\n \"process\",\n \"std\",\n \"use-libc-auxv\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"termios\", # aarch64-apple-darwin\n \"time\", # aarch64-apple-darwin\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"event\", # aarch64-unknown-linux-gnu\n \"system\", # aarch64-unknown-linux-gnu\n \"termios\", # aarch64-unknown-linux-gnu\n \"thread\", # aarch64-unknown-linux-gnu\n \"time\", # aarch64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"event\", # aarch64-unknown-linux-musl\n \"system\", # aarch64-unknown-linux-musl\n \"termios\", # aarch64-unknown-linux-musl\n \"thread\", # aarch64-unknown-linux-musl\n \"time\", # aarch64-unknown-linux-musl\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"termios\", # x86_64-apple-darwin\n \"time\", # x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"event\", # x86_64-unknown-linux-gnu\n \"system\", # x86_64-unknown-linux-gnu\n \"termios\", # x86_64-unknown-linux-gnu\n \"thread\", # x86_64-unknown-linux-gnu\n \"time\", # x86_64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"event\", # x86_64-unknown-linux-musl\n \"system\", # x86_64-unknown-linux-musl\n \"termios\", # x86_64-unknown-linux-musl\n \"thread\", # x86_64-unknown-linux-musl\n \"time\", # x86_64-unknown-linux-musl\n ],\n \"//conditions:default\": [],\n }),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rustix\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.1.4\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"alloc\",\n \"default\",\n \"fs\",\n \"net\",\n \"param\",\n \"pipe\",\n \"process\",\n \"std\",\n \"use-libc-auxv\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"termios\", # aarch64-apple-darwin\n \"time\", # aarch64-apple-darwin\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"event\", # aarch64-unknown-linux-gnu\n \"system\", # aarch64-unknown-linux-gnu\n \"termios\", # aarch64-unknown-linux-gnu\n \"thread\", # aarch64-unknown-linux-gnu\n \"time\", # aarch64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"event\", # aarch64-unknown-linux-musl\n \"system\", # aarch64-unknown-linux-musl\n \"termios\", # aarch64-unknown-linux-musl\n \"thread\", # aarch64-unknown-linux-musl\n \"time\", # aarch64-unknown-linux-musl\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"termios\", # x86_64-apple-darwin\n \"time\", # x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"event\", # x86_64-unknown-linux-gnu\n \"system\", # x86_64-unknown-linux-gnu\n \"termios\", # x86_64-unknown-linux-gnu\n \"thread\", # x86_64-unknown-linux-gnu\n \"time\", # x86_64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"event\", # x86_64-unknown-linux-musl\n \"system\", # x86_64-unknown-linux-musl\n \"termios\", # x86_64-unknown-linux-musl\n \"thread\", # x86_64-unknown-linux-musl\n \"time\", # x86_64-unknown-linux-musl\n ],\n \"//conditions:default\": [],\n }),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n emit_warnings = False,\n edition = \"2021\",\n pkg_name = \"rustix\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rustix\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.1.4\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"rustix\",\n deps = [\n \"@crates__bitflags-2.13.1//:bitflags\",\n \"@crates__rustix-1.1.4//:build_script_build\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"@crates__errno-0.3.14//:errno\", # aarch64-apple-darwin, cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))\n \"@crates__libc-0.2.189//:libc\", # aarch64-apple-darwin, cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"@crates__linux-raw-sys-0.12.1//:linux_raw_sys\", # cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"@crates__linux-raw-sys-0.12.1//:linux_raw_sys\", # cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"@crates__errno-0.3.14//:errno\", # cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))))), x86_64-apple-darwin\n \"@crates__libc-0.2.189//:libc\", # cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))))), x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [\n \"@crates__errno-0.3.14//:errno\", # cfg(windows), x86_64-pc-windows-msvc\n \"@crates__windows-sys-0.61.2//:windows_sys\", # cfg(windows)\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"@crates__linux-raw-sys-0.12.1//:linux_raw_sys\", # cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"@crates__linux-raw-sys-0.12.1//:linux_raw_sys\", # cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))\n ],\n \"//conditions:default\": [],\n }),\n aliases = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": {\n \"@crates__errno-0.3.14//:errno\": \"libc_errno\", # aarch64-apple-darwin, cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))\n },\n \"@@//bazel/triples:x86_64-apple-darwin\": {\n \"@crates__errno-0.3.14//:errno\": \"libc_errno\", # cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_endian = \"little\", any(target_arch = \"s390x\", target_arch = \"powerpc\")), any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc\"), all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"s390x\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))))), x86_64-apple-darwin\n },\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": {\n \"@crates__errno-0.3.14//:errno\": \"libc_errno\", # cfg(windows), x86_64-pc-windows-msvc\n },\n \"//conditions:default\": {},\n }),\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"alloc\",\n \"default\",\n \"fs\",\n \"param\",\n \"pipe\",\n \"process\",\n \"std\",\n \"time\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"termios\", # aarch64-apple-darwin\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"event\", # aarch64-unknown-linux-gnu\n \"net\", # aarch64-unknown-linux-gnu\n \"system\", # aarch64-unknown-linux-gnu\n \"termios\", # aarch64-unknown-linux-gnu\n \"thread\", # aarch64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"event\", # aarch64-unknown-linux-musl\n \"net\", # aarch64-unknown-linux-musl\n \"system\", # aarch64-unknown-linux-musl\n \"termios\", # aarch64-unknown-linux-musl\n \"thread\", # aarch64-unknown-linux-musl\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"termios\", # x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"event\", # x86_64-unknown-linux-gnu\n \"net\", # x86_64-unknown-linux-gnu\n \"system\", # x86_64-unknown-linux-gnu\n \"termios\", # x86_64-unknown-linux-gnu\n \"thread\", # x86_64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"event\", # x86_64-unknown-linux-musl\n \"net\", # x86_64-unknown-linux-musl\n \"system\", # x86_64-unknown-linux-musl\n \"termios\", # x86_64-unknown-linux-musl\n \"thread\", # x86_64-unknown-linux-musl\n ],\n \"//conditions:default\": [],\n }),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rustix\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.1.4\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"alloc\",\n \"default\",\n \"fs\",\n \"param\",\n \"pipe\",\n \"process\",\n \"std\",\n \"time\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"termios\", # aarch64-apple-darwin\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"event\", # aarch64-unknown-linux-gnu\n \"net\", # aarch64-unknown-linux-gnu\n \"system\", # aarch64-unknown-linux-gnu\n \"termios\", # aarch64-unknown-linux-gnu\n \"thread\", # aarch64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"event\", # aarch64-unknown-linux-musl\n \"net\", # aarch64-unknown-linux-musl\n \"system\", # aarch64-unknown-linux-musl\n \"termios\", # aarch64-unknown-linux-musl\n \"thread\", # aarch64-unknown-linux-musl\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"termios\", # x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"event\", # x86_64-unknown-linux-gnu\n \"net\", # x86_64-unknown-linux-gnu\n \"system\", # x86_64-unknown-linux-gnu\n \"termios\", # x86_64-unknown-linux-gnu\n \"thread\", # x86_64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"event\", # x86_64-unknown-linux-musl\n \"net\", # x86_64-unknown-linux-musl\n \"system\", # x86_64-unknown-linux-musl\n \"termios\", # x86_64-unknown-linux-musl\n \"thread\", # x86_64-unknown-linux-musl\n ],\n \"//conditions:default\": [],\n }),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n emit_warnings = False,\n edition = \"2021\",\n pkg_name = \"rustix\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rustix\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.1.4\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" } }, "crates__rustls-0.23.43": { @@ -10313,19 +10128,6 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"utf8parse\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=utf8parse\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.2.2\",\n)\n" } }, - "crates__uucore-0.0.30": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "remote_patch_strip": 1, - "sha256": "71f4e82877d06de779c611a3d54720f56f1e68b228fb30a5b6c66ef07e68263d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/uucore/0.0.30/download" - ], - "strip_prefix": "uucore-0.0.30", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"uucore\",\n deps = [\n \"@crates__chrono-0.4.45//:chrono\",\n \"@crates__chrono-tz-0.10.4//:chrono_tz\",\n \"@crates__clap-4.6.6//:clap\",\n \"@crates__dunce-1.0.5//:dunce\",\n \"@crates__glob-0.3.4//:glob\",\n \"@crates__iana-time-zone-0.1.65//:iana_time_zone\",\n \"@crates__libc-0.2.189//:libc\",\n \"@crates__number_prefix-0.4.0//:number_prefix\",\n \"@crates__os_display-0.1.4//:os_display\",\n \"@crates__wild-2.2.1//:wild\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"@crates__nix-0.29.0//:nix\", # cfg(unix)\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"@crates__nix-0.29.0//:nix\", # cfg(unix)\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"@crates__nix-0.29.0//:nix\", # cfg(unix)\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"@crates__nix-0.29.0//:nix\", # cfg(unix)\n ],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [\n \"@crates__winapi-util-0.1.11//:winapi_util\", # x86_64-pc-windows-msvc\n \"@crates__windows-sys-0.59.0//:windows_sys\", # x86_64-pc-windows-msvc\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"@crates__nix-0.29.0//:nix\", # cfg(unix)\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"@crates__nix-0.29.0//:nix\", # cfg(unix)\n ],\n \"//conditions:default\": [],\n }),\n proc_macro_deps = [\n \"@crates__uucore_procs-0.0.30//:uucore_procs\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"dunce\",\n \"entries\",\n \"fs\",\n \"fsext\",\n \"libc\",\n \"mode\",\n \"winapi-util\",\n \"windows-sys\",\n ],\n crate_root = \"src/lib/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=uucore\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.0.30\",\n)\n" - } - }, "crates__uucore-0.8.0": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -10336,33 +10138,7 @@ "https://static.crates.io/crates/uucore/0.8.0/download" ], "strip_prefix": "uucore-0.8.0", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"uucore\",\n deps = [\n \"@crates__base64-simd-0.8.0//:base64_simd\",\n \"@crates__bigdecimal-0.4.10//:bigdecimal\",\n \"@crates__blake2b_simd-1.0.4//:blake2b_simd\",\n \"@crates__blake3-1.8.6//:blake3\",\n \"@crates__bstr-1.13.0//:bstr\",\n \"@crates__clap-4.6.6//:clap\",\n \"@crates__crc-fast-1.8.2//:crc_fast\",\n \"@crates__data-encoding-2.11.1//:data_encoding\",\n \"@crates__data-encoding-macro-0.1.21//:data_encoding_macro\",\n \"@crates__digest-0.10.7//:digest\",\n \"@crates__dunce-1.0.5//:dunce\",\n \"@crates__fluent-0.17.0//:fluent\",\n \"@crates__fluent-bundle-0.16.0//:fluent_bundle\",\n \"@crates__fluent-syntax-0.12.0//:fluent_syntax\",\n \"@crates__glob-0.3.4//:glob\",\n \"@crates__hex-0.4.3//:hex\",\n \"@crates__icu_calendar-2.2.1//:icu_calendar\",\n \"@crates__icu_collator-2.2.1//:icu_collator\",\n \"@crates__icu_datetime-2.2.0//:icu_datetime\",\n \"@crates__icu_decimal-2.2.0//:icu_decimal\",\n \"@crates__icu_locale-2.2.0//:icu_locale\",\n \"@crates__icu_provider-2.2.0//:icu_provider\",\n \"@crates__itertools-0.14.0//:itertools\",\n \"@crates__jiff-0.2.35//:jiff\",\n \"@crates__jiff-icu-0.2.2//:jiff_icu\",\n \"@crates__libc-0.2.189//:libc\",\n \"@crates__md-5-0.10.6//:md5\",\n \"@crates__memchr-2.8.3//:memchr\",\n \"@crates__num-traits-0.2.19//:num_traits\",\n \"@crates__os_display-0.1.4//:os_display\",\n \"@crates__rustc-hash-2.1.3//:rustc_hash\",\n \"@crates__rustix-1.1.4//:rustix\",\n \"@crates__sha1-0.10.7//:sha1\",\n \"@crates__sha2-0.10.9//:sha2\",\n \"@crates__sha3-0.10.9//:sha3\",\n \"@crates__sm3-0.5.0//:sm3\",\n \"@crates__thiserror-2.0.19//:thiserror\",\n \"@crates__unic-langid-0.9.6//:unic_langid\",\n \"@crates__unit-prefix-0.5.2//:unit_prefix\",\n \"@crates__uucore-0.8.0//:build_script_build\",\n \"@crates__z85-3.0.7//:z85\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n \"@crates__xattr-1.6.1//:xattr\", # aarch64-apple-darwin\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n \"@crates__procfs-0.18.0//:procfs\", # aarch64-unknown-linux-gnu\n \"@crates__xattr-1.6.1//:xattr\", # aarch64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n \"@crates__procfs-0.18.0//:procfs\", # aarch64-unknown-linux-musl\n \"@crates__xattr-1.6.1//:xattr\", # aarch64-unknown-linux-musl\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n \"@crates__xattr-1.6.1//:xattr\", # x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [\n \"@crates__wild-2.2.1//:wild\", # cfg(target_os = \"windows\")\n \"@crates__winapi-util-0.1.11//:winapi_util\", # x86_64-pc-windows-msvc\n \"@crates__windows-sys-0.61.2//:windows_sys\", # x86_64-pc-windows-msvc\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n \"@crates__procfs-0.18.0//:procfs\", # x86_64-unknown-linux-gnu\n \"@crates__xattr-1.6.1//:xattr\", # x86_64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n \"@crates__procfs-0.18.0//:procfs\", # x86_64-unknown-linux-musl\n \"@crates__xattr-1.6.1//:xattr\", # x86_64-unknown-linux-musl\n ],\n \"//conditions:default\": [],\n }),\n proc_macro_deps = [\n \"@crates__uucore_procs-0.8.0//:uucore_procs\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"backup-control\",\n \"base64-simd\",\n \"bigdecimal\",\n \"blake2b_simd\",\n \"blake3\",\n \"bstr\",\n \"checksum\",\n \"colors\",\n \"crc-fast\",\n \"data-encoding\",\n \"data-encoding-macro\",\n \"default\",\n \"digest\",\n \"dunce\",\n \"encoding\",\n \"entries\",\n \"extendedbigdecimal\",\n \"fast-inc\",\n \"format\",\n \"fs\",\n \"fsext\",\n \"fsxattr\",\n \"glob\",\n \"hardware\",\n \"hex\",\n \"i18n-charmap\",\n \"i18n-collator\",\n \"i18n-common\",\n \"i18n-datetime\",\n \"i18n-decimal\",\n \"icu_calendar\",\n \"icu_collator\",\n \"icu_datetime\",\n \"icu_decimal\",\n \"icu_locale\",\n \"icu_provider\",\n \"itertools\",\n \"jiff\",\n \"jiff-icu\",\n \"libc\",\n \"lines\",\n \"md-5\",\n \"memchr\",\n \"mode\",\n \"num-traits\",\n \"parser\",\n \"parser-glob\",\n \"parser-num\",\n \"parser-size\",\n \"pipes\",\n \"process\",\n \"procfs\",\n \"quoting-style\",\n \"ranges\",\n \"ringbuffer\",\n \"sha1\",\n \"sha2\",\n \"sha3\",\n \"signals\",\n \"sm3\",\n \"sum\",\n \"time\",\n \"unit-prefix\",\n \"update-control\",\n \"version-cmp\",\n \"wide\",\n \"winapi-util\",\n \"windows-sys\",\n \"xattr\",\n \"z85\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"safe-traversal\", # aarch64-apple-darwin\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"safe-traversal\", # aarch64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"safe-traversal\", # aarch64-unknown-linux-musl\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"safe-traversal\", # x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"safe-traversal\", # x86_64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"safe-traversal\", # x86_64-unknown-linux-musl\n ],\n \"//conditions:default\": [],\n }),\n crate_root = \"src/lib/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=uucore\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.8.0\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"backup-control\",\n \"base64-simd\",\n \"bigdecimal\",\n \"blake2b_simd\",\n \"blake3\",\n \"bstr\",\n \"checksum\",\n \"colors\",\n \"crc-fast\",\n \"data-encoding\",\n \"data-encoding-macro\",\n \"default\",\n \"digest\",\n \"dunce\",\n \"encoding\",\n \"entries\",\n \"extendedbigdecimal\",\n \"fast-inc\",\n \"format\",\n \"fs\",\n \"fsext\",\n \"fsxattr\",\n \"glob\",\n \"hardware\",\n \"hex\",\n \"i18n-charmap\",\n \"i18n-collator\",\n \"i18n-common\",\n \"i18n-datetime\",\n \"i18n-decimal\",\n \"icu_calendar\",\n \"icu_collator\",\n \"icu_datetime\",\n \"icu_decimal\",\n \"icu_locale\",\n \"icu_provider\",\n \"itertools\",\n \"jiff\",\n \"jiff-icu\",\n \"libc\",\n \"lines\",\n \"md-5\",\n \"memchr\",\n \"mode\",\n \"num-traits\",\n \"parser\",\n \"parser-glob\",\n \"parser-num\",\n \"parser-size\",\n \"pipes\",\n \"process\",\n \"procfs\",\n \"quoting-style\",\n \"ranges\",\n \"ringbuffer\",\n \"sha1\",\n \"sha2\",\n \"sha3\",\n \"signals\",\n \"sm3\",\n \"sum\",\n \"time\",\n \"unit-prefix\",\n \"update-control\",\n \"version-cmp\",\n \"wide\",\n \"winapi-util\",\n \"windows-sys\",\n \"xattr\",\n \"z85\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"safe-traversal\", # aarch64-apple-darwin\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"safe-traversal\", # aarch64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"safe-traversal\", # aarch64-unknown-linux-musl\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"safe-traversal\", # x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"safe-traversal\", # x86_64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"safe-traversal\", # x86_64-unknown-linux-musl\n ],\n \"//conditions:default\": [],\n }),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n emit_warnings = False,\n edition = \"2024\",\n pkg_name = \"uucore\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=uucore\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.8.0\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" - } - }, - "crates__uucore-0.9.0": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "remote_patch_strip": 1, - "sha256": "069b34217c27f611e1589f540f58118dbf226a9e407d38ab472052ff075a1dc2", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/uucore/0.9.0/download" - ], - "strip_prefix": "uucore-0.9.0", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"uucore\",\n deps = [\n \"@crates__clap-4.6.6//:clap\",\n \"@crates__fluent-0.17.0//:fluent\",\n \"@crates__fluent-syntax-0.12.0//:fluent_syntax\",\n \"@crates__libc-0.2.189//:libc\",\n \"@crates__os_display-0.1.4//:os_display\",\n \"@crates__rustc-hash-2.1.3//:rustc_hash\",\n \"@crates__rustix-1.1.4//:rustix\",\n \"@crates__thiserror-2.0.19//:thiserror\",\n \"@crates__unic-langid-0.9.6//:unic_langid\",\n \"@crates__uucore-0.9.0//:build_script_build\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n ],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [\n \"@crates__wild-2.2.1//:wild\", # cfg(target_os = \"windows\")\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n ],\n \"//conditions:default\": [],\n }),\n proc_macro_deps = [\n \"@crates__uucore_procs-0.9.0//:uucore_procs\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"libc\",\n \"signals\",\n ],\n crate_root = \"src/lib/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=uucore\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.9.0\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"libc\",\n \"signals\",\n ],\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n emit_warnings = False,\n edition = \"2024\",\n pkg_name = \"uucore\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=uucore\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.9.0\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" - } - }, - "crates__uucore_procs-0.0.30": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "remote_patch_strip": 1, - "sha256": "c72435859e812e602e225dea48d014abb6b1072220a8d44f2fe0565553b1f7e4", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/uucore_procs/0.0.30/download" - ], - "strip_prefix": "uucore_procs-0.0.30", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"uucore_procs\",\n deps = [\n \"@crates__proc-macro2-1.0.107//:proc_macro2\",\n \"@crates__quote-1.0.47//:quote\",\n \"@crates__uuhelp_parser-0.0.30//:uuhelp_parser\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=uucore_procs\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.0.30\",\n)\n" + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"uucore\",\n deps = [\n \"@crates__base64-simd-0.8.0//:base64_simd\",\n \"@crates__bigdecimal-0.4.10//:bigdecimal\",\n \"@crates__blake2b_simd-1.0.4//:blake2b_simd\",\n \"@crates__blake3-1.8.6//:blake3\",\n \"@crates__bstr-1.13.0//:bstr\",\n \"@crates__clap-4.6.6//:clap\",\n \"@crates__crc-fast-1.8.2//:crc_fast\",\n \"@crates__data-encoding-2.11.1//:data_encoding\",\n \"@crates__data-encoding-macro-0.1.21//:data_encoding_macro\",\n \"@crates__digest-0.10.7//:digest\",\n \"@crates__dunce-1.0.5//:dunce\",\n \"@crates__fluent-0.17.0//:fluent\",\n \"@crates__fluent-bundle-0.16.0//:fluent_bundle\",\n \"@crates__fluent-syntax-0.12.0//:fluent_syntax\",\n \"@crates__glob-0.3.4//:glob\",\n \"@crates__hex-0.4.3//:hex\",\n \"@crates__icu_calendar-2.2.1//:icu_calendar\",\n \"@crates__icu_collator-2.2.1//:icu_collator\",\n \"@crates__icu_datetime-2.2.0//:icu_datetime\",\n \"@crates__icu_decimal-2.2.0//:icu_decimal\",\n \"@crates__icu_locale-2.2.0//:icu_locale\",\n \"@crates__icu_provider-2.2.0//:icu_provider\",\n \"@crates__itertools-0.14.0//:itertools\",\n \"@crates__jiff-0.2.35//:jiff\",\n \"@crates__jiff-icu-0.2.2//:jiff_icu\",\n \"@crates__libc-0.2.189//:libc\",\n \"@crates__md-5-0.10.6//:md5\",\n \"@crates__memchr-2.8.3//:memchr\",\n \"@crates__num-traits-0.2.19//:num_traits\",\n \"@crates__os_display-0.1.4//:os_display\",\n \"@crates__rustc-hash-2.1.3//:rustc_hash\",\n \"@crates__rustix-1.1.4//:rustix\",\n \"@crates__sha1-0.10.7//:sha1\",\n \"@crates__sha2-0.10.9//:sha2\",\n \"@crates__sha3-0.10.9//:sha3\",\n \"@crates__sm3-0.5.0//:sm3\",\n \"@crates__thiserror-2.0.19//:thiserror\",\n \"@crates__unic-langid-0.9.6//:unic_langid\",\n \"@crates__unit-prefix-0.5.2//:unit_prefix\",\n \"@crates__uucore-0.8.0//:build_script_build\",\n \"@crates__z85-3.0.7//:z85\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n \"@crates__xattr-1.6.1//:xattr\", # aarch64-apple-darwin\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n \"@crates__procfs-0.18.0//:procfs\", # aarch64-unknown-linux-gnu\n \"@crates__xattr-1.6.1//:xattr\", # aarch64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n \"@crates__procfs-0.18.0//:procfs\", # aarch64-unknown-linux-musl\n \"@crates__xattr-1.6.1//:xattr\", # aarch64-unknown-linux-musl\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n \"@crates__xattr-1.6.1//:xattr\", # x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [\n \"@crates__wild-2.2.1//:wild\", # cfg(target_os = \"windows\")\n \"@crates__winapi-util-0.1.11//:winapi_util\", # x86_64-pc-windows-msvc\n \"@crates__windows-sys-0.61.2//:windows_sys\", # x86_64-pc-windows-msvc\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n \"@crates__procfs-0.18.0//:procfs\", # x86_64-unknown-linux-gnu\n \"@crates__xattr-1.6.1//:xattr\", # x86_64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"@crates__nix-0.31.3//:nix\", # cfg(unix)\n \"@crates__procfs-0.18.0//:procfs\", # x86_64-unknown-linux-musl\n \"@crates__xattr-1.6.1//:xattr\", # x86_64-unknown-linux-musl\n ],\n \"//conditions:default\": [],\n }),\n proc_macro_deps = [\n \"@crates__uucore_procs-0.8.0//:uucore_procs\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"backup-control\",\n \"base64-simd\",\n \"bigdecimal\",\n \"blake2b_simd\",\n \"blake3\",\n \"bstr\",\n \"checksum\",\n \"colors\",\n \"crc-fast\",\n \"data-encoding\",\n \"data-encoding-macro\",\n \"digest\",\n \"dunce\",\n \"encoding\",\n \"entries\",\n \"extendedbigdecimal\",\n \"fast-inc\",\n \"format\",\n \"fs\",\n \"fsext\",\n \"glob\",\n \"hardware\",\n \"hex\",\n \"i18n-charmap\",\n \"i18n-collator\",\n \"i18n-common\",\n \"i18n-datetime\",\n \"i18n-decimal\",\n \"icu_calendar\",\n \"icu_collator\",\n \"icu_datetime\",\n \"icu_decimal\",\n \"icu_locale\",\n \"icu_provider\",\n \"itertools\",\n \"jiff\",\n \"jiff-icu\",\n \"libc\",\n \"lines\",\n \"md-5\",\n \"memchr\",\n \"mode\",\n \"num-traits\",\n \"parser\",\n \"parser-glob\",\n \"parser-num\",\n \"parser-size\",\n \"pipes\",\n \"process\",\n \"procfs\",\n \"quoting-style\",\n \"ranges\",\n \"ringbuffer\",\n \"sha1\",\n \"sha2\",\n \"sha3\",\n \"signals\",\n \"sm3\",\n \"sum\",\n \"time\",\n \"unit-prefix\",\n \"update-control\",\n \"version-cmp\",\n \"wide\",\n \"winapi-util\",\n \"windows-sys\",\n \"z85\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"default\", # aarch64-apple-darwin\n \"fsxattr\", # aarch64-apple-darwin\n \"safe-traversal\", # aarch64-apple-darwin\n \"xattr\", # aarch64-apple-darwin\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"default\", # aarch64-unknown-linux-gnu\n \"fsxattr\", # aarch64-unknown-linux-gnu\n \"safe-traversal\", # aarch64-unknown-linux-gnu\n \"xattr\", # aarch64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"default\", # aarch64-unknown-linux-musl\n \"fsxattr\", # aarch64-unknown-linux-musl\n \"safe-traversal\", # aarch64-unknown-linux-musl\n \"xattr\", # aarch64-unknown-linux-musl\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"default\", # x86_64-apple-darwin\n \"fsxattr\", # x86_64-apple-darwin\n \"safe-traversal\", # x86_64-apple-darwin\n \"xattr\", # x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"default\", # x86_64-unknown-linux-gnu\n \"fsxattr\", # x86_64-unknown-linux-gnu\n \"safe-traversal\", # x86_64-unknown-linux-gnu\n \"xattr\", # x86_64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"default\", # x86_64-unknown-linux-musl\n \"fsxattr\", # x86_64-unknown-linux-musl\n \"safe-traversal\", # x86_64-unknown-linux-musl\n \"xattr\", # x86_64-unknown-linux-musl\n ],\n \"//conditions:default\": [],\n }),\n crate_root = \"src/lib/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=uucore\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.8.0\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"backup-control\",\n \"base64-simd\",\n \"bigdecimal\",\n \"blake2b_simd\",\n \"blake3\",\n \"bstr\",\n \"checksum\",\n \"colors\",\n \"crc-fast\",\n \"data-encoding\",\n \"data-encoding-macro\",\n \"digest\",\n \"dunce\",\n \"encoding\",\n \"entries\",\n \"extendedbigdecimal\",\n \"fast-inc\",\n \"format\",\n \"fs\",\n \"fsext\",\n \"glob\",\n \"hardware\",\n \"hex\",\n \"i18n-charmap\",\n \"i18n-collator\",\n \"i18n-common\",\n \"i18n-datetime\",\n \"i18n-decimal\",\n \"icu_calendar\",\n \"icu_collator\",\n \"icu_datetime\",\n \"icu_decimal\",\n \"icu_locale\",\n \"icu_provider\",\n \"itertools\",\n \"jiff\",\n \"jiff-icu\",\n \"libc\",\n \"lines\",\n \"md-5\",\n \"memchr\",\n \"mode\",\n \"num-traits\",\n \"parser\",\n \"parser-glob\",\n \"parser-num\",\n \"parser-size\",\n \"pipes\",\n \"process\",\n \"procfs\",\n \"quoting-style\",\n \"ranges\",\n \"ringbuffer\",\n \"sha1\",\n \"sha2\",\n \"sha3\",\n \"signals\",\n \"sm3\",\n \"sum\",\n \"time\",\n \"unit-prefix\",\n \"update-control\",\n \"version-cmp\",\n \"wide\",\n \"winapi-util\",\n \"windows-sys\",\n \"z85\",\n ] + select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [\n \"default\", # aarch64-apple-darwin\n \"fsxattr\", # aarch64-apple-darwin\n \"safe-traversal\", # aarch64-apple-darwin\n \"xattr\", # aarch64-apple-darwin\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [\n \"default\", # aarch64-unknown-linux-gnu\n \"fsxattr\", # aarch64-unknown-linux-gnu\n \"safe-traversal\", # aarch64-unknown-linux-gnu\n \"xattr\", # aarch64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [\n \"default\", # aarch64-unknown-linux-musl\n \"fsxattr\", # aarch64-unknown-linux-musl\n \"safe-traversal\", # aarch64-unknown-linux-musl\n \"xattr\", # aarch64-unknown-linux-musl\n ],\n \"@@//bazel/triples:x86_64-apple-darwin\": [\n \"default\", # x86_64-apple-darwin\n \"fsxattr\", # x86_64-apple-darwin\n \"safe-traversal\", # x86_64-apple-darwin\n \"xattr\", # x86_64-apple-darwin\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [\n \"default\", # x86_64-unknown-linux-gnu\n \"fsxattr\", # x86_64-unknown-linux-gnu\n \"safe-traversal\", # x86_64-unknown-linux-gnu\n \"xattr\", # x86_64-unknown-linux-gnu\n ],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [\n \"default\", # x86_64-unknown-linux-musl\n \"fsxattr\", # x86_64-unknown-linux-musl\n \"safe-traversal\", # x86_64-unknown-linux-musl\n \"xattr\", # x86_64-unknown-linux-musl\n ],\n \"//conditions:default\": [],\n }),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n emit_warnings = False,\n edition = \"2024\",\n pkg_name = \"uucore\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=uucore\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.8.0\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" } }, "crates__uucore_procs-0.8.0": { @@ -10378,32 +10154,6 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"uucore_procs\",\n deps = [\n \"@crates__proc-macro2-1.0.107//:proc_macro2\",\n \"@crates__quote-1.0.47//:quote\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=uucore_procs\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.8.0\",\n)\n" } }, - "crates__uucore_procs-0.9.0": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "remote_patch_strip": 1, - "sha256": "34337da211e7abfff7189b794afb3b5018fe356fb36474b73645458fc1201350", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/uucore_procs/0.9.0/download" - ], - "strip_prefix": "uucore_procs-0.9.0", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"uucore_procs\",\n deps = [\n \"@crates__proc-macro2-1.0.107//:proc_macro2\",\n \"@crates__quote-1.0.47//:quote\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=uucore_procs\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.9.0\",\n)\n" - } - }, - "crates__uuhelp_parser-0.0.30": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "remote_patch_strip": 1, - "sha256": "0bb6d972f580f8223cb7052d8580aea2b7061e368cf476de32ea9457b19459ed", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/uuhelp_parser/0.0.30/download" - ], - "strip_prefix": "uuhelp_parser-0.0.30", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"uuhelp_parser\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=uuhelp_parser\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.0.30\",\n)\n" - } - }, "crates__uuid-1.24.0": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -11246,7 +10996,7 @@ "https://static.crates.io/crates/windows-sys/0.59.0/download" ], "strip_prefix": "windows-sys-0.59.0", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"windows_sys\",\n deps = [\n \"@crates__windows-targets-0.52.6//:windows_targets\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"Wdk\",\n \"Wdk_System\",\n \"Wdk_System_SystemInformation\",\n \"Win32\",\n \"Win32_Foundation\",\n \"Win32_Security\",\n \"Win32_Storage\",\n \"Win32_Storage_FileSystem\",\n \"Win32_System\",\n \"Win32_System_Console\",\n \"Win32_System_Diagnostics\",\n \"Win32_System_Diagnostics_ToolHelp\",\n \"Win32_System_LibraryLoader\",\n \"Win32_System_RemoteDesktop\",\n \"Win32_System_SystemInformation\",\n \"Win32_System_SystemServices\",\n \"Win32_System_Threading\",\n \"Win32_System_WindowsProgramming\",\n \"Win32_UI\",\n \"Win32_UI_WindowsAndMessaging\",\n \"default\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=windows-sys\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.59.0\",\n)\n" + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"windows_sys\",\n deps = [\n \"@crates__windows-targets-0.52.6//:windows_targets\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"Win32\",\n \"Win32_Foundation\",\n \"Win32_Security\",\n \"Win32_Storage\",\n \"Win32_Storage_FileSystem\",\n \"Win32_System\",\n \"Win32_System_Console\",\n \"Win32_System_Diagnostics\",\n \"Win32_System_Diagnostics_ToolHelp\",\n \"Win32_System_LibraryLoader\",\n \"Win32_System_SystemInformation\",\n \"Win32_System_SystemServices\",\n \"Win32_System_Threading\",\n \"Win32_UI\",\n \"Win32_UI_WindowsAndMessaging\",\n \"default\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=windows-sys\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.59.0\",\n)\n" } }, "crates__windows-sys-0.60.2": { @@ -11272,7 +11022,7 @@ "https://static.crates.io/crates/windows-sys/0.61.2/download" ], "strip_prefix": "windows-sys-0.61.2", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"windows_sys\",\n deps = [\n \"@crates__windows-link-0.2.1//:windows_link\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"Wdk\",\n \"Wdk_Foundation\",\n \"Wdk_Storage\",\n \"Wdk_Storage_FileSystem\",\n \"Wdk_System\",\n \"Wdk_System_IO\",\n \"Wdk_System_SystemInformation\",\n \"Win32\",\n \"Win32_Devices\",\n \"Win32_Devices_Communication\",\n \"Win32_Foundation\",\n \"Win32_Graphics\",\n \"Win32_Graphics_Gdi\",\n \"Win32_Media\",\n \"Win32_Media_Audio\",\n \"Win32_Media_Multimedia\",\n \"Win32_NetworkManagement\",\n \"Win32_NetworkManagement_NetManagement\",\n \"Win32_Networking\",\n \"Win32_Networking_WinSock\",\n \"Win32_Security\",\n \"Win32_Storage\",\n \"Win32_Storage_FileSystem\",\n \"Win32_Storage_ProjectedFileSystem\",\n \"Win32_System\",\n \"Win32_System_Com\",\n \"Win32_System_Console\",\n \"Win32_System_Diagnostics\",\n \"Win32_System_Diagnostics_Debug\",\n \"Win32_System_IO\",\n \"Win32_System_Ioctl\",\n \"Win32_System_LibraryLoader\",\n \"Win32_System_Pipes\",\n \"Win32_System_Registry\",\n \"Win32_System_RemoteDesktop\",\n \"Win32_System_SystemInformation\",\n \"Win32_System_SystemServices\",\n \"Win32_System_Threading\",\n \"Win32_System_Time\",\n \"Win32_System_WindowsProgramming\",\n \"Win32_UI\",\n \"Win32_UI_Input\",\n \"Win32_UI_Input_KeyboardAndMouse\",\n \"Win32_UI_WindowsAndMessaging\",\n \"default\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=windows-sys\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.61.2\",\n)\n" + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"windows_sys\",\n deps = [\n \"@crates__windows-link-0.2.1//:windows_link\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"Wdk\",\n \"Wdk_Foundation\",\n \"Wdk_Storage\",\n \"Wdk_Storage_FileSystem\",\n \"Wdk_System\",\n \"Wdk_System_IO\",\n \"Wdk_System_SystemInformation\",\n \"Win32\",\n \"Win32_Devices\",\n \"Win32_Devices_Communication\",\n \"Win32_Foundation\",\n \"Win32_Graphics\",\n \"Win32_Graphics_Gdi\",\n \"Win32_Media\",\n \"Win32_Media_Audio\",\n \"Win32_Media_Multimedia\",\n \"Win32_Networking\",\n \"Win32_Networking_WinSock\",\n \"Win32_Security\",\n \"Win32_Storage\",\n \"Win32_Storage_FileSystem\",\n \"Win32_Storage_ProjectedFileSystem\",\n \"Win32_System\",\n \"Win32_System_Com\",\n \"Win32_System_Console\",\n \"Win32_System_Diagnostics\",\n \"Win32_System_Diagnostics_Debug\",\n \"Win32_System_IO\",\n \"Win32_System_Ioctl\",\n \"Win32_System_LibraryLoader\",\n \"Win32_System_Pipes\",\n \"Win32_System_Registry\",\n \"Win32_System_RemoteDesktop\",\n \"Win32_System_SystemInformation\",\n \"Win32_System_SystemServices\",\n \"Win32_System_Threading\",\n \"Win32_System_Time\",\n \"Win32_System_WindowsProgramming\",\n \"Win32_UI\",\n \"Win32_UI_Input\",\n \"Win32_UI_Input_KeyboardAndMouse\",\n \"Win32_UI_WindowsAndMessaging\",\n \"default\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=windows-sys\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.61.2\",\n)\n" } }, "crates__windows-targets-0.48.5": { diff --git a/README.md b/README.md index 6ccf10139..8b6d36a9b 100644 --- a/README.md +++ b/README.md @@ -171,7 +171,7 @@ _[Watch the capture ↗](https://omp.sh/clips/web.mp4)_ ### 09 · Unapologetically native. Even on Windows. -Other agents shell out to rg, grep, find, and bash. On many machines those binaries don't exist, and on the ones where they do, every call costs a fork-exec round-trip. omp links the real implementations into the process. ripgrep, glob, find: in-process. brush is the bash — with sessions that survive across calls, and 46 vendored coreutils (ls, sed, sort, xargs, even jq via jaq) that run as in-process builtins, zero fork/exec. The same omp binary runs on macOS, Linux, and Windows — no WSL bridge. +Other agents shell out to rg, grep, find, and bash. On many machines those binaries don't exist, and on the ones where they do, every call costs a fork-exec round-trip. omp links the real implementations into the process. ripgrep, glob, find: in-process. brush is the bash — with sessions that survive across calls, and 58 command-line utilities (ls, sed, sort, xargs, even jq) ported into the builtins crate and run in-process, zero fork/exec. The same omp binary runs on macOS, Linux, and Windows — no WSL bridge. ### 10 · Code review with priorities and a verdict @@ -427,9 +427,9 @@ Vuln lookups answer with vendor data, not blog summaries. ## Roughly **~80,000** lines of Rust, doing the work other harnesses shell out for. -Nine crates, one platform-tagged N-API addon. Search, shell, AST, highlight, PTY, desktop control, image decode, BPE counting — all in-process on the libuv pool. No fork/exec on the hot path. Another ~77k lines ride along vendored: the brush bash fork, a jq engine (jaq), and 46 uutils coreutils compiled straight into the shell. +Six crates, one platform-tagged N-API addon. Search, shell, AST, highlight, PTY, desktop control, image decode, BPE counting — all in-process on the libuv pool. No fork/exec on the hot path. Another ~80k lines ride along vendored: the brush bash fork, plus 58 command-line utilities — coreutils, findutils, sed, jq, ripgrep-backed grep, fd, diff, moreutils — ported into the builtins crate and compiled straight into the shell. -- Crates: `pi-natives`, `pi-shell`, `pi-ast`, `pi-iso`, `pi-voice`, `pi-walker`, `pi-uu-grep`, `pi-uu-diff`, `pi-uutils-ctx` +- Crates: `pi-natives`, `pi-shell`, `pi-ast`, `pi-iso`, `pi-voice`, `pi-walker` - Platforms: `linux-x64`, `linux-arm64`, `darwin-x64`, `darwin-arm64`, `win32-x64` — x64 ships dual AVX2 and baseline binaries Per crate, code lines only: @@ -440,11 +440,8 @@ Per crate, code lines only: | pi-natives | The N-API surface — every module in the table below | 25,000 | | pi-walker | Parallel ignore-aware walker + scan cache shared by grep · glob · workspace · shell | 5,200 | | pi-iso | Workspace isolation · apfs · btrfs · zfs · reflink · overlayfs · projfs · rcopy | 3,300 | -| pi-uu-grep | ripgrep-backed grep, run as an in-process shell builtin | 3,300 | | pi-ast | tree-sitter + ast-grep matching, block resolution, structural summaries | 2,900 | | pi-voice | Audio capture/playback · Opus · live WebRTC | 1,000 | -| pi-uu-diff | Structured diff builtin backed by similar | 500 | -| pi-uutils-ctx | Thread-local stdio/cwd/env so builtins run concurrently without a fork | 300 | Inside `pi-natives`, the per-module breakdown (glue and tests omitted): @@ -630,13 +627,8 @@ For architecture and contribution guidelines, see [packages/coding-agent/DEVELOP | **[pi-iso](crates/pi-iso)** | Task isolation backend resolver: APFS clones, btrfs/zfs reflinks, overlayfs, projfs, rcopy | | **[pi-voice](crates/pi-voice)** | Audio capture/playback, Opus codecs, and live WebRTC streaming primitives | | **[pi-walker](crates/pi-walker)** | Parallel ignore-aware filesystem walker with the scan cache shared by grep, glob, and workspace | -| **[pi-uu-grep](crates/pi-uu-grep)** | ripgrep-library-backed grep executed as an in-process shell builtin | -| **[pi-uu-diff](crates/pi-uu-diff)** | Structured diff builtin backed by the similar crate | -| **[pi-uutils-ctx](crates/pi-uutils-ctx)** | Thread-local stdio/cwd/env context so in-process builtins run concurrently | | **[brush-core](crates/vendor/brush-core)** | Vendored fork of [brush-shell](https://github.com/reubeno/brush) for embedded bash execution | -| **[brush-builtins](crates/vendor/brush-builtins)** | Vendored bash builtins (cd, echo, test, printf, read, export, etc.) | -| **[jaq](crates/vendor/jaq)** | Vendored jq-compatible JSON query engine, run as an in-process builtin | -| **uu-\* family** ([crates/vendor](crates/vendor)) | 46 vendored uutils coreutils (ls, sed, sort, xargs, …) executed in-process, no fork/exec | +| **[pi-builtins](crates/pi-builtins)** | Bash builtins (cd, echo, test, printf, read, export, …) plus 67 in-process command-line utilities | ## Contributing diff --git a/crates/vendor/brush-builtins/BUILD.bazel b/crates/pi-builtins/BUILD.bazel similarity index 54% rename from crates/vendor/brush-builtins/BUILD.bazel rename to crates/pi-builtins/BUILD.bazel index 0b6458fb7..1402869f3 100644 --- a/crates/vendor/brush-builtins/BUILD.bazel +++ b/crates/pi-builtins/BUILD.bazel @@ -5,14 +5,15 @@ package(default_visibility = ["//visibility:public"]) exports_files(["Cargo.toml"]) -# Vendored fork, promoted to a workspace member so Bazel treats it as -# first-party (crate_universe's path-dep rendering is machine-local and breaks -# lockfile portability). Feature list mirrors cargo's resolved default set. +# First-party: the brush builtins fork plus the in-process command-line +# utilities the shell ships. Feature list mirrors cargo's resolved default set. rust_library( - name = "brush-builtins", + name = "pi-builtins", srcs = glob(["src/**/*.rs"]), aliases = aliases(), + compile_data = glob(["src/*.txt"]), crate_features = [ + "base", "builtin.alias", "builtin.bg", "builtin.bind", @@ -66,19 +67,79 @@ rust_library( "builtin.unalias", "builtin.unset", "builtin.wait", + "util.b2sum", + "util.base32", + "util.base64", + "util.basename", + "util.cat", + "util.cksum", + "util.cmp", + "util.combine", + "util.comm", + "util.cut", + "util.date", + "util.diff", + "util.dirname", + "util.errno", + "util.fd", + "util.find", + "util.grep", + "util.head", + "util.hostname", + "util.ifne", + "util.isutf8", + "util.jq", + "util.ln", + "util.ls", + "util.md5sum", + "util.mkdir", + "util.mktemp", + "util.mv", + "util.nproc", + "util.paste", + "util.printenv", + "util.readlink", + "util.realpath", + "util.rm", + "util.sed", + "util.seq", + "util.sha1sum", + "util.sha224sum", + "util.sha256sum", + "util.sha384sum", + "util.sha512sum", + "util.sort", + "util.sponge", + "util.stat", + "util.tac", + "util.tail", + "util.tee", + "util.touch", + "util.tr", + "util.truncate", + "util.ts", + "util.uname", + "util.uniq", + "util.wc", + "util.which", + "util.whoami", + "util.xargs", + "util.yes", + "utils", ], - crate_name = "brush_builtins", + crate_name = "pi_builtins", edition = "2024", proc_macro_deps = all_crate_deps(proc_macro = True), version = "0.2.0", deps = all_crate_deps(normal = True) + [ + "//crates/pi-walker", "//crates/vendor/brush-core", ], ) rust_test( - name = "brush-builtins_test", - crate = ":brush-builtins", + name = "pi-builtins_test", + crate = ":pi-builtins", edition = "2024", proc_macro_deps = all_crate_deps(proc_macro_dev = True), deps = all_crate_deps(normal_dev = True), diff --git a/crates/vendor/brush-builtins/Cargo.lock b/crates/pi-builtins/Cargo.lock similarity index 100% rename from crates/vendor/brush-builtins/Cargo.lock rename to crates/pi-builtins/Cargo.lock diff --git a/crates/pi-builtins/Cargo.toml b/crates/pi-builtins/Cargo.toml new file mode 100644 index 000000000..923f3ea31 --- /dev/null +++ b/crates/pi-builtins/Cargo.toml @@ -0,0 +1,451 @@ +# Shell builtins for the embedded brush shell. +# +# Two layers live here: +# * the POSIX/bash builtins (`cd`, `echo`, `test`, `printf`, `read`, …), a +# locally-patched fork of the upstream `brush-builtins` crate, and +# * the in-process command-line utilities the shell ships (`cat`, `grep`, +# `sed`, `ls`, `jq`, `ps`, `top`, `kill`, …), one module per command. +# +# The utilities used to be ~50 separate vendored crates driven through a +# thread-local I/O shim; they now run as ordinary builtins against the explicit +# `host::Host` view of the shell (see `src/host.rs`). See LICENSE for the +# third-party notices that come with the ported code. +[package] +name = "pi-builtins" +version.workspace = true +edition.workspace = true +license.workspace = true +authors.workspace = true +repository.workspace = true +rust-version = "1.88.0" +description = "Builtins and in-process command-line utilities for the embedded brush shell" +build = false +autolib = false +autobins = false +autoexamples = false +autotests = false +autobenches = false + +[lib] +name = "pi_builtins" +path = "src/lib.rs" +bench = false + +[dependencies] +brush-core = "^0.5.0" +brush-parser = "^0.4.0" +cfg-if = "1.0.4" +chrono = "0.4.44" +clap = { version = "4.6.0", features = ["cargo", "color", "derive", "env", "wrap_help"] } +fancy-regex = "0.17" +futures = "0.3.32" +itertools = "0.14.0" +parking_lot = "0.12.5" +strum = "0.28.0" +strum_macros = "0.28.0" +thiserror = "2.0.18" +tracing = "0.1.44" + +# ── Utility builtin dependencies ────────────────────────────────────────────── +ansi-width = "0.1.0" +argmax = "0.3.1" +bigdecimal = "0.4" +binary-heap-plus = "0.5.0" +bstr = "1.12.0" +bytecount = { version = "0.6.8", features = ["runtime-dispatch-simd"] } +codesnake = "0.2" +compare = "0.1.0" +faccess = "0.2.4" +filetime = "0.2.23" +flume = "0.11" +foldhash = "0.2.0" +fs_extra = "1.3.0" +glob = "0.3.1" +globset = "0.4" +grep-cli = "0.1" +grep-matcher = "0.1" +grep-pcre2 = "0.1" +grep-printer = "0.3" +grep-regex = "0.1" +grep-searcher = "0.1" +hex = "0.4.3" +hifijson = "0.2.0" +hostname = "0.4" +ignore = "0.4" +indicatif = "0.18.0" +jaq-core = "2.1.1" +jaq-json = "1.1.1" +jaq-std = "2.1.0" +jiff = { version = "0.2.18", features = ["tzdb-bundle-platform"] } +lscolors = { version = "0.21.0", default-features = false, features = ["gnu_legacy"] } +memchr = "2.7.4" +nom = "8.0.0" +num-bigint = "0.4" +num-traits = "0.2" +onig = { version = "6.4", default-features = false } +os_display = "0.1.4" +parse_datetime = "0.14" +pi-walker = { path = "../pi-walker" } +platform-info = "2.0.3" +rand = { version = "0.10.0", features = ["std_rng"] } +rayon = "1.10" +regex = "1.11" +rustc-hash = "2.1.1" +self_cell = "1.0.4" +serde_json = "1" +similar = "3.1.0" +tempfile = "3.15.0" +tokio-util = "0.7" +unicode-width = "0.2.0" +libc = "0.2.172" +memmap2 = "0.9" +uutils_term_grid = "0.8" +yansi = "1.0.1" + +[dependencies.uucore] +version = "0.8.0" +default-features = false +features = [ + "backup-control", + "checksum", + "colors", + "encoding", + "entries", + "extendedbigdecimal", + "fast-inc", + "format", + "fs", + "fsext", + "hardware", + "i18n-charmap", + "i18n-collator", + "i18n-datetime", + "i18n-decimal", + "libc", + "lines", + "mode", + "parser", + "pipes", + "process", + "quoting-style", + "ranges", + "ringbuffer", + "signals", + "sum", + "time", + "version-cmp", + "wide", + "update-control", +] + +[target."cfg(any(unix, windows))".dependencies.tokio] +version = "1.50.0" +features = ["io-util", "macros", "process", "rt", "rt-multi-thread", "signal", "sync"] + +[target.'cfg(target_family = "wasm")'.dependencies.tokio] +version = "1.52.1" +features = ["io-util", "macros", "rt"] + +[target.'cfg(any(target_os = "linux", target_os = "android"))'.dependencies] +procfs = "0.18.0" + +[target."cfg(unix)".dependencies] +dns-lookup = "3.0.0" +nix = { version = "0.31.2", features = ["fs", "poll", "process", "resource", "signal", "term", "user"] } +notify = { version = "=8.2.0", features = ["macos_kqueue"] } +rlimit = "0.11.0" +rustix = { version = "1.1.4", features = ["fs", "process", "time"] } +uucore = { version = "0.8.0", features = ["fsxattr", "safe-traversal"] } + +[target."cfg(windows)".dependencies] +notify = "=8.2.0" +rustix = { version = "1.1.4", features = ["fs", "process", "time"] } +windows-sys = { version = "0.61", features = [ + "Win32_Foundation", + "Win32_Networking_WinSock", + "Win32_Storage_FileSystem", + "Win32_System_IO", + "Win32_System_SystemInformation", + "Win32_System_WindowsProgramming", +] } + +[dev-dependencies] +anyhow = "1.0.102" +pretty_assertions = { version = "1.4.1", features = ["unstable"] } +tempfile = "3" + +[features] +default = ["base", "utils"] + +# Every upstream POSIX/bash builtin. +base = [ + "builtin.alias", + "builtin.bg", + "builtin.bind", + "builtin.break", + "builtin.builtin", + "builtin.caller", + "builtin.cd", + "builtin.colon", + "builtin.command", + "builtin.compgen", + "builtin.compopt", + "builtin.complete", + "builtin.continue", + "builtin.declare", + "builtin.dirs", + "builtin.dot", + "builtin.echo", + "builtin.enable", + "builtin.eval", + "builtin.exec", + "builtin.exit", + "builtin.export", + "builtin.false", + "builtin.fc", + "builtin.fg", + "builtin.getopts", + "builtin.hash", + "builtin.help", + "builtin.history", + "builtin.jobs", + "builtin.kill", + "builtin.let", + "builtin.mapfile", + "builtin.popd", + "builtin.printf", + "builtin.pushd", + "builtin.pwd", + "builtin.read", + "builtin.return", + "builtin.set", + "builtin.shift", + "builtin.shopt", + "builtin.suspend", + "builtin.test", + "builtin.times", + "builtin.trap", + "builtin.true", + "builtin.type", + "builtin.ulimit", + "builtin.umask", + "builtin.unalias", + "builtin.unset", + "builtin.wait", +] + +"builtin.alias" = [] +"builtin.bg" = [] +"builtin.bind" = [] +"builtin.break" = [] +"builtin.builtin" = [] +"builtin.caller" = [] +"builtin.cd" = [] +"builtin.colon" = [] +"builtin.command" = [] +"builtin.compgen" = [] +"builtin.complete" = [] +"builtin.compopt" = [] +"builtin.continue" = [] +"builtin.declare" = [] +"builtin.dirs" = [] +"builtin.dot" = [] +"builtin.echo" = [] +"builtin.enable" = [] +"builtin.eval" = [] +"builtin.exec" = [] +"builtin.exit" = [] +"builtin.export" = [] +"builtin.false" = [] +"builtin.fc" = [] +"builtin.fg" = [] +"builtin.getopts" = [] +"builtin.hash" = [] +"builtin.help" = [] +"builtin.history" = [] +"builtin.jobs" = [] +# The non-unix existence probe scans the process table. +"builtin.kill" = ["util.procs"] +"builtin.let" = [] +"builtin.mapfile" = [] +"builtin.popd" = [] +"builtin.printf" = [] +"builtin.pushd" = [] +"builtin.pwd" = [] +"builtin.read" = [] +"builtin.return" = [] +"builtin.set" = [] +"builtin.shift" = [] +"builtin.shopt" = [] +"builtin.suspend" = [] +"builtin.test" = [] +"builtin.times" = [] +"builtin.trap" = [] +"builtin.true" = [] +"builtin.type" = [] +"builtin.ulimit" = [] +"builtin.umask" = [] +"builtin.unalias" = [] +"builtin.unset" = [] +"builtin.wait" = [] + +# ── Utility builtins ────────────────────────────────────────────────────────── +# One feature per ported utility so a single utility can be built (and checked) +# in isolation. `utils` turns on the whole set and is part of `default`. +"util.b2sum" = ["util.cksum"] +"util.base32" = [] +"util.base64" = ["util.base32"] +"util.basename" = [] +"util.cat" = [] +"util.cksum" = [] +"util.cmp" = [] +"util.comm" = [] +"util.cut" = [] +"util.date" = [] +"util.diff" = [] +"util.dirname" = [] +"util.fd" = [] +"util.find" = [] +"util.grep" = [] +"util.head" = [] +"util.hostname" = [] +"util.jq" = [] +"util.ln" = [] +"util.ls" = [] +"util.md5sum" = ["util.cksum"] +"util.mkdir" = [] +"util.mktemp" = [] +"util.combine" = [] +"util.errno" = [] +"util.ifne" = [] +"util.isutf8" = [] +"util.sponge" = [] +"util.ts" = [] +"util.mv" = [] +"util.nproc" = [] +"util.paste" = [] +"util.nohup" = ["util.procs"] +"util.pgrep" = ["util.proc-match"] +"util.pidwait" = ["util.proc-match"] +"util.pkill" = ["util.proc-match"] +# Shared process-matching engine behind pgrep/pkill/pidwait. +"util.proc-match" = ["builtin.kill", "util.procs"] +# Shared process-table snapshot behind ps/top/pgrep/pkill/pidwait/kill. +"util.procs" = [] +"util.ps" = ["util.procs"] +"util.sleep" = [] +"util.timeout" = ["util.procs"] +"util.top" = ["util.procs"] +"util.printenv" = [] +"util.readlink" = [] +"util.realpath" = [] +# Shares the PCRE2 JIT probe with `grep`. +"util.rg" = ["util.grep"] +"util.rm" = [] +"util.sed" = [] +"util.seq" = [] +"util.sha1sum" = ["util.cksum"] +"util.sha224sum" = ["util.cksum"] +"util.sha256sum" = ["util.cksum"] +"util.sha384sum" = ["util.cksum"] +"util.sha512sum" = ["util.cksum"] +"util.sort" = [] +"util.stat" = [] +"util.tac" = [] +"util.tail" = ["util.tac"] +"util.tee" = [] +"util.touch" = [] +"util.tr" = [] +"util.truncate" = [] +"util.uname" = [] +"util.uniq" = [] +"util.wc" = [] +"util.which" = [] +"util.whoami" = [] +"util.xargs" = [] +"util.yes" = [] + +utils = [ + "util.b2sum", + "util.base32", + "util.base64", + "util.basename", + "util.cat", + "util.cksum", + "util.cmp", + "util.comm", + "util.cut", + "util.date", + "util.diff", + "util.dirname", + "util.fd", + "util.find", + "util.grep", + "util.head", + "util.hostname", + "util.jq", + "util.ln", + "util.ls", + "util.md5sum", + "util.mkdir", + "util.mktemp", + "util.combine", + "util.errno", + "util.ifne", + "util.isutf8", + "util.sponge", + "util.ts", + "util.mv", + "util.nproc", + "util.paste", + "util.nohup", + "util.pgrep", + "util.pidwait", + "util.pkill", + "util.proc-match", + "util.procs", + "util.ps", + "util.sleep", + "util.timeout", + "util.top", + "util.printenv", + "util.readlink", + "util.realpath", + "util.rg", + "util.rm", + "util.sed", + "util.seq", + "util.sha1sum", + "util.sha224sum", + "util.sha256sum", + "util.sha384sum", + "util.sha512sum", + "util.sort", + "util.stat", + "util.tac", + "util.tail", + "util.tee", + "util.touch", + "util.tr", + "util.truncate", + "util.uname", + "util.uniq", + "util.wc", + "util.which", + "util.whoami", + "util.xargs", + "util.yes", +] + +# Deliberately NOT `lints.workspace = true`: most of this crate is ported +# third-party code (brush's builtins, uutils, jaq), and holding 70k lines of +# it to the workspace's pedantic/nursery bar would bury real warnings. rustc +# warnings still apply and are kept at zero. +[lints.clippy] +all = { level = "allow", priority = -1 } +nursery = { level = "allow", priority = -1 } +pedantic = { level = "allow", priority = -1 } +cargo = { level = "allow", priority = -1 } + +[lints.rust] +unfulfilled_lint_expectations = { level = "allow", priority = -1 } diff --git a/crates/pi-builtins/LICENSE b/crates/pi-builtins/LICENSE new file mode 100644 index 000000000..f7cf8722c --- /dev/null +++ b/crates/pi-builtins/LICENSE @@ -0,0 +1,186 @@ +This crate began as a locally-patched copy of brush-builtins from the brush shell +project (https://github.com/reubeno/brush), used under the MIT License, and still +tracks it for the POSIX/bash builtins. + + Copyright (c) 2024 reuben olinsky + +Local modifications to the upstream builtins include: implementing +previously-stubbed builtins, the `wait` builtin (PID targeting plus the +`-f`/`-n`/`-p` flags), and cancellation support for the `read` builtin via poll. + +It additionally hosts the in-process command-line utility builtins (`src/host.rs` +plus one module per command). Those are ports of third-party programs, previously +carried as separate vendored crates and now consolidated here; the host plumbing +is ours, the utility logic is theirs. Their notices are reproduced in full +below. + +================================================================================ +uutils coreutils (https://github.com/uutils/coreutils), MIT +-------------------------------------------------------------------------------- +Covers: base32, base64, basename, cat, cksum (shared checksum machinery), +b2sum, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, comm, cut, +date, dirname, head, hostname, ln, ls, mkdir, mktemp, mv, nproc, paste, +printenv, readlink, realpath, rm, seq, sort, stat, tac, tail, tee, touch, tr, +truncate, uname, uniq, wc, whoami, yes. + + Copyright (c) uutils developers + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +================================================================================ +uutils findutils (https://github.com/uutils/findutils), MIT +-------------------------------------------------------------------------------- +Covers: find, xargs. + + Copyright (c) Google Inc. + Copyright (c) uutils developers + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +================================================================================ +uutils sed (https://github.com/uutils/sed), MIT +-------------------------------------------------------------------------------- +Covers: sed. + +MIT License + +Copyright (c) 2025 Diomidis Spinellis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +================================================================================ +jaq (https://github.com/01mf02/jaq), MIT +-------------------------------------------------------------------------------- +Covers: jq (the command-line front end; the interpreter itself remains an +external `jaq-core`/`jaq-std`/`jaq-json` dependency). + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +================================================================================ +rust-utf8 (https://github.com/SimonSapin/rust-utf8), MIT +-------------------------------------------------------------------------------- +Covers: the incremental UTF-8 decoder inside `src/wc.rs`. + +Copyright (c) Simon Sapin and many others + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +================================================================================ +Original work in this crate (`src/host.rs`, `src/proc_snapshot.rs`, +`src/proc_match.rs`, `cmp`, `diff`, `fd`, `grep`/`rg`, `which`, `ps`, `top`, +`pgrep`, `pkill`, `pidwait`, `sleep`, `timeout`, `nohup`, and the +moreutils-inspired `ts`, `sponge`, `ifne`, `isutf8`, `combine`, `errno`) is +MIT-licensed under the workspace license: + +MIT License + +Copyright (c) 2025 Mario Zechner +Copyright (c) 2025-2026 Can Bölük + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/crates/pi-builtins/README.md b/crates/pi-builtins/README.md new file mode 100644 index 000000000..caeb9d737 --- /dev/null +++ b/crates/pi-builtins/README.md @@ -0,0 +1,69 @@ +# pi-builtins + +Every builtin the embedded shell installs. Two layers: + +1. **Shell builtins** — `cd`, `echo`, `test`, `printf`, `read`, `export`, `trap`, + `wait`, … A locally-patched fork of + [`brush-builtins`](https://github.com/reubeno/brush) (MIT), tracking upstream + except where noted in `LICENSE`. +2. **In-process command-line utilities** — `cat`, `grep`/`rg`, `sed`, `ls`, + `find`, `sort`, `jq`, `fd`, `diff`, `xargs`, `ps`, `top`, `kill`, the + moreutils set, and ~50 more. One module per command, in `src/.rs`. + +The second layer exists so the shell never has to fork: a long-lived embedded +shell resolves these names itself, on every platform, whether or not the host +has the real binaries. They were previously ~50 separate vendored crates driven +through a thread-local I/O shim; consolidating them here removed the shim. + +## The `Host` contract + +`src/host.rs` is the whole story for a utility builtin. A utility is a `clap` +argument model plus a synchronous body: + +```rust +pub(crate) trait Utility: clap::Parser + Send + Sync + 'static { + const NAME: &'static str; + const USAGE_ERROR: u8 = 1; + fn run(self, host: &mut Host) -> i32; +} +``` + +`Host` is the shell as the utility sees it, threaded explicitly rather than +through process globals or thread locals: the command's own stdio (`host.stdout`, +`host.stderr`, `host.stdin`), the shell's working directory (`host.resolve(path)` +— mandatory for every path argument, since the host process's current directory +is unrelated), the exported environment (`host.var`, `host.env`), cancellation +(`host.is_cancelled`), a child-process launcher that inherits all of the above +(`host.child_env()`), and the accumulated exit status (`host.fail`, +`host.exit_code`). + +`host::util::()` wraps a `Utility` into a registration that handles, once +for all of them: process-substitution arguments (`diff <(a) <(b)`), +`--help`/`--version` on stdout with status 0, usage errors on stderr, execution +on a blocking thread, the shell's cancellation token, and panic containment. + +Utilities that are genuinely async — `sleep`, `timeout`, `ps`, `top`, `pgrep`, +`kill`, `nohup` — implement `brush_core::builtins::Command` directly instead. + +## Registration + +Three entry points, so the embedding shell decides what to install: + +| Function | Contents | +| --- | --- | +| `default_builtins(set)` | The POSIX/bash builtins, per `BuiltinSet`. | +| `utility_builtins()` | The coreutils-style commands, which shadow system binaries. | +| `process_builtins()` | `ps`, `top`, `pgrep`, `pkill`, `pidwait`, `sleep`, `timeout`, `nohup`. | + +Every command is behind a cargo feature (`builtin.`, `util.`), so a +single one can be built and tested in isolation: + +```console +$ cargo test -p pi-builtins --no-default-features --features base,util.sed +``` + +## Licensing + +MIT throughout, but the ported utilities carry upstream notices — uutils +coreutils, uutils findutils, uutils sed, jaq, and rust-utf8. See `LICENSE`, which +reproduces each in full and lists which commands it covers. diff --git a/crates/vendor/brush-builtins/src/alias.rs b/crates/pi-builtins/src/alias.rs similarity index 100% rename from crates/vendor/brush-builtins/src/alias.rs rename to crates/pi-builtins/src/alias.rs diff --git a/crates/pi-builtins/src/b2sum.rs b/crates/pi-builtins/src/b2sum.rs new file mode 100644 index 000000000..bd575d151 --- /dev/null +++ b/crates/pi-builtins/src/b2sum.rs @@ -0,0 +1,69 @@ +//! `b2sum` builtin: compute and check BLAKE2b digests. +//! +//! Ported from uutils coreutils 0.8.0. + +use brush_core::{ShellExtensions, builtins::Registration}; +use clap::ArgMatches; +use uucore::checksum::{AlgoKind, BlakeLength, parse_blake_length}; + +use crate::{ + cksum, + host::{Host, Utility, matches_parser, util}, +}; + +/// Parsed `b2sum` invocation. +pub(crate) struct B2sum { + matches: ArgMatches, +} + +matches_parser!(B2sum, app); + +impl Utility for B2sum { + const NAME: &'static str = "b2sum"; + const USAGE_ERROR: u8 = 2; + + fn run(self, host: &mut Host) -> i32 { + let length = self + .matches + .get_one::("length") + .map(|value| parse_blake_length(AlgoKind::Blake2b, BlakeLength::String(value))) + .transpose(); + let length = match length { + Ok(length) => length, + Err(error) => { + host.error(error, 1); + return 1; + }, + }; + cksum::run(host, AlgoKind::Blake2b, self.matches, length) + } +} + +fn app() -> clap::Command { + cksum::command(B2sum::NAME, true) +} + +/// Creates the `b2sum` builtin registration. +pub(crate) fn b2sum_builtin() -> Registration { + util::() +} + +#[cfg(test)] +mod tests { + use super::B2sum; + use crate::host::run_util; + + #[test] + fn length_selects_the_blake2b_output_size() { + let (code, capture) = run_util::(&["-l", "8"], "abc", "/"); + assert_eq!(code, 0); + assert_eq!(capture.out(), "6b -\n"); + } + + #[test] + fn length_must_be_a_multiple_of_eight() { + let (code, capture) = run_util::(&["-l", "7"], "", "/"); + assert_eq!(code, 1); + assert!(capture.err().contains("multiple of 8"), "{}", capture.err()); + } +} diff --git a/crates/vendor/uu-base32/src/base_common.rs b/crates/pi-builtins/src/base32.rs similarity index 75% rename from crates/vendor/uu-base32/src/base_common.rs rename to crates/pi-builtins/src/base32.rs index bafbb3e9b..236bf4474 100644 --- a/crates/vendor/uu-base32/src/base_common.rs +++ b/crates/pi-builtins/src/base32.rs @@ -1,30 +1,78 @@ -// This file is part of the uutils coreutils package. -// -// For the full copyright and license information, please view the LICENSE -// file that was distributed with this source code. - -// spell-checker:ignore hexupper lsbf msbf unpadded nopad aGVsbG8sIHdvcmxkIQ +//! `base32` builtin: encode or decode data using the RFC 4648 base32 alphabet. +//! +//! Ported from uutils coreutils 0.8.0. use std::{ + fmt, ffi::OsString, fs::File, io::{self, BufRead, BufReader, Write}, - path::Path, }; +use brush_core::{ShellExtensions, builtins::Registration}; +use clap::ArgMatches; + +use crate::host::{Host, Utility, matches_parser, util}; + +const ABOUT: &str = "encode/decode data and print to standard output\nWith no FILE, or when FILE is -, read standard input.\n\nThe data are encoded as described for the base32 alphabet in RFC 4648.\nWhen decoding, the input may contain newlines in addition to the bytes of the formal base32 alphabet. Use --ignore-garbage to attempt to recover from any other non-alphabet bytes in the encoded stream."; + +/// Parsed `base32` invocation. +pub(crate) struct Base32 { + matches: ArgMatches, +} + +matches_parser!(Base32, app); + +impl Utility for Base32 { + const NAME: &'static str = "base32"; + + fn run(self, host: &mut Host) -> i32 { + run_base(&self.matches, Format::Base32, host) + } +} + +fn app() -> Command { + base_app(Base32::NAME, ABOUT, "base32 [OPTION]... [FILE]") +} + +/// Creates the `base32` builtin registration. +pub(crate) fn base32_builtin() -> Registration { + util::() +} + +#[derive(Debug)] +struct BaseError(String); + +impl BaseError { + fn new(message: impl Into) -> Self { + Self(message.into()) + } +} + +impl fmt::Display for BaseError { + fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + formatter.write_str(&self.0) + } +} + +impl From for BaseError { + fn from(error: io::Error) -> Self { + Self(error.to_string()) + } +} + +type BaseResult = Result; + use clap::{Arg, ArgAction, Command}; use uucore::{ display::Quotable, encoding::{ - BASE2LSBF, BASE2MSBF, Base32Wrapper, Base58Wrapper, Base64SimdWrapper, EncodingWrapper, - Format, SupportsFastDecodeAndEncode, Z85Wrapper, for_base_common::{BASE32, BASE32HEX, BASE64URL, HEXUPPER_PERMISSIVE}, + Base32Wrapper, Base58Wrapper, Base64SimdWrapper, EncodingWrapper, Format, + SupportsFastDecodeAndEncode, Z85Wrapper, BASE2LSBF, BASE2MSBF, }, - error::{FromIo, UResult, USimpleError, UUsageError, strip_errno}, - format_usage, }; - -pub const BASE_CMD_PARSE_ERROR: i32 = 1; +const BASE_CMD_PARSE_ERROR: i32 = 1; /// Encoded output will be formatted in lines of this length (the last line can /// be shorter) @@ -32,37 +80,34 @@ pub const BASE_CMD_PARSE_ERROR: i32 = 1; /// Other implementations default to 76 /// /// This default is only used if no "-w"/"--wrap" argument is passed -pub const WRAP_DEFAULT: usize = 76; +const WRAP_DEFAULT: usize = 76; // Fixed to 8 KiB (equivalent to `std::sys::io::DEFAULT_BUF_SIZE` on most // targets) -pub const DEFAULT_BUF_SIZE: usize = 8 * 1024; +const DEFAULT_BUF_SIZE: usize = 8 * 1024; -pub struct Config { - pub decode: bool, - pub ignore_garbage: bool, - pub wrap_cols: Option, - pub to_read: Option, +struct Config { + decode: bool, + ignore_garbage: bool, + wrap_cols: Option, + to_read: Option, } -pub mod options { - pub static DECODE: &str = "decode"; - pub static WRAP: &str = "wrap"; - pub static IGNORE_GARBAGE: &str = "ignore-garbage"; - pub static FILE: &str = "file"; +mod options { + pub(super) static DECODE: &str = "decode"; + pub(super) static WRAP: &str = "wrap"; + pub(super) static IGNORE_GARBAGE: &str = "ignore-garbage"; + pub(super) static FILE: &str = "file"; } impl Config { - pub fn from(options: &clap::ArgMatches) -> UResult { + fn from(options: &clap::ArgMatches) -> BaseResult { let to_read = match options.get_many::(options::FILE) { Some(mut values) => { let name = values.next().unwrap(); if let Some(extra_op) = values.next() { - return Err(UUsageError::new( - BASE_CMD_PARSE_ERROR, - format!("extra operand {}", extra_op.quote()), - )); + return Err(BaseError::new(format!("extra operand {}", extra_op.quote()))); } if name == "-" { @@ -78,10 +123,7 @@ impl Config { .get_one::(options::WRAP) .map(|num| { num.parse::().map_err(|_| { - USimpleError::new( - BASE_CMD_PARSE_ERROR, - format!("invalid wrap size: {}", num.quote()), - ) + BaseError::new(format!("invalid wrap size: {}", num.quote())) }) }) .transpose()?; @@ -95,16 +137,14 @@ impl Config { } } -pub fn base_app(about: String, usage: String) -> Command { - let cmd = Command::new("") - .version(uucore::crate_version!()) +/// Builds the shared command-line model used by base32 and base64. +pub(crate) fn base_app(name: &'static str, about: &'static str, usage: &'static str) -> Command { + Command::new(name) + .version("0.8.0") .about(about) - .override_usage(format_usage(&usage)) - .infer_long_args(true); - uucore::clap_localization::configure_localized_command(cmd) - // Format arguments. + .override_usage(crate::host::format_usage(usage)) + .infer_long_args(true) .arg( - // pi-uutils: macOS base64 accepts `-D` as a non-visible decode alias. Arg::new(options::DECODE) .short('d') .short_alias('D') @@ -127,13 +167,10 @@ pub fn base_app(about: String, usage: String) -> Command { .long(options::WRAP) .value_name("COLS") .help(format!( - "wrap encoded lines after COLS character (default {WRAP_DEFAULT}, 0 to disable \ - wrapping)" + "wrap encoded lines after COLS character (default {WRAP_DEFAULT}, 0 to disable wrapping)" )) .overrides_with(options::WRAP), ) - // "multiple" arguments are used to check whether there is more than one - // file passed in. .arg( Arg::new(options::FILE) .index(1) @@ -143,27 +180,49 @@ pub fn base_app(about: String, usage: String) -> Command { ) } -pub fn get_input(config: &Config) -> UResult> { - match &config.to_read { - Some(name) => { - let file = File::open(pi_uutils_ctx::resolve(Path::new(name))) - .map_err_context(|| name.maybe_quote().to_string())?; - Ok(Box::new(BufReader::with_capacity(DEFAULT_BUF_SIZE, file))) +/// Runs the shared base-encoding implementation against the selected format. +pub(crate) fn run_base(matches: &ArgMatches, format: Format, host: &mut Host) -> i32 { + let config = match Config::from(matches) { + Ok(config) => config, + Err(error) => { + host.error(error, BASE_CMD_PARSE_ERROR); + return BASE_CMD_PARSE_ERROR; }, - None => { - // pi-uutils: stdin belongs to this invocation, never the host process. - Ok(Box::new(BufReader::with_capacity(DEFAULT_BUF_SIZE, pi_uutils_ctx::stdin()))) + }; + + let result = if let Some(name) = config.to_read.clone() { + match File::open(host.resolve(&name)) { + Ok(file) => { + let mut input = BufReader::with_capacity(DEFAULT_BUF_SIZE, file); + handle_input(&mut input, &mut host.stdout, format, config) + }, + Err(error) => Err(BaseError::new(format!("{}: {error}", name.maybe_quote()))), + } + } else { + let mut input = BufReader::with_capacity(DEFAULT_BUF_SIZE, &mut host.stdin); + handle_input(&mut input, &mut host.stdout, format, config) + }; + + match result { + Ok(()) => host.exit_code(), + Err(error) => { + host.error(error, 1); + 1 }, } } -pub fn handle_input(input: &mut R, format: Format, config: Config) -> UResult<()> { + +fn handle_input( + input: &mut R, + output: &mut dyn Write, + format: Format, + config: Config, +) -> BaseResult<()> { // Always allow padding for Base64 to avoid a full pre-scan of the input. let supports_fast_decode_and_encode = get_supports_fast_decode_and_encode(format, config.decode, true); let supports_fast_decode_and_encode_ref = supports_fast_decode_and_encode.as_ref(); - // pi-uutils: all output is scoped to this invocation. - let mut stdout_lock = pi_uutils_ctx::stdout().lock(); let result = match (format, config.decode) { // Base58 must process the entire input as one big integer; keep the // historical behavior of buffering everything for this format only. @@ -171,18 +230,18 @@ pub fn handle_input(input: &mut R, format: Format, config: Config) - let mut buffered = Vec::new(); input .read_to_end(&mut buffered) - .map_err(|err| USimpleError::new(1, format_read_error(&err)))?; + .map_err(|err| BaseError::new(format_read_error(&err)))?; if config.decode { fast_decode::fast_decode_buffer( buffered, - &mut stdout_lock, + output, supports_fast_decode_and_encode_ref, config.ignore_garbage, ) } else { fast_encode::fast_encode_buffer( buffered, - &mut stdout_lock, + output, supports_fast_decode_and_encode_ref, config.wrap_cols, ) @@ -191,13 +250,13 @@ pub fn handle_input(input: &mut R, format: Format, config: Config) - // Streaming path for all other encodings keeps memory bounded. (_, true) => fast_decode::fast_decode_stream( input, - &mut stdout_lock, + output, supports_fast_decode_and_encode_ref, config.ignore_garbage, ), (_, false) => fast_encode::fast_encode_stream( input, - &mut stdout_lock, + output, supports_fast_decode_and_encode_ref, config.wrap_cols, ), @@ -205,14 +264,14 @@ pub fn handle_input(input: &mut R, format: Format, config: Config) - // Ensure any pending stdout buffer is flushed even if decoding failed; GNU // basenc keeps already-decoded bytes visible before reporting the error. - match (result, stdout_lock.flush()) { + match (result, output.flush()) { (res, Ok(())) => res, (Ok(_), Err(err)) => Err(err.into()), (Err(original), Err(_)) => Err(original), } } -pub fn get_supports_fast_decode_and_encode( +fn get_supports_fast_decode_and_encode( format: Format, decode: bool, has_padding: bool, @@ -232,35 +291,30 @@ pub fn get_supports_fast_decode_and_encode( HEXUPPER_PERMISSIVE, BASE16_VALID_DECODING_MULTIPLE, BASE16_UNPADDED_MULTIPLE, - // spell-checker:disable-next-line b"0123456789ABCDEFabcdef", )), Format::Base2Lsbf => Box::from(EncodingWrapper::new( BASE2LSBF, BASE2_VALID_DECODING_MULTIPLE, BASE2_UNPADDED_MULTIPLE, - // spell-checker:disable-next-line b"01", )), Format::Base2Msbf => Box::from(EncodingWrapper::new( BASE2MSBF, BASE2_VALID_DECODING_MULTIPLE, BASE2_UNPADDED_MULTIPLE, - // spell-checker:disable-next-line b"01", )), Format::Base32 => Box::from(Base32Wrapper::new( BASE32, BASE32_VALID_DECODING_MULTIPLE, BASE32_UNPADDED_MULTIPLE, - // spell-checker:disable-next-line b"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=", )), Format::Base32Hex => Box::from(Base32Wrapper::new( BASE32HEX, BASE32_VALID_DECODING_MULTIPLE, BASE32_UNPADDED_MULTIPLE, - // spell-checker:disable-next-line b"0123456789ABCDEFGHIJKLMNOPQRSTUV=", )), Format::Base64 => { @@ -281,7 +335,6 @@ pub fn get_supports_fast_decode_and_encode( BASE64URL, BASE64_VALID_DECODING_MULTIPLE, BASE64_UNPADDED_MULTIPLE, - // spell-checker:disable-next-line b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789=_-", )), Format::Z85 => Box::from(Z85Wrapper {}), @@ -289,7 +342,7 @@ pub fn get_supports_fast_decode_and_encode( } } -pub mod fast_encode { +mod fast_encode { use std::{ cmp::min, collections::VecDeque, @@ -297,12 +350,9 @@ pub mod fast_encode { num::NonZeroUsize, }; - use uucore::{ - encoding::SupportsFastDecodeAndEncode, - error::{UResult, USimpleError}, - }; + use uucore::encoding::SupportsFastDecodeAndEncode; - use crate::base_common::WRAP_DEFAULT; + use super::{BaseError, BaseResult, WRAP_DEFAULT}; struct LineWrapping { line_length: NonZeroUsize, @@ -314,8 +364,9 @@ pub mod fast_encode { supports_fast_decode_and_encode: &dyn SupportsFastDecodeAndEncode, read_buffer: &[u8], encoded_buffer: &mut VecDeque, - ) -> UResult<()> { - supports_fast_decode_and_encode.encode_to_vec_deque(read_buffer, encoded_buffer)?; + ) -> BaseResult<()> { + supports_fast_decode_and_encode.encode_to_vec_deque(read_buffer, encoded_buffer) + .map_err(|err| BaseError::new(err.to_string()))?; Ok(()) } @@ -402,12 +453,12 @@ pub mod fast_encode { } // End of helper functions - pub fn fast_encode_buffer( + pub(super) fn fast_encode_buffer( input: Vec, output: &mut dyn Write, supports_fast_decode_and_encode: &dyn SupportsFastDecodeAndEncode, wrap: Option, - ) -> UResult<()> { + ) -> BaseResult<()> { // Based on performance testing const ENCODE_IN_CHUNKS_OF_SIZE_MULTIPLE: usize = 1_024; @@ -488,7 +539,8 @@ pub mod fast_encode { { // Encode all remaining unencoded bytes, placing them in `encoded_buffer` supports_fast_decode_and_encode - .encode_to_vec_deque(leftover_buffer.make_contiguous(), &mut encoded_buffer)?; + .encode_to_vec_deque(leftover_buffer.make_contiguous(), &mut encoded_buffer) + .map_err(|err| BaseError::new(err.to_string()))?; // Write all data in `encoded_buffer` to output // `is_cleanup` triggers special cleanup-only logic @@ -508,13 +560,13 @@ pub mod fast_encode { /// - `None`: the default wrap width is applied. /// /// Remaining bytes are encoded and flushed at the end. I/O or encoding - /// failures are propagated via `UResult`. - pub fn fast_encode_stream( + /// failures are propagated through the shared result type. + pub(super) fn fast_encode_stream( input: &mut dyn BufRead, output: &mut dyn Write, supports_fast_decode_and_encode: &dyn SupportsFastDecodeAndEncode, wrap: Option, - ) -> UResult<()> { + ) -> BaseResult<()> { const ENCODE_IN_CHUNKS_OF_SIZE_MULTIPLE: usize = 1_024; let encode_in_chunks_of_size = @@ -541,7 +593,7 @@ pub mod fast_encode { loop { let read_buffer = input .fill_buf() - .map_err(|err| USimpleError::new(1, super::format_read_error(&err)))?; + .map_err(|err| BaseError::new(super::format_read_error(&err)))?; if read_buffer.is_empty() { break; } @@ -606,7 +658,8 @@ pub mod fast_encode { } // Encode any remaining bytes and flush - supports_fast_decode_and_encode.encode_to_vec_deque(&leftover_buffer, &mut encoded_buffer)?; + supports_fast_decode_and_encode.encode_to_vec_deque(&leftover_buffer, &mut encoded_buffer) + .map_err(|err| BaseError::new(err.to_string()))?; write_to_output(&mut line_wrapping, &mut encoded_buffer, output, true, wrap == Some(0))?; @@ -614,13 +667,12 @@ pub mod fast_encode { } } -pub mod fast_decode { +mod fast_decode { use std::io::{self, BufRead, Write}; - use uucore::{ - encoding::SupportsFastDecodeAndEncode, - error::{UResult, USimpleError}, - }; + use uucore::encoding::SupportsFastDecodeAndEncode; + + use super::{BaseError, BaseResult}; // Start of helper functions fn alphabet_lookup(alphabet: &[u8]) -> [bool; 256] { @@ -639,8 +691,9 @@ pub mod fast_decode { supports_fast_decode_and_encode: &dyn SupportsFastDecodeAndEncode, read_buffer_filtered: &[u8], decoded_buffer: &mut Vec, - ) -> UResult<()> { - supports_fast_decode_and_encode.decode_into_vec(read_buffer_filtered, decoded_buffer)?; + ) -> BaseResult<()> { + supports_fast_decode_and_encode.decode_into_vec(read_buffer_filtered, decoded_buffer) + .map_err(|err| BaseError::new(err.to_string()))?; Ok(()) } @@ -660,7 +713,7 @@ pub mod fast_decode { supports_fast_decode_and_encode: &dyn SupportsFastDecodeAndEncode, decoded_buffer: &mut Vec, output: &mut dyn Write, - ) -> UResult<()> { + ) -> BaseResult<()> { // While at least one full decode block is buffered, keep draining // it and never yield more than block_limit per chunk. while buffer.len() >= valid_multiple { @@ -686,12 +739,12 @@ pub mod fast_decode { } // End of helper functions - pub fn fast_decode_buffer( + pub(super) fn fast_decode_buffer( input: Vec, output: &mut dyn Write, supports_fast_decode_and_encode: &dyn SupportsFastDecodeAndEncode, ignore_garbage: bool, - ) -> UResult<()> { + ) -> BaseResult<()> { const DECODE_IN_CHUNKS_OF_SIZE_MULTIPLE: usize = 1_024; let alphabet = supports_fast_decode_and_encode.alphabet(); @@ -723,7 +776,7 @@ pub mod fast_decode { } else if ignore_garbage { continue; } else { - return Err(USimpleError::new(1, "error: invalid input")); + return Err(BaseError::new("error: invalid input")); } if supports_partial_decode { @@ -768,23 +821,24 @@ pub mod fast_decode { let final_chunk = owned_chunk.as_deref().unwrap_or(&buffer); - supports_fast_decode_and_encode.decode_into_vec(final_chunk, &mut decoded_buffer)?; + supports_fast_decode_and_encode.decode_into_vec(final_chunk, &mut decoded_buffer) + .map_err(|err| BaseError::new(err.to_string()))?; write_to_output(&mut decoded_buffer, output)?; if had_invalid_tail { - return Err(USimpleError::new(1, "error: invalid input")); + return Err(BaseError::new("error: invalid input")); } } Ok(()) } - pub fn fast_decode_stream( + pub(super) fn fast_decode_stream( input: &mut dyn BufRead, output: &mut dyn Write, supports_fast_decode_and_encode: &dyn SupportsFastDecodeAndEncode, ignore_garbage: bool, - ) -> UResult<()> { + ) -> BaseResult<()> { const DECODE_IN_CHUNKS_OF_SIZE_MULTIPLE: usize = 1_024; let alphabet = supports_fast_decode_and_encode.alphabet(); @@ -803,7 +857,7 @@ pub mod fast_decode { loop { let read_buffer = input .fill_buf() - .map_err(|err| USimpleError::new(1, super::format_read_error(&err)))?; + .map_err(|err| BaseError::new(super::format_read_error(&err)))?; let read_len = read_buffer.len(); if read_len == 0 { break; @@ -839,7 +893,7 @@ pub mod fast_decode { buffer.drain(..decode_in_chunks_of_size); } } - return Err(USimpleError::new(1, "error: invalid input")); + return Err(BaseError::new("error: invalid input")); } if supports_partial_decode { @@ -887,11 +941,12 @@ pub mod fast_decode { let final_chunk = owned_chunk.as_deref().unwrap_or(&buffer); - supports_fast_decode_and_encode.decode_into_vec(final_chunk, &mut decoded_buffer)?; + supports_fast_decode_and_encode.decode_into_vec(final_chunk, &mut decoded_buffer) + .map_err(|err| BaseError::new(err.to_string()))?; write_to_output(&mut decoded_buffer, output)?; if had_invalid_tail { - return Err(USimpleError::new(1, "error: invalid input")); + return Err(BaseError::new("error: invalid input")); } } @@ -900,40 +955,72 @@ pub mod fast_decode { } fn format_read_error(error: &io::Error) -> String { - format!("read error: {}", strip_errno(error)) + format!("read error: {}", error) } -/// Determines if the input buffer contains any padding ('=') ignoring trailing -/// whitespace. #[cfg(test)] -fn read_and_has_padding(input: &mut R) -> UResult<(bool, Vec)> { - let mut buf = Vec::new(); +fn read_and_has_padding(input: &mut R) -> BaseResult<(bool, Vec)> { + let mut buffer = Vec::new(); input - .read_to_end(&mut buf) - .map_err(|err| USimpleError::new(1, format_read_error(&err)))?; - - // Treat the stream as padded if any '=' exists (GNU coreutils continues - // decoding even when padding bytes are followed by more data). - let has_padding = buf.contains(&b'='); - - Ok((has_padding, buf)) + .read_to_end(&mut buffer) + .map_err(|error| BaseError::new(format_read_error(&error)))?; + let has_padding = buffer.contains(&b'='); + Ok((has_padding, buffer)) } + #[cfg(test)] mod tests { - use std::io::Cursor; + use std::fs; - use crate::base_common::read_and_has_padding; + use super::{Base32, read_and_has_padding}; + use crate::host::run_util; #[test] - fn test_has_padding() { - let test_cases = vec![ + fn encodes_stdin() { + let (code, capture) = run_util::(&[], "hello", "/"); + assert_eq!(code, 0); + assert_eq!(capture.out(), "NBSWY3DP\n"); + } + + #[test] + fn decodes_stdin() { + let (code, capture) = run_util::(&["--decode"], "NBSWY3DP\n", "/"); + assert_eq!(code, 0); + assert_eq!(capture.stdout(), b"hello"); + } + + #[test] + fn wraps_encoded_output_at_requested_width() { + let (code, capture) = run_util::(&["--wrap", "4"], "hello", "/"); + assert_eq!(code, 0); + assert_eq!(capture.out(), "NBSW\nY3DP\n"); + } + + #[test] + fn resolves_file_operand_against_shell_cwd() { + let cwd = tempfile::tempdir().unwrap(); + fs::write(cwd.path().join("input"), b"hello").unwrap(); + let (code, capture) = run_util::(&["input"], "", cwd.path()); + assert_eq!(code, 0); + assert_eq!(capture.out(), "NBSWY3DP\n"); + } + + #[test] + fn rejects_invalid_input() { + let (code, capture) = run_util::(&["--decode"], "!", "/"); + assert_eq!(code, 1); + assert_eq!(capture.err(), "base32: error: invalid input\n"); + } + + #[test] + fn detects_padding_anywhere_in_input() { + let test_cases = [ ("aGVsbG8sIHdvcmxkIQ==", true), ("aGVsbG8sIHdvcmxkIQ== ", true), ("aGVsbG8sIHdvcmxkIQ==\n", true), ("aGVsbG8sIHdvcmxkIQ== \n", true), ("aGVsbG8sIHdvcmxkIQ=", true), - ("aGVsbG8sIHdvcmxkIQ= ", true), ("MTIzNA==MTIzNA", true), ("MTIzNA==\nMTIzNA", true), ("aGVsbG8sIHdvcmxkIQ \n", false), @@ -941,12 +1028,8 @@ mod tests { ]; for (input, expected) in test_cases { - let mut cursor = Cursor::new(input.as_bytes()); - assert_eq!( - read_and_has_padding(&mut cursor).unwrap().0, - expected, - "Failed for input: '{input}'" - ); + let (has_padding, _) = read_and_has_padding(&mut input.as_bytes()).unwrap(); + assert_eq!(has_padding, expected, "failed for input: '{input}'"); } } } diff --git a/crates/pi-builtins/src/base64.rs b/crates/pi-builtins/src/base64.rs new file mode 100644 index 000000000..944072d40 --- /dev/null +++ b/crates/pi-builtins/src/base64.rs @@ -0,0 +1,106 @@ +//! `base64` builtin: encode or decode data using the Base64 alphabet. +//! +//! Ported from uutils coreutils 0.8.0. + +use brush_core::{ShellExtensions, builtins::Registration}; +use clap::{ArgMatches, Command}; +use uucore::encoding::Format; + +use crate::{ + base32::{base_app, run_base}, + host::{Host, Utility, matches_parser, util}, +}; + +const ABOUT: &str = "encode/decode data and print to standard output\nWith no FILE, or when FILE is -, read standard input.\n\nThe data are encoded as described for the base64 alphabet in RFC 3548.\nWhen decoding, the input may contain newlines in addition to the bytes of the formal base64 alphabet. Use --ignore-garbage to attempt to recover from any other non-alphabet bytes in the encoded stream."; + +/// Parsed `base64` invocation. +pub(crate) struct Base64 { + matches: ArgMatches, +} + +matches_parser!(Base64, app); + +impl Utility for Base64 { + const NAME: &'static str = "base64"; + + fn run(self, host: &mut Host) -> i32 { + run_base(&self.matches, Format::Base64, host) + } +} + +/// The `base64` argument model. +fn app() -> Command { + base_app(Base64::NAME, ABOUT, "base64 [OPTION]... [FILE]") +} + +/// Creates the `base64` builtin registration. +pub(crate) fn base64_builtin() -> Registration { + util::() +} + +#[cfg(test)] +mod tests { + use super::Base64; + use crate::host::run_util; + + #[test] + fn macos_decode_alias_round_trips_and_gnu_alias_still_works() { + let (code, encoded) = run_util::(&[], "hello", "/"); + assert_eq!(code, 0); + assert_eq!(encoded.out(), "aGVsbG8=\n"); + assert_eq!(encoded.err(), ""); + + let (code, decoded) = run_util::(&["-D"], &encoded.out(), "/"); + assert_eq!(code, 0); + assert_eq!(decoded.out(), "hello"); + assert_eq!(decoded.err(), ""); + + let (code, decoded) = run_util::(&["-d"], &encoded.out(), "/"); + assert_eq!(code, 0); + assert_eq!(decoded.out(), "hello"); + assert_eq!(decoded.err(), ""); + } + + #[test] + fn wrap_controls_encoded_line_width() { + let (code, capture) = run_util::(&["-w", "4"], "hello", "/"); + assert_eq!(code, 0); + assert_eq!(capture.out(), "aGVs\nbG8=\n"); + assert_eq!(capture.err(), ""); + } + + #[test] + fn ignore_garbage_recovers_non_alphabet_bytes() { + let (code, capture) = run_util::(&["-d", "-i"], "aG$Vs$bG8=\n", "/"); + assert_eq!(code, 0); + assert_eq!(capture.out(), "hello"); + assert_eq!(capture.err(), ""); + } + + #[test] + fn dash_operand_reads_standard_input() { + let (code, capture) = run_util::(&["-"], "hello", "/"); + assert_eq!(code, 0); + assert_eq!(capture.out(), "aGVsbG8=\n"); + assert_eq!(capture.err(), ""); + } + + #[test] + fn invalid_encoded_input_exits_one() { + let (code, capture) = run_util::(&["-d"], "!", "/"); + assert_eq!(code, 1); + assert_eq!(capture.out(), ""); + assert_eq!(capture.err(), "base64: error: invalid input\n"); + } + + #[test] + fn file_operand_resolves_against_shell_working_directory() { + let dir = tempfile::tempdir().unwrap(); + std::fs::write(dir.path().join("input"), b"hello").unwrap(); + + let (code, capture) = run_util::(&["input"], "ignored", dir.path()); + assert_eq!(code, 0); + assert_eq!(capture.out(), "aGVsbG8=\n"); + assert_eq!(capture.err(), ""); + } +} diff --git a/crates/pi-builtins/src/basename.rs b/crates/pi-builtins/src/basename.rs new file mode 100644 index 000000000..558c65c9d --- /dev/null +++ b/crates/pi-builtins/src/basename.rs @@ -0,0 +1,208 @@ +//! `basename` builtin: print a path with leading directory components (and +//! optionally a trailing suffix) removed. +//! +//! Ported from uutils coreutils 0.8.0. + +use std::{ffi::OsString, io::Write, path::PathBuf}; + +use brush_core::{ShellExtensions, builtins::Registration}; +use clap::{Arg, ArgAction, ArgMatches, Command, builder::ValueParser}; +use uucore::{display::Quotable, line_ending::LineEnding}; + +use crate::host::{Host, Utility, format_usage, matches_parser, os_bytes, util}; + +mod options { + pub static MULTIPLE: &str = "multiple"; + pub static NAME: &str = "name"; + pub static SUFFIX: &str = "suffix"; + pub static ZERO: &str = "zero"; +} + +/// Parsed `basename` invocation. +pub(crate) struct Basename { + matches: ArgMatches, +} + +matches_parser!(Basename, app); + +impl Utility for Basename { + const NAME: &'static str = "basename"; + + fn run(self, host: &mut Host) -> i32 { + let line_ending = LineEnding::from_zero_flag(self.matches.get_flag(options::ZERO)); + + let mut names = self + .matches + .get_many::(options::NAME) + .unwrap_or_default() + .collect::>(); + if names.is_empty() { + host.error("missing operand", 1); + return 1; + } + + // A suffix operand (or -a) switches from the two-operand "simple format" + // (`basename PATH SUFFIX`) to "strip this suffix from every operand". + let explicit_suffix = self.matches.get_one::(options::SUFFIX); + let suffix = if explicit_suffix.is_some() || self.matches.get_flag(options::MULTIPLE) { + explicit_suffix.cloned().unwrap_or_default() + } else { + match names.len() { + 1 => OsString::default(), + 2 => names.pop().cloned().unwrap_or_default(), + _ => { + host.error(format!("extra operand {}", names[2].quote()), 1); + return 1; + }, + } + }; + + for name in names { + let Some(stripped) = basename(name, &suffix) else { + host.error(format!("invalid argument {}", name.quote()), 1); + return 1; + }; + if host.stdout.write_all(&stripped).is_err() || write!(host.stdout, "{line_ending}").is_err() + { + return 1; + } + } + if host.stdout.flush().is_err() { + return 1; + } + host.exit_code() + } +} + +/// The final path component of `fullname`, minus `suffix`. +/// +/// Returns bytes rather than an `OsString` because the result is written +/// straight out, and `None` when the operand has no byte representation on this +/// platform. +fn basename(fullname: &OsString, suffix: &OsString) -> Option> { + let fullname_bytes = os_bytes(fullname)?; + + // `a/.` names the directory `a`, whose basename is `.`. + if fullname_bytes.ends_with(b"/.") { + return Some(b".".into()); + } + + let path = PathBuf::from(fullname); + let Some(last) = path.components().next_back() else { + return Some(Vec::new()); + }; + + let name = last.as_os_str(); + let name_bytes = os_bytes(name)?; + // Stripping the whole component would leave nothing, so GNU keeps it. + if name == suffix.as_os_str() { + return Some(name_bytes.into()); + } + let suffix_bytes = os_bytes(suffix)?; + Some(name_bytes.strip_suffix(suffix_bytes).unwrap_or(name_bytes).into()) +} + +/// The `basename` argument model. +fn app() -> Command { + Command::new(Basename::NAME) + .version("0.8.0") + .about( + "Print NAME with any leading directory components removed\nIf specified, also remove a \ + trailing SUFFIX", + ) + .override_usage(format_usage("basename [-z] NAME [SUFFIX]\n basename OPTION... NAME...")) + .infer_long_args(true) + .arg( + Arg::new(options::MULTIPLE) + .short('a') + .long(options::MULTIPLE) + .help("support multiple arguments and treat each as a NAME") + .action(ArgAction::SetTrue) + .overrides_with(options::MULTIPLE), + ) + .arg( + Arg::new(options::NAME) + .action(ArgAction::Append) + .value_parser(ValueParser::os_string()) + .value_hint(clap::ValueHint::AnyPath) + .hide(true) + .trailing_var_arg(true), + ) + .arg( + Arg::new(options::SUFFIX) + .short('s') + .long(options::SUFFIX) + .value_name("SUFFIX") + .value_parser(ValueParser::os_string()) + .help("remove a trailing SUFFIX; implies -a") + .overrides_with(options::SUFFIX), + ) + .arg( + Arg::new(options::ZERO) + .short('z') + .long(options::ZERO) + .help("end each output line with NUL, not newline") + .action(ArgAction::SetTrue) + .overrides_with(options::ZERO), + ) +} + +/// Creates the `basename` builtin registration. +pub(crate) fn basename_builtin() -> Registration { + util::() +} + +#[cfg(test)] +mod tests { + use super::Basename; + use crate::host::run_util; + + fn basename(argv: &[&str]) -> (i32, String) { + let (code, capture) = run_util::(argv, "", "/"); + (code, capture.out()) + } + + #[test] + fn strips_directory_components() { + assert_eq!(basename(&["/usr/local/bin/omp"]), (0, "omp\n".to_string())); + } + + #[test] + fn simple_format_takes_the_second_operand_as_a_suffix() { + assert_eq!(basename(&["src/host.rs", ".rs"]), (0, "host\n".to_string())); + } + + #[test] + fn suffix_option_applies_to_every_operand() { + assert_eq!(basename(&["-s", ".rs", "a.rs", "b.rs"]), (0, "a\nb\n".to_string())); + } + + #[test] + fn suffix_is_kept_when_it_is_the_whole_component() { + assert_eq!(basename(&["-s", ".rs", ".rs"]), (0, ".rs\n".to_string())); + } + + #[test] + fn trailing_dot_component_names_the_parent() { + assert_eq!(basename(&["a/."]), (0, ".\n".to_string())); + } + + #[test] + fn zero_flag_switches_the_terminator() { + assert_eq!(basename(&["-z", "/a/b"]), (0, "b\0".to_string())); + } + + #[test] + fn missing_operand_is_a_usage_error() { + let (code, capture) = run_util::(&[], "", "/"); + assert_eq!(code, 1); + assert_eq!(capture.err(), "basename: missing operand\n"); + } + + #[test] + fn third_operand_without_multiple_is_a_usage_error() { + let (code, capture) = run_util::(&["a", "b", "c"], "", "/"); + assert_eq!(code, 1); + assert_eq!(capture.err(), "basename: extra operand 'c'\n"); + } +} diff --git a/crates/vendor/brush-builtins/src/bg.rs b/crates/pi-builtins/src/bg.rs similarity index 100% rename from crates/vendor/brush-builtins/src/bg.rs rename to crates/pi-builtins/src/bg.rs diff --git a/crates/vendor/brush-builtins/src/bind.rs b/crates/pi-builtins/src/bind.rs similarity index 100% rename from crates/vendor/brush-builtins/src/bind.rs rename to crates/pi-builtins/src/bind.rs diff --git a/crates/vendor/brush-builtins/src/break_.rs b/crates/pi-builtins/src/break_.rs similarity index 100% rename from crates/vendor/brush-builtins/src/break_.rs rename to crates/pi-builtins/src/break_.rs diff --git a/crates/vendor/brush-builtins/src/builder.rs b/crates/pi-builtins/src/builder.rs similarity index 100% rename from crates/vendor/brush-builtins/src/builder.rs rename to crates/pi-builtins/src/builder.rs diff --git a/crates/vendor/brush-builtins/src/builtin_.rs b/crates/pi-builtins/src/builtin_.rs similarity index 100% rename from crates/vendor/brush-builtins/src/builtin_.rs rename to crates/pi-builtins/src/builtin_.rs diff --git a/crates/vendor/brush-builtins/src/caller.rs b/crates/pi-builtins/src/caller.rs similarity index 100% rename from crates/vendor/brush-builtins/src/caller.rs rename to crates/pi-builtins/src/caller.rs diff --git a/crates/pi-builtins/src/cat.rs b/crates/pi-builtins/src/cat.rs new file mode 100644 index 000000000..a640b7a4e --- /dev/null +++ b/crates/pi-builtins/src/cat.rs @@ -0,0 +1,814 @@ +//! `cat` builtin: concatenate files to standard output. +//! +//! Ported from uutils coreutils 0.8.0. + +#[cfg(unix)] +use std::os::unix::fs::FileTypeExt; +use std::{ + ffi::OsString, + fs::{File, metadata}, + io::{self, BufWriter, ErrorKind, Read, Write}, + path::Path, +}; + +use brush_core::{ShellExtensions, builtins::Registration, openfiles::OpenFile}; +use clap::{Arg, ArgAction, ArgMatches, Command}; +use memchr::memchr2; +use thiserror::Error; +use uucore::{display::Quotable, fast_inc::fast_inc_one}; + +use crate::host::{Host, Stdin, Utility, format_usage, matches_parser, util}; + +/// Linux splice support. +#[cfg(any(target_os = "linux", target_os = "android"))] +mod splice { + use std::io::{self, ErrorKind}; + use std::os::fd::{AsFd, BorrowedFd}; + + use rustix::io::{read, write}; + use uucore::pipes::{MAX_ROOTLESS_PIPE_SIZE, pipe, splice, splice_exact}; + + use super::{CatError, CatResult, FdReadable, InputHandle}; + + const BUF_SIZE: usize = 1024 * 16; + + /// Moves input between real descriptors without copying through userspace. + /// + /// `false` means the input reached EOF; `true` asks the caller to resume with + /// buffered copying because splice was unavailable for this descriptor pair. + #[inline] + pub(super) fn write_fast_using_splice( + handle: &InputHandle, + write_fd: BorrowedFd<'_>, + ) -> CatResult { + let Some(read_fd) = handle.reader.try_borrow_as_fd() else { + return Ok(true); + }; + + if splice(&read_fd, &write_fd, MAX_ROOTLESS_PIPE_SIZE).is_ok() { + // fcntl improves throughput. It is harmless when stdout is not a pipe. + let _ = rustix::pipe::fcntl_setpipe_size(write_fd, MAX_ROOTLESS_PIPE_SIZE); + loop { + match splice(&read_fd, &write_fd, MAX_ROOTLESS_PIPE_SIZE) { + Ok(1..) => {}, + Ok(0) => return Ok(false), + Err(error) if error.kind() == ErrorKind::BrokenPipe => { + return Err(CatError::BrokenPipe); + }, + Err(_) => return Ok(true), + } + } + } else if let Ok((pipe_rd, pipe_wr)) = pipe() { + // Neither endpoint is a pipe, so broker through an intermediate pipe. + loop { + match splice(&read_fd, &pipe_wr, MAX_ROOTLESS_PIPE_SIZE) { + Ok(0) => return Ok(false), + Ok(n) => { + if let Err(error) = splice_exact(&pipe_rd, &write_fd, n) { + if error.kind() == ErrorKind::BrokenPipe { + return Err(CatError::BrokenPipe); + } + // Preserve bytes already moved into the broker pipe, then + // let the caller continue with buffered copying. + copy_exact(&pipe_rd, &write_fd, n)?; + return Ok(true); + } + }, + Err(_) => return Ok(true), + } + } + } else { + Ok(true) + } + } + + /// Moves exactly `num_bytes` bytes between the two descriptors. + fn copy_exact( + read_fd: &impl AsFd, + write_fd: &impl AsFd, + num_bytes: usize, + ) -> io::Result<()> { + let mut left = num_bytes; + let mut buf = [0; BUF_SIZE]; + while left > 0 { + let n = read(read_fd, &mut buf)?; + assert_ne!(n, 0, "unexpected end of pipe"); + let mut written = 0; + while written < n { + match write(write_fd, &buf[written..n])? { + 0 => unreachable!("fd should be writable"), + w => written += w, + } + } + left -= n; + } + Ok(()) + } +} + +// Allocate 32 digits for the line number. An estimate is that we can print +// about 1e8 lines/second, so 32 digits lasts for billions of universe lifetimes. +const LINE_NUMBER_BUF_SIZE: usize = 32; + +struct LineNumber { + buf: [u8; LINE_NUMBER_BUF_SIZE], + print_start: usize, + num_start: usize, + num_end: usize, +} + +// Manually incrementing the digits is significantly faster than formatting a +// `usize` each time. The buffer starts as " 1\t". +impl LineNumber { + fn new() -> Self { + let mut buf = [b'0'; LINE_NUMBER_BUF_SIZE]; + let init_str = " 1\t"; + let print_start = buf.len() - init_str.len(); + let num_start = buf.len() - 2; + let num_end = buf.len() - 1; + buf[print_start..].copy_from_slice(init_str.as_bytes()); + Self { buf, print_start, num_start, num_end } + } + + fn increment(&mut self) { + fast_inc_one(&mut self.buf, &mut self.num_start, self.num_end); + self.print_start = self.print_start.min(self.num_start); + } + + #[inline] + fn to_str(&self) -> &[u8] { + &self.buf[self.print_start..] + } + + fn write(&self, writer: &mut impl Write) -> io::Result<()> { + writer.write_all(self.to_str()) + } +} + +#[derive(Error, Debug)] +enum CatError { + /// Wrapper around `io::Error`. + #[error("{}", strip_errno(.0))] + Io(io::Error), + /// The downstream reader closed its pipe; this ends the copy quietly. + #[error("broken pipe")] + BrokenPipe, + /// Unknown file type; it is not a regular file, socket, or known device. + #[error("unknown filetype: {ft_debug}")] + UnknownFiletype { ft_debug: String }, + #[error("Is a directory")] + IsDirectory, + #[cfg(unix)] + #[error("No such device or address")] + NoSuchDeviceOrAddress, + #[error("Too many levels of symbolic links")] + TooManySymlinks, +} + +impl From for CatError { + fn from(error: io::Error) -> Self { + if error.kind() == ErrorKind::BrokenPipe { + Self::BrokenPipe + } else { + Self::Io(error) + } + } +} + +fn strip_errno(error: &io::Error) -> String { + let mut message = error.to_string(); + if let Some(position) = message.find(" (os error ") { + message.truncate(position); + } + message +} + +type CatResult = Result; + +#[derive(PartialEq)] +enum NumberingMode { + None, + NonEmpty, + All, +} + +struct OutputOptions { + /// Line numbering mode. + number: NumberingMode, + /// Suppress repeated empty output lines. + squeeze_blank: bool, + /// Display TAB characters as `tab`. + show_tabs: bool, + /// Show end of lines. + show_ends: bool, + /// Use ^ and M- notation, except for LF and TAB. + show_nonprint: bool, +} + +impl OutputOptions { + fn tab(&self) -> &'static str { + if self.show_tabs { "^I" } else { "\t" } + } + + fn end_of_line(&self) -> &'static str { + if self.show_ends { "$\n" } else { "\n" } + } + + /// We can write fast when no output augmentation is requested. + fn can_write_fast(&self) -> bool { + !(self.show_tabs + || self.show_nonprint + || self.show_ends + || self.squeeze_blank + || self.number != NumberingMode::None) + } +} + +/// State that persists between files on the augmented-output path. +struct OutputState { + line_number: LineNumber, + at_line_start: bool, + skipped_carriage_return: bool, + one_blank_kept: bool, +} + +trait FdReadable: Read { + #[cfg(any(target_os = "linux", target_os = "android"))] + fn try_borrow_as_fd(&self) -> Option> { + None + } +} + +impl FdReadable for File { + #[cfg(any(target_os = "linux", target_os = "android"))] + fn try_borrow_as_fd(&self) -> Option> { + use std::os::fd::AsFd; + Some(self.as_fd()) + } +} + +impl FdReadable for &mut Stdin {} + +/// An input stream and whether it is connected to an interactive terminal. +struct InputHandle { + reader: R, + is_interactive: bool, +} + +/// Concrete enum of recognized file types. +enum InputType { + Directory, + File, + StdIn, + SymLink, + #[cfg(unix)] + BlockDevice, + #[cfg(unix)] + CharacterDevice, + #[cfg(unix)] + Fifo, + #[cfg(unix)] + Socket, +} + +mod options { + pub static FILE: &str = "file"; + pub static SHOW_ALL: &str = "show-all"; + pub static NUMBER_NONBLANK: &str = "number-nonblank"; + pub static SHOW_NONPRINTING_ENDS: &str = "e"; + pub static SHOW_ENDS: &str = "show-ends"; + pub static NUMBER: &str = "number"; + pub static SQUEEZE_BLANK: &str = "squeeze-blank"; + pub static SHOW_NONPRINTING_TABS: &str = "t"; + pub static SHOW_TABS: &str = "show-tabs"; + pub static SHOW_NONPRINTING: &str = "show-nonprinting"; + pub static IGNORED_U: &str = "ignored-u"; +} + +/// Parsed `cat` invocation. +pub(crate) struct Cat { + matches: ArgMatches, +} + +matches_parser!(Cat, app); + +impl Utility for Cat { + const NAME: &'static str = "cat"; + + fn run(self, host: &mut Host) -> i32 { + let number_mode = if self.matches.get_flag(options::NUMBER_NONBLANK) { + NumberingMode::NonEmpty + } else if self.matches.get_flag(options::NUMBER) { + NumberingMode::All + } else { + NumberingMode::None + }; + + let show_nonprint = [ + options::SHOW_ALL, + options::SHOW_NONPRINTING_ENDS, + options::SHOW_NONPRINTING_TABS, + options::SHOW_NONPRINTING, + ] + .iter() + .any(|value| self.matches.get_flag(value)); + let show_ends = [options::SHOW_ENDS, options::SHOW_ALL, options::SHOW_NONPRINTING_ENDS] + .iter() + .any(|value| self.matches.get_flag(value)); + let show_tabs = [options::SHOW_ALL, options::SHOW_TABS, options::SHOW_NONPRINTING_TABS] + .iter() + .any(|value| self.matches.get_flag(value)); + let options = OutputOptions { + number: number_mode, + squeeze_blank: self.matches.get_flag(options::SQUEEZE_BLANK), + show_tabs, + show_ends, + show_nonprint, + }; + #[allow(clippy::unwrap_used, reason = "clap provides '-' by default")] + let files = self.matches.get_many::(options::FILE).unwrap(); + cat_files(files, &options, host) + } +} + +/// The `cat` argument model. +fn app() -> Command { + Command::new(Cat::NAME) + .version("0.8.0") + .override_usage(format_usage("cat [OPTION]... [FILE]...")) + .about( + "Concatenate FILE(s), or standard input, to standard output\nWith no FILE, or when FILE \ + is -, read standard input.", + ) + .infer_long_args(true) + .args_override_self(true) + .arg( + Arg::new(options::FILE) + .hide(true) + .action(ArgAction::Append) + .value_parser(clap::value_parser!(OsString)) + .default_value("-") + .value_hint(clap::ValueHint::FilePath), + ) + .arg( + Arg::new(options::SHOW_ALL) + .short('A') + .long(options::SHOW_ALL) + .help("equivalent to -vET") + .action(ArgAction::SetTrue), + ) + .arg( + Arg::new(options::NUMBER_NONBLANK) + .short('b') + .long(options::NUMBER_NONBLANK) + .help("number nonempty output lines, overrides -n") + // This must not override NUMBER: clap overriding is symmetric, + // while `-b -n` must still use `-b` semantics. + .action(ArgAction::SetTrue), + ) + .arg( + Arg::new(options::SHOW_NONPRINTING_ENDS) + .short('e') + .help("equivalent to -vE") + .action(ArgAction::SetTrue), + ) + .arg( + Arg::new(options::SHOW_ENDS) + .short('E') + .long(options::SHOW_ENDS) + .help("display $ at end of each line") + .action(ArgAction::SetTrue), + ) + .arg( + Arg::new(options::NUMBER) + .short('n') + .long(options::NUMBER) + .help("number all output lines") + .action(ArgAction::SetTrue), + ) + .arg( + Arg::new(options::SQUEEZE_BLANK) + .short('s') + .long(options::SQUEEZE_BLANK) + .help("suppress repeated empty output lines") + .action(ArgAction::SetTrue), + ) + .arg( + Arg::new(options::SHOW_NONPRINTING_TABS) + .short('t') + .help("equivalent to -vT") + .action(ArgAction::SetTrue), + ) + .arg( + Arg::new(options::SHOW_TABS) + .short('T') + .long(options::SHOW_TABS) + .help("display TAB characters at ^I") + .action(ArgAction::SetTrue), + ) + .arg( + Arg::new(options::SHOW_NONPRINTING) + .short('v') + .long(options::SHOW_NONPRINTING) + .help("use ^ and M- notation, except for LF (\\n) and TAB (\\t)") + .action(ArgAction::SetTrue), + ) + .arg( + Arg::new(options::IGNORED_U) + .short('u') + .help("(ignored)") + .action(ArgAction::SetTrue), + ) +} + +fn cat_handle( + handle: &mut InputHandle, + options: &OutputOptions, + state: &mut OutputState, + stdout: &mut OpenFile, +) -> CatResult<()> { + if options.can_write_fast() { + write_fast(handle, stdout) + } else { + write_lines(handle, options, state, stdout) + } +} + +fn cat_path( + path: &OsString, + options: &OutputOptions, + state: &mut OutputState, + host: &mut Host, +) -> CatResult<()> { + // Resolve every operand at the boundary, but retain `path` for diagnostics. + let resolved = host.resolve(path); + match get_input_type(path, &resolved)? { + InputType::StdIn => { + let (stdin, stdout) = (&mut host.stdin, &mut host.stdout); + let mut handle = InputHandle { reader: stdin, is_interactive: false }; + cat_handle(&mut handle, options, state, stdout) + }, + InputType::Directory => Err(CatError::IsDirectory), + #[cfg(unix)] + InputType::Socket => Err(CatError::NoSuchDeviceOrAddress), + _ => { + let file = File::open(resolved)?; + let mut handle = InputHandle { reader: file, is_interactive: false }; + cat_handle(&mut handle, options, state, &mut host.stdout) + }, + } +} + +fn cat_files<'a, I>(files: I, options: &OutputOptions, host: &mut Host) -> i32 +where + I: IntoIterator, +{ + let mut state = OutputState { + line_number: LineNumber::new(), + at_line_start: true, + skipped_carriage_return: false, + one_blank_kept: false, + }; + + for path in files { + match cat_path(path, options, &mut state, host) { + Ok(()) => {}, + Err(CatError::BrokenPipe) => return host.exit_code(), + Err(error) => host.error(format!("{}: {error}", path.maybe_quote()), 1), + } + } + if state.skipped_carriage_return { + let _ = host.stdout.write_all(b"\r"); + } + host.exit_code() +} + +/// Classifies the input at `resolved`; `path` is retained to recognize `-`. +fn get_input_type(path: &OsString, resolved: &Path) -> CatResult { + if path == "-" { + return Ok(InputType::StdIn); + } + + let file_type = match metadata(resolved) { + Ok(metadata) => metadata.file_type(), + Err(error) => { + if let Some(raw_error) = error.raw_os_error() { + // ELOOP differs on Darwin and FreeBSD. + #[cfg(not(any(target_os = "macos", target_os = "freebsd")))] + let too_many_symlink_code = 40; + #[cfg(any(target_os = "macos", target_os = "freebsd"))] + let too_many_symlink_code = 62; + if raw_error == too_many_symlink_code { + return Err(CatError::TooManySymlinks); + } + } + return Err(CatError::from(error)); + }, + }; + match file_type { + #[cfg(unix)] + file_type if file_type.is_block_device() => Ok(InputType::BlockDevice), + #[cfg(unix)] + file_type if file_type.is_char_device() => Ok(InputType::CharacterDevice), + #[cfg(unix)] + file_type if file_type.is_fifo() => Ok(InputType::Fifo), + #[cfg(unix)] + file_type if file_type.is_socket() => Ok(InputType::Socket), + file_type if file_type.is_dir() => Ok(InputType::Directory), + file_type if file_type.is_file() => Ok(InputType::File), + file_type if file_type.is_symlink() => Ok(InputType::SymLink), + _ => Err(CatError::UnknownFiletype { ft_debug: format!("{file_type:?}") }), + } +} + +/// Writes a handle to stdout with no output transformation. +fn write_fast( + handle: &mut InputHandle, + stdout: &mut OpenFile, +) -> CatResult<()> { + #[cfg(any(target_os = "linux", target_os = "android"))] + { + // Splice is safe only when the in-process output stream is backed by a + // real descriptor. Never substitute the host process's fd 1. + let fall_back = match stdout.try_borrow_as_fd() { + Ok(stdout_fd) => splice::write_fast_using_splice(handle, stdout_fd)?, + Err(_) => true, + }; + if !fall_back { + return Ok(()); + } + } + + let mut buf = [0; 1024 * 64]; + loop { + match handle.reader.read(&mut buf) { + Ok(0) => break, + Ok(n) => stdout.write_all(&buf[..n])?, + Err(error) if error.kind() == ErrorKind::Interrupted => {}, + Err(error) => return Err(error.into()), + } + } + stdout.flush()?; + Ok(()) +} + +/// Outputs a handle line by line with the requested transformations. +fn write_lines( + handle: &mut InputHandle, + options: &OutputOptions, + state: &mut OutputState, + stdout: &mut OpenFile, +) -> CatResult<()> { + let mut in_buf = [0; 1024 * 31]; + // A 32K output buffer greatly improves performance. + let mut writer = BufWriter::with_capacity(32 * 1024, stdout); + + loop { + let n = match handle.reader.read(&mut in_buf) { + Ok(0) => break, + Ok(n) => n, + Err(error) if error.kind() == ErrorKind::Interrupted => continue, + Err(error) => return Err(error.into()), + }; + let in_buf = &in_buf[..n]; + let mut pos = 0; + while pos < n { + if in_buf[pos] == b'\n' { + write_new_line(&mut writer, options, state, handle.is_interactive)?; + state.at_line_start = true; + pos += 1; + continue; + } + if state.skipped_carriage_return { + writer.write_all(b"\r")?; + state.skipped_carriage_return = false; + state.at_line_start = false; + } + state.one_blank_kept = false; + if state.at_line_start && options.number != NumberingMode::None { + state.line_number.write(&mut writer)?; + state.line_number.increment(); + } + + let offset = write_end(&mut writer, &in_buf[pos..], options)?; + if offset + pos == in_buf.len() { + state.at_line_start = false; + break; + } + if in_buf[pos + offset] == b'\r' { + state.skipped_carriage_return = true; + } else { + assert_eq!(in_buf[pos + offset], b'\n'); + write_end_of_line( + &mut writer, + options.end_of_line().as_bytes(), + handle.is_interactive, + )?; + state.at_line_start = true; + } + pos += offset + 1; + } + // Flush before a pipe read can block so available output stays visible. + writer.flush()?; + } + Ok(()) +} + +/// Writes a newline, accounting for delayed carriage returns and numbering. +fn write_new_line( + writer: &mut W, + options: &OutputOptions, + state: &mut OutputState, + is_interactive: bool, +) -> CatResult<()> { + if state.skipped_carriage_return { + if options.show_ends { + writer.write_all(b"^M")?; + } else { + writer.write_all(b"\r")?; + } + state.skipped_carriage_return = false; + write_end_of_line(writer, options.end_of_line().as_bytes(), is_interactive)?; + return Ok(()); + } + if !state.at_line_start || !options.squeeze_blank || !state.one_blank_kept { + state.one_blank_kept = true; + if state.at_line_start && options.number == NumberingMode::All { + state.line_number.write(writer)?; + state.line_number.increment(); + } + write_end_of_line(writer, options.end_of_line().as_bytes(), is_interactive)?; + } + Ok(()) +} + +fn write_end( + writer: &mut W, + in_buf: &[u8], + options: &OutputOptions, +) -> io::Result { + if options.show_nonprint { + write_nonprint_to_end(in_buf, writer, options.tab().as_bytes()) + } else if options.show_tabs { + write_tab_to_end(in_buf, writer) + } else { + write_to_end(in_buf, writer) + } +} + +// Write all symbols until newline, carriage return, or the buffer end. The +// nonprinting path need not stop at carriage return because it always emits ^M. +fn write_to_end(in_buf: &[u8], writer: &mut W) -> io::Result { + if let Some(position) = memchr2(b'\n', b'\r', in_buf) { + writer.write_all(&in_buf[..position])?; + Ok(position) + } else { + writer.write_all(in_buf)?; + Ok(in_buf.len()) + } +} + +fn write_tab_to_end(mut in_buf: &[u8], writer: &mut W) -> io::Result { + let mut count = 0; + loop { + if let Some(position) = in_buf + .iter() + .position(|byte| *byte == b'\n' || *byte == b'\t' || *byte == b'\r') + { + writer.write_all(&in_buf[..position])?; + if in_buf[position] == b'\t' { + writer.write_all(b"^I")?; + in_buf = &in_buf[position + 1..]; + count += position + 1; + } else { + return Ok(count + position); + } + } else { + writer.write_all(in_buf)?; + return Ok(in_buf.len() + count); + } + } +} + +fn write_nonprint_to_end( + in_buf: &[u8], + writer: &mut W, + tab: &[u8], +) -> io::Result { + let mut count = 0; + for byte in in_buf.iter().copied() { + if byte == b'\n' { + break; + } + match byte { + 9 => writer.write_all(tab), + 0..=8 | 10..=31 => writer.write_all(&[b'^', byte + 64]), + 32..=126 => writer.write_all(&[byte]), + 127 => writer.write_all(b"^?"), + 128..=159 => writer.write_all(&[b'M', b'-', b'^', byte - 64]), + 160..=254 => writer.write_all(&[b'M', b'-', byte - 128]), + _ => writer.write_all(b"M-^?"), + }?; + count += 1; + } + Ok(count) +} + +fn write_end_of_line( + writer: &mut W, + end_of_line: &[u8], + is_interactive: bool, +) -> CatResult<()> { + writer.write_all(end_of_line)?; + if is_interactive { + writer.flush()?; + } + Ok(()) +} + +/// Creates the `cat` builtin registration. +pub(crate) fn cat_builtin() -> Registration { + util::() +} + +#[cfg(test)] +mod tests { + use std::{fs, io::{BufWriter, sink}}; + + use tempfile::tempdir; + + use super::{Cat, LineNumber, write_nonprint_to_end, write_tab_to_end}; + use crate::host::run_util; + + #[test] + fn test_write_tab_to_end_with_newline() { + let mut writer = BufWriter::with_capacity(1024 * 64, sink()); + assert_eq!(write_tab_to_end(b"a\tb\tc\n", &mut writer).unwrap(), 5); + } + + #[test] + fn test_write_tab_to_end_no_newline() { + let mut writer = BufWriter::with_capacity(1024 * 64, sink()); + assert_eq!(write_tab_to_end(b"a\tb\tc", &mut writer).unwrap(), 5); + } + + #[test] + fn test_write_nonprint_to_end_new_line() { + let mut writer = BufWriter::with_capacity(1024 * 64, sink()); + write_nonprint_to_end(b"\n", &mut writer, b"").unwrap(); + assert_eq!(writer.buffer().len(), 0); + } + + #[test] + fn test_write_nonprint_to_end_9() { + let mut writer = BufWriter::with_capacity(1024 * 64, sink()); + write_nonprint_to_end(&[9], &mut writer, b"tab").unwrap(); + assert_eq!(writer.buffer(), b"tab"); + } + + #[test] + fn test_write_nonprint_to_end_0_to_8() { + for byte in 0_u8..=8 { + let mut writer = BufWriter::with_capacity(1024 * 64, sink()); + write_nonprint_to_end(&[byte], &mut writer, b"").unwrap(); + assert_eq!(writer.buffer(), [b'^', byte + 64]); + } + } + + #[test] + fn test_write_nonprint_to_end_10_to_31() { + for byte in 11_u8..=31 { + let mut writer = BufWriter::with_capacity(1024 * 64, sink()); + write_nonprint_to_end(&[byte], &mut writer, b"").unwrap(); + assert_eq!(writer.buffer(), [b'^', byte + 64]); + } + } + + #[test] + fn test_incrementing_string() { + let mut number = LineNumber::new(); + assert_eq!(b" 1\t", number.to_str()); + number.increment(); + assert_eq!(b" 2\t", number.to_str()); + for _ in 3..=100 { + number.increment(); + } + assert_eq!(b" 100\t", number.to_str()); + for _ in 101..=1_000_000 { + number.increment(); + } + assert_eq!(b"1000000\t", number.to_str()); + number.increment(); + assert_eq!(b"1000001\t", number.to_str()); + } + + #[test] + fn missing_operand_reports_and_later_operand_is_processed() { + let directory = tempdir().unwrap(); + fs::write(directory.path().join("present"), b"remaining\n").unwrap(); + let (code, capture) = run_util::(&["missing", "present"], "", directory.path()); + assert_eq!(code, 1); + assert_eq!(capture.out(), "remaining\n"); + assert_eq!(capture.err(), "cat: missing: No such file or directory\n"); + } +} diff --git a/crates/vendor/brush-builtins/src/cd.rs b/crates/pi-builtins/src/cd.rs similarity index 100% rename from crates/vendor/brush-builtins/src/cd.rs rename to crates/pi-builtins/src/cd.rs diff --git a/crates/pi-builtins/src/cksum.rs b/crates/pi-builtins/src/cksum.rs new file mode 100644 index 000000000..6cd786671 --- /dev/null +++ b/crates/pi-builtins/src/cksum.rs @@ -0,0 +1,1957 @@ +//! Checksum-family builtins (`md5sum`, SHA sums, and `b2sum`). +//! +//! Ported from uutils coreutils 0.8.0. +#![allow(dead_code, reason = "upstream checksum-common also supports cksum-only formats")] + +use std::{ + borrow::Borrow, + ffi::{OsStr, OsString}, + fmt::{Display, Formatter}, + fs::File, + io::{self, BufReader, Read, Write}, +}; + +use clap::{Arg, ArgAction, ArgMatches, Command, ValueHint, builder::ValueParser}; +use os_display::Quotable; +use uucore::{ + checksum::{ + AlgoKind, BlakeLength, ChecksumError, ReadingMode, ShaLength, SizedAlgoKind, + digest_reader, escape_filename, parse_blake_length, unescape_filename, SUPPORTED_ALGORITHMS, + }, + line_ending::LineEnding, + os_str_from_bytes, + quoting_style::{QuotingStyle, locale_aware_escape_name}, + read_os_string_lines, + sum::{self, Blake2b, Blake3, DigestOutput}, +}; + +use crate::host::{Host, os_bytes}; + +#[derive(Debug, Clone)] +struct Failure(String); + +impl Display for Failure { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.write_str(&self.0) + } +} + +impl From for Failure { + fn from(error: io::Error) -> Self { + Self(error.to_string()) + } +} + +type ExecResult = Result; + +fn failure(error: impl Display) -> Failure { + Failure(error.to_string()) +} + +mod options { + // cksum-specific + pub(super) const ALGORITHM: &str = "algorithm"; + pub(super) const DEBUG: &str = "debug"; + + // positional arg + pub(super) const FILE: &str = "file"; + + pub(super) const UNTAGGED: &str = "untagged"; + pub(super) const TAG: &str = "tag"; + pub(super) const LENGTH: &str = "length"; + pub(super) const RAW: &str = "raw"; + pub(super) const BASE64: &str = "base64"; + pub(super) const CHECK: &str = "check"; + pub(super) const TEXT: &str = "text"; + pub(super) const BINARY: &str = "binary"; + pub(super) const ZERO: &str = "zero"; + + // check-specific + pub(super) const STRICT: &str = "strict"; + pub(super) const STATUS: &str = "status"; + pub(super) const WARN: &str = "warn"; + pub(super) const IGNORE_MISSING: &str = "ignore-missing"; + pub(super) const QUIET: &str = "quiet"; +} + +/// `ChecksumCommand` is a convenience trait to more easily declare checksum +/// CLI interfaces with +trait ChecksumCommand { + fn with_algo(self) -> Self; + + fn with_length(self) -> Self; + + fn with_check_and_opts(self) -> Self; + + fn with_binary(self) -> Self; + + fn with_text(self, is_default: bool) -> Self; + + fn with_tag(self, is_default: bool) -> Self; + + fn with_untagged(self) -> Self; + + fn with_raw(self) -> Self; + + fn with_base64(self) -> Self; + + fn with_zero(self) -> Self; + + fn with_debug(self) -> Self; +} + +impl ChecksumCommand for Command { + fn with_algo(self) -> Self { + self.arg( + Arg::new(options::ALGORITHM) + .long(options::ALGORITHM) + .short('a') + .help("select the digest type to use. See DIGEST below") + .value_name("ALGORITHM") + .value_parser(SUPPORTED_ALGORITHMS), + ) + } + + fn with_length(self) -> Self { + self.arg( + Arg::new(options::LENGTH) + .long(options::LENGTH) + .short('l') + .help( + "digest length in bits; must not exceed the maximum and must be a multiple of 8 \ + for BLAKE2b", + ) + .action(ArgAction::Set), + ) + } + + fn with_check_and_opts(self) -> Self { + self + .arg( + Arg::new(options::CHECK) + .short('c') + .long(options::CHECK) + .help("read checksums from the FILEs and check them") + .action(ArgAction::SetTrue), + ) + .arg( + Arg::new(options::WARN) + .short('w') + .long("warn") + .help("warn about improperly formatted checksum lines") + .action(ArgAction::SetTrue) + .overrides_with_all([options::STATUS, options::QUIET]), + ) + .arg( + Arg::new(options::STATUS) + .long("status") + .help("don't output anything, status code shows success") + .action(ArgAction::SetTrue) + .overrides_with_all([options::WARN, options::QUIET]), + ) + .arg( + Arg::new(options::QUIET) + .long(options::QUIET) + .help("don't print OK for each successfully verified file") + .action(ArgAction::SetTrue) + .overrides_with_all([options::STATUS, options::WARN]), + ) + .arg( + Arg::new(options::IGNORE_MISSING) + .long(options::IGNORE_MISSING) + .help("don't fail or report status for missing files") + .action(ArgAction::SetTrue), + ) + .arg( + Arg::new(options::STRICT) + .long(options::STRICT) + .help("exit non-zero for improperly formatted checksum lines") + .action(ArgAction::SetTrue), + ) + } + + fn with_binary(self) -> Self { + self.arg( + Arg::new(options::BINARY) + .long(options::BINARY) + .short('b') + .hide(true) + .overrides_with(options::TEXT) + .action(ArgAction::SetTrue), + ) + } + + fn with_text(self, is_default: bool) -> Self { + let mut arg = Arg::new(options::TEXT) + .long(options::TEXT) + .short('t') + .action(ArgAction::SetTrue); + + arg = if is_default { + arg.help("read in text mode (default)") + } else { + arg.hide(true) + }; + + self.arg(arg) + } + + fn with_tag(self, default: bool) -> Self { + let mut arg = Arg::new(options::TAG) + .long(options::TAG) + .action(ArgAction::SetTrue); + + arg = if default { + arg.help("create a BSD style checksum (default)") + } else { + arg.help("create a BSD style checksum") + }; + + self.arg(arg) + } + + fn with_untagged(self) -> Self { + self.arg( + Arg::new(options::UNTAGGED) + .long(options::UNTAGGED) + .help("create a reversed style checksum, without digest type") + .overrides_with(options::TAG) + .action(ArgAction::SetTrue), + ) + } + + fn with_raw(self) -> Self { + self.arg( + Arg::new(options::RAW) + .long(options::RAW) + .help("emit a raw binary digest, not hexadecimal") + .action(ArgAction::SetTrue), + ) + } + + fn with_base64(self) -> Self { + self.arg( + Arg::new(options::BASE64) + .long(options::BASE64) + .help("emit base64-encoded digests, not hexadecimal") + .action(ArgAction::SetTrue) + // Even though this could easily just override an earlier '--raw', + // GNU cksum does not permit these flags to be combined: + .conflicts_with(options::RAW), + ) + } + + fn with_zero(self) -> Self { + self.arg( + Arg::new(options::ZERO) + .long(options::ZERO) + .short('z') + .help("end each output line with NUL, not newline, and disable file name escaping") + .action(ArgAction::SetTrue), + ) + } + + fn with_debug(self) -> Self { + self.arg( + Arg::new(options::DEBUG) + .long(options::DEBUG) + .help("print CPU hardware capability detection info used by cksum") + .action(ArgAction::SetTrue), + ) + } +} + +fn standalone_strings(bin: &str) -> (&'static str, &'static str) { + match bin { + "md5sum" => ("Print or check the MD5 checksums", "md5sum [OPTIONS] [FILE]..."), + "sha1sum" => ("Print or check SHA1 (160-bit) checksums", "sha1sum [OPTION]... [FILE]..."), + "sha224sum" => { + ("Print or check SHA224 (224-bit) checksums", "sha224sum [OPTION]... [FILE]...") + }, + "sha256sum" => { + ("Print or check SHA256 (256-bit) checksums", "sha256sum [OPTION]... [FILE]...") + }, + "sha384sum" => { + ("Print or check SHA384 (384-bit) checksums", "sha384sum [OPTION]... [FILE]...") + }, + "sha512sum" => { + ("Print or check SHA512 (512-bit) checksums", "sha512sum [OPTION]... [FILE]...") + }, + "b2sum" => ("Print or check BLAKE2b (512-bit) checksums", "b2sum [OPTION]... [FILE]..."), + _ => ("Print or check checksums", "checksum [OPTION]... [FILE]..."), + } +} + +fn default_checksum_app(about: impl Into, usage: impl Into) -> Command { + Command::new("") + .version("0.8.0") + .about(about.into()) + .override_usage(usage.into()) + .infer_long_args(true) + .args_override_self(true) + .after_help("With no FILE or when FILE is -, read standard input") + .arg( + Arg::new(options::FILE) + .hide(true) + .action(ArgAction::Append) + .value_parser(ValueParser::os_string()) + .default_value("-") + .hide_default_value(true) + .value_hint(ValueHint::FilePath), + ) +} + +fn standalone_checksum_app_with_length( + about: impl Into, + usage: impl Into, +) -> Command { + default_checksum_app(about, usage) + .with_binary() + .with_check_and_opts() + .with_length() + .with_tag(false) + .with_text(true) + .with_zero() +} + +fn standalone_checksum_app(about: impl Into, usage: impl Into) -> Command { + default_checksum_app(about, usage) + .with_binary() + .with_check_and_opts() + .with_tag(false) + .with_text(true) + .with_zero() +} + +fn checksum_main( + host: &mut Host, + algo: Option, + length: Option, + matches: ArgMatches, + output_format: OutputFormat, +) -> ExecResult<()> { + let check = matches.get_flag(options::CHECK); + let check_flag = |flag| match (check, matches.get_flag(flag)) { + (_, false) => Ok(false), + (true, true) => Ok(true), + (false, true) => Err(failure(ChecksumError::CheckOnlyFlag(flag.into()))), + }; + let ignore_missing = check_flag(options::IGNORE_MISSING)?; + let warn = check_flag(options::WARN)?; + let quiet = check_flag(options::QUIET)?; + let strict = check_flag(options::STRICT)?; + let status = check_flag(options::STATUS)?; + let text_flag = matches.get_flag(options::TEXT); + let binary_flag = matches.get_flag(options::BINARY); + let tag = matches.get_flag(options::TAG); + let files = matches + .get_many::(options::FILE) + .expect("FILE has a default value") + .map(Borrow::borrow); + + if text_flag && tag { + return Err(failure(ChecksumError::TextAfterTag)); + } + if check { + if algo.is_some_and(AlgoKind::is_legacy) { + return Err(failure(ChecksumError::AlgorithmNotSupportedWithCheck)); + } + if tag { + return Err(failure(ChecksumError::TagCheck)); + } + if binary_flag || text_flag { + return Err(failure(ChecksumError::BinaryTextConflict)); + } + let opts = ChecksumValidateOptions { + ignore_missing, + strict, + verbose: ChecksumVerbose::new(status, quiet, warn), + }; + return perform_checksum_validation(host, files, algo, length, opts); + } + + let algo = SizedAlgoKind::from_unsized(algo.unwrap_or(AlgoKind::Crc), length) + .map_err(failure)?; + let opts = ChecksumComputeOptions { + algo_kind: algo, + output_format, + line_ending: LineEnding::from_zero_flag(matches.get_flag(options::ZERO)), + }; + perform_checksum_computation(host, opts, files) +} + +/// Builds the clap command for one standalone checksum utility. +pub(crate) fn command(name: &'static str, with_length: bool) -> Command { + let (about, usage) = standalone_strings(name); + if with_length { + standalone_checksum_app_with_length( + "Print or check BLAKE2b (512-bit) checksums.", + usage, + ) + .name(name) + } else { + standalone_checksum_app(about, usage).name(name) + } +} + +/// Runs one parsed standalone checksum invocation. +pub(crate) fn run( + host: &mut Host, + algo: AlgoKind, + matches: ArgMatches, + length: Option, +) -> i32 { + let text = !matches.get_flag(options::BINARY); + let tag = matches.get_flag(options::TAG); + let format = OutputFormat::from_standalone(text, tag); + match checksum_main(host, Some(algo), length, matches, format) { + Ok(()) => host.exit_code(), + Err(error) => { + if !error.0.is_empty() { + host.error(error, 1); + } + 1 + }, + } +} + +/// Use the same buffer size as GNU when reading a file to create a checksum +/// from it: 32 KiB. +const READ_BUFFER_SIZE: usize = 32 * 1024; + +/// Necessary options when computing a checksum. Historically, these options +/// included a `binary` field to differentiate `--binary` and `--text` modes on +/// windows. Since the support for this feature is approximate in GNU, and it's +/// deprecated anyway, it was decided in #9168 to ignore the difference when +/// computing the checksum. +struct ChecksumComputeOptions { + /// Which algorithm to use to compute the digest. + algo_kind: SizedAlgoKind, + + /// Printing format to use for each checksum. + output_format: OutputFormat, + + /// Whether to finish lines with '\n' or '\0'. + line_ending: LineEnding, +} + +/// Whether to write the digest as hexadecimal or encoded in base64. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum DigestFormat { + Hexadecimal, + Base64, +} + +impl DigestFormat { + #[inline] + fn is_base64(self) -> bool { + self == Self::Base64 + } +} + +/// Holds the representation that shall be used for printing a checksum line +#[derive(Debug, PartialEq, Eq)] +enum OutputFormat { + /// Raw digest + Raw, + + /// Selected for older algorithms which had their custom formatting + /// + /// Default for crc, sysv, bsd + Legacy, + + /// `$ALGO_NAME ($FILENAME) = $DIGEST` + Tagged(DigestFormat), + + /// '$DIGEST $FLAG$FILENAME' + /// where 'flag' depends on the reading mode + /// + /// Default for standalone checksum utilities + Untagged(DigestFormat, ReadingMode), +} + +impl OutputFormat { + #[inline] + fn is_raw(&self) -> bool { + *self == Self::Raw + } + + /// Find the correct output format for cksum. + fn from_cksum(algo: AlgoKind, tag: bool, binary: bool, raw: bool, base64: bool) -> Self { + // Raw output format takes precedence over anything else. + if raw { + return Self::Raw; + } + + // Then, if the algo is legacy, takes precedence over the rest + if algo.is_legacy() { + return Self::Legacy; + } + + let digest_format = if base64 { + DigestFormat::Base64 + } else { + DigestFormat::Hexadecimal + }; + + // After that, decide between tagged and untagged output + if tag { + Self::Tagged(digest_format) + } else { + let reading_mode = if binary { + ReadingMode::Binary + } else { + ReadingMode::Text + }; + Self::Untagged(digest_format, reading_mode) + } + } + + /// Find the correct output format for a standalone checksum util (b2sum, + /// md5sum, etc) + /// + /// Since standalone utils can't use the Raw or Legacy output format, it is + /// decided only using the --tag, --binary and --text arguments. + fn from_standalone(text: bool, tag: bool) -> Self { + if tag { + Self::Tagged(DigestFormat::Hexadecimal) + } else { + Self::Untagged( + DigestFormat::Hexadecimal, + if text { + ReadingMode::Text + } else { + ReadingMode::Binary + }, + ) + } + } +} + +fn print_legacy_checksum( + host: &mut Host, + options: &ChecksumComputeOptions, + filename: &OsStr, + sum: &DigestOutput, + size: usize, +) { + debug_assert!(options.algo_kind.is_legacy()); + debug_assert!(matches!(sum, DigestOutput::U16(_) | DigestOutput::Crc(_))); + + let (escaped_filename, prefix) = if options.line_ending == LineEnding::Nul { + (filename.to_string_lossy().to_string(), "") + } else { + escape_filename(filename) + }; + + // Print the sum + match (options.algo_kind, sum) { + (SizedAlgoKind::Sysv, DigestOutput::U16(sum)) => { + let _ = write!( + &mut host.stdout, + "{prefix}{sum} {}", + size.div_ceil(options.algo_kind.bitlen()), + ); + }, + (SizedAlgoKind::Bsd, DigestOutput::U16(sum)) => { + // The BSD checksum output is 5 digit integer + let bsd_width = 5; + let _ = write!( + &mut host.stdout, + "{prefix}{sum:0bsd_width$} {:bsd_width$}", + size.div_ceil(options.algo_kind.bitlen()), + ); + }, + (SizedAlgoKind::Crc | SizedAlgoKind::Crc32b, DigestOutput::Crc(sum)) => { + let _ = write!(&mut host.stdout, "{prefix}{sum} {size}"); + }, + (algo, output) => unreachable!("Bug: Invalid legacy checksum ({algo:?}, {output:?})"), + } + + // Print the filename after a space if not stdin + if escaped_filename != "-" { + let _ = write!(&mut host.stdout, " "); + let _dropped_result = &mut host.stdout.write_all(escaped_filename.as_bytes()); + } +} + +fn print_tagged_checksum(host: &mut Host, options: &ChecksumComputeOptions, filename: &OsStr, sum: &String) { + let (escaped_filename, prefix) = if options.line_ending == LineEnding::Nul { + (filename.to_string_lossy().to_string(), "") + } else { + escape_filename(filename) + }; + + // Print algo name and opening parenthesis. + let _ = write!(&mut host.stdout, "{prefix}{} (", options.algo_kind.to_tag()); + + // Print filename + let _dropped_result = &mut host.stdout.write_all(escaped_filename.as_bytes()); + + // Print closing parenthesis and sum + let _ = write!(&mut host.stdout, ") = {sum}"); +} + +fn print_untagged_checksum( + host: &mut Host, + options: &ChecksumComputeOptions, + filename: &OsStr, + sum: &String, + reading_mode: ReadingMode, +) { + let (escaped_filename, prefix) = if options.line_ending == LineEnding::Nul { + (filename.to_string_lossy().to_string(), "") + } else { + escape_filename(filename) + }; + + // Print checksum and reading mode flag + let _ = write!(&mut host.stdout, "{prefix}{sum} {}", match reading_mode { + ReadingMode::Binary => '*', + ReadingMode::Text => ' ', + }); + + // Print filename + let _dropped_result = &mut host.stdout.write_all(escaped_filename.as_bytes()); +} + +/// Calculate checksum +/// +/// # Arguments +/// +/// * `options` - CLI options for the assigning checksum algorithm +/// * `files` - A iterator of [`OsStr`] which is a bunch of files that are using +/// for calculating checksum +fn perform_checksum_computation<'a, I>( + host: &mut Host, + options: ChecksumComputeOptions, + files: I, +) -> ExecResult<()> +where + I: Iterator, +{ + let mut files = files.peekable(); + + while let Some(filename) = files.next() { + // Check that in raw mode, we are not provided with several files. + if options.output_format.is_raw() && files.peek().is_some() { + return Err(failure(ChecksumError::RawMultipleFiles)); + } + + let filepath = std::path::Path::new(filename); + let resolved_filepath = host.resolve(filepath); + let stdin_buf; + let file_buf; + if resolved_filepath.is_dir() { + host.error(format!("{}: Is a directory", filepath.display()), 1); + continue; + } + + // Handle the file input + let mut file = BufReader::with_capacity( + READ_BUFFER_SIZE, + if filename == "-" { + stdin_buf = &mut host.stdin; + Box::new(stdin_buf) as Box + } else { + file_buf = match File::open(&resolved_filepath) { + Ok(file) => file, + Err(err) => { + host.error(format!("{}: {err}", filepath.to_string_lossy()), 1); + continue; + }, + }; + Box::new(file_buf) as Box + }, + ); + + let mut digest = options.algo_kind.create_digest(); + + // Always compute the "binary" version of the digest, i.e. on Windows, + // never handle CRLFs specifically. + let (digest_output, sz) = digest_reader(&mut digest, &mut file, ReadingMode::Binary) + .map_err(|error| failure(format!("failed to read input: {error}")))?; + drop(file); + + // Encodes the sum if df is Base64, leaves as-is otherwise. + let encode_sum = |sum: DigestOutput, df: DigestFormat| { + if df.is_base64() { + sum.to_base64() + } else { + sum.to_hex() + } + }; + + match options.output_format { + OutputFormat::Raw => { + // Cannot handle multiple files anyway, output immediately. + digest_output.write_raw(&mut host.stdout)?; + return Ok(()); + }, + OutputFormat::Legacy => { + print_legacy_checksum(host, &options, filename, &digest_output, sz); + }, + OutputFormat::Tagged(digest_format) => { + print_tagged_checksum(host, &options, filename, &encode_sum(digest_output, digest_format).map_err(failure)?); + }, + OutputFormat::Untagged(digest_format, reading_mode) => { + print_untagged_checksum( + host, + &options, + filename, + &encode_sum(digest_output, digest_format).map_err(failure)?, + reading_mode, + ); + }, + } + + let _ = write!(&mut host.stdout, "{}", options.line_ending); + } + Ok(()) +} + +/// To what level should checksum validation print logging info. +#[derive(Debug, PartialEq, Eq, PartialOrd, Clone, Copy, Default)] +enum ChecksumVerbose { + Status, + Quiet, + #[default] + Normal, + Warning, +} + +impl ChecksumVerbose { + fn new(status: bool, quiet: bool, warn: bool) -> Self { + use ChecksumVerbose::*; + + // Assume only one of the three booleans will be enabled at once. + // This is ensured by clap's overriding arguments. + match (status, quiet, warn) { + (true, ..) => Status, + (_, true, _) => Quiet, + (_, _, true) => Warning, + _ => Normal, + } + } + + #[inline] + fn over_status(self) -> bool { + self > Self::Status + } + + #[inline] + fn over_quiet(self) -> bool { + self > Self::Quiet + } + + #[inline] + fn at_least_warning(self) -> bool { + self >= Self::Warning + } +} + +/// This struct regroups CLI flags. +#[derive(Debug, Default, Clone, Copy)] +struct ChecksumValidateOptions { + ignore_missing: bool, + strict: bool, + verbose: ChecksumVerbose, +} + +/// This structure holds the count of checksum test lines' outcomes. +#[derive(Default)] +struct ChecksumResult { + /// Number of lines in the file where the computed checksum MATCHES + /// the expectation. + correct: u32, + /// Number of lines in the file where the computed checksum DIFFERS + /// from the expectation. + failed_cksum: u32, + failed_open_file: u32, + /// Number of improperly formatted lines. + bad_format: u32, + /// Total number of non-empty, non-comment lines. + total: u32, +} + +impl ChecksumResult { + #[inline] + fn total_properly_formatted(&self) -> u32 { + self.total - self.bad_format + } +} + +/// Represents a reason for which the processing of a checksum line +/// could not proceed to digest comparison. +enum LineCheckError { + /// A critical error was encountered in a helper. + Critical(Failure), + /// the computed checksum digest differs from the expected one + DigestMismatch, + /// the line is empty or is a comment + Skipped, + /// the line has a formatting error + ImproperlyFormatted, + /// file exists but is impossible to read + CantOpenFile, + /// there is nothing at the given path + FileNotFound, + /// the given path leads to a directory + FileIsDirectory, +} + +impl From for LineCheckError { + fn from(value: Failure) -> Self { + Self::Critical(value) + } +} + +impl From for LineCheckError { + fn from(value: ChecksumError) -> Self { + Self::Critical(failure(value)) + } +} + +/// Represents an error that was encountered when processing a checksum file. +enum FileCheckError { + /// A critical error was encountered in a helper. + Critical(Failure), + /// reading of the checksum file failed + CantOpenChecksumFile, + /// processing of the file is considered as a failure regarding the + /// provided flags. This however does not stop the processing of + /// further files. + Failed, +} + +impl From for FileCheckError { + fn from(value: Failure) -> Self { + Self::Critical(value) + } +} + +impl From for FileCheckError { + fn from(value: ChecksumError) -> Self { + Self::Critical(failure(value)) + } +} + +fn print_cksum_report(host: &mut Host, res: &ChecksumResult) { + if res.bad_format > 0 { + let name = host.name().to_owned(); + let _ = writeln!(host.stderr, "{name}: WARNING: {} line(s) are improperly formatted", res.bad_format); + } + if res.failed_cksum > 0 { + let name = host.name().to_owned(); + let _ = writeln!(host.stderr, "{name}: WARNING: {} computed checksum(s) did NOT match", res.failed_cksum); + } + if res.failed_open_file > 0 { + let name = host.name().to_owned(); + let _ = writeln!(host.stderr, "{name}: WARNING: {} listed file(s) could not be read", res.failed_open_file); + } +} + +#[inline] +fn log_no_properly_formatted(host: &mut Host, filename: impl Display) { + let name = host.name().to_owned(); + let _ = writeln!(host.stderr, "{name}: {filename}: no properly formatted checksum lines found"); +} + +#[inline] +fn log_no_file_verified(host: &mut Host, filename: impl Display) { + let name = host.name().to_owned(); + let _ = writeln!(host.stderr, "{name}: {filename}: no file was verified"); +} + +/// Represents the different outcomes that can happen to a file +/// that is being checked. +#[derive(Debug, Clone, Copy)] +enum FileChecksumResult { + Ok, + Failed, + CantOpen, +} + +impl FileChecksumResult { + /// Creates a `FileChecksumResult` from a digest comparison that + /// either succeeded or failed. + fn from_bool(checksum_correct: bool) -> Self { + if checksum_correct { + Self::Ok + } else { + Self::Failed + } + } + + /// The cli options might prevent to display on the outcome of the + /// comparison on STDOUT. + fn can_display(self, verbose: ChecksumVerbose) -> bool { + match self { + Self::Ok => verbose.over_quiet(), + Self::Failed => verbose.over_status(), + Self::CantOpen => true, + } + } +} + +impl Display for FileChecksumResult { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Ok => write!(f, "OK"), + Self::Failed => write!(f, "FAILED"), + Self::CantOpen => write!(f, "FAILED open or read"), + } + } +} + +/// Write to the given buffer the checksum validation status of a file which +/// name might contain non-utf-8 characters. +fn write_file_report( + mut w: W, + filename: &[u8], + result: FileChecksumResult, + prefix: &str, + verbose: ChecksumVerbose, +) { + if result.can_display(verbose) { + let _ = write!(w, "{prefix}"); + let _ = w.write_all(filename); + let _ = writeln!(w, ": {result}"); + } +} + +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +enum LineFormat { + AlgoBased, + SingleSpace, + Untagged, +} + +impl LineFormat { + /// parse [tagged output format] + /// Normally the format is simply space separated but openssl does not + /// respect the gnu definition. + /// + /// [tagged output format]: https://www.gnu.org/software/coreutils/manual/html_node/cksum-output-modes.html#cksum-output-modes-1 + fn parse_algo_based(line: &[u8]) -> Option { + // r"\MD5 (a\\ b) = abc123", + // BLAKE2b(44)= + // a45a4c4883cce4b50d844fab460414cc2080ca83690e74d850a9253e757384366382625b218c8585daee80f34dc9eb2f2fde5fb959db81cd48837f9216e7b0fa + let trimmed = line.trim_ascii_start(); + let algo_start = usize::from(trimmed.starts_with(b"\\")); + let rest = &trimmed[algo_start..]; + + enum SubCase { + Posix, + OpenSSL, + } + // find the next parenthesis using byte search (not next whitespace) because + // openssl's tagged format does not put a space before (filename) + + let par_idx = rest.iter().position(|&b| b == b'(')?; + let sub_case = if rest[par_idx - 1] == b' ' { + SubCase::Posix + } else { + SubCase::OpenSSL + }; + + let algo_substring = match sub_case { + SubCase::Posix => &rest[..par_idx - 1], + SubCase::OpenSSL => &rest[..par_idx], + }; + let mut algo_parts = algo_substring.splitn(2, |&b| b == b'-'); + let algo = algo_parts.next()?; + + // Parse algo_bits if present + let algo_bits = algo_parts + .next() + .and_then(|s| std::str::from_utf8(s).ok()?.parse::().ok()); + + // Check algo format: uppercase ASCII or digits or "BLAKE2b" + let is_valid_algo = algo == b"BLAKE2b" + || algo + .iter() + .all(|&b| b.is_ascii_uppercase() || b.is_ascii_digit()); + if !is_valid_algo { + return None; + } + // SAFETY: we just validated the contents of algo, we can unsafely make a + // String from it + let algo_utf8 = unsafe { String::from_utf8_unchecked(algo.to_vec()) }; + // stripping '(' not ' (' since we matched on ( not whitespace because of + // openssl. + let after_paren = rest.get(par_idx + 1..)?; + let (filename, checksum) = match sub_case { + SubCase::Posix => ByteSliceExt::rsplit_once(after_paren, b") = ")?, + SubCase::OpenSSL => ByteSliceExt::rsplit_once(after_paren, b")= ")?, + }; + + let checksum_utf8 = Self::validate_checksum_format(checksum)?; + + Some(LineInfo { + algo_name: Some(algo_utf8), + algo_bit_len: algo_bits, + checksum: checksum_utf8, + filename: filename.to_vec(), + format: Self::AlgoBased, + }) + } + + #[allow(rustdoc::invalid_html_tags)] + /// parse [untagged output format] + /// The format is simple, either " " or + /// " *" + /// + /// [untagged output format]: https://www.gnu.org/software/coreutils/manual/html_node/cksum-output-modes.html#cksum-output-modes-1 + fn parse_untagged(line: &[u8]) -> Option { + let space_idx = line.iter().position(|&b| b == b' ')?; + let checksum = &line[..space_idx]; + + let checksum_utf8 = Self::validate_checksum_format(checksum)?; + + let rest = &line[space_idx..]; + let filename = rest + .strip_prefix(b" ") + .or_else(|| rest.strip_prefix(b" *"))?; + + Some(LineInfo { + algo_name: None, + algo_bit_len: None, + checksum: checksum_utf8, + filename: filename.to_vec(), + format: Self::Untagged, + }) + } + + #[allow(rustdoc::invalid_html_tags)] + /// parse [untagged output format] + /// Normally the format is simple, either " " or + /// " *" + /// But the bsd tests expect special single space behavior where + /// checksum and filename are separated only by a space, meaning the second + /// space or asterisk is part of the file name. + /// This parser accounts for this variation + /// + /// [untagged output format]: https://www.gnu.org/software/coreutils/manual/html_node/cksum-output-modes.html#cksum-output-modes-1 + fn parse_single_space(line: &[u8]) -> Option { + // Find first space + let space_idx = line.iter().position(|&b| b == b' ')?; + let checksum = &line[..space_idx]; + if !checksum.iter().all(|&b| b.is_ascii_hexdigit()) || checksum.is_empty() { + return None; + } + // SAFETY: we just validated the contents of checksum, we can unsafely make a + // String from it + let checksum_utf8 = unsafe { String::from_utf8_unchecked(checksum.to_vec()) }; + + let filename = line.get(space_idx + 1..)?; // Skip single space + + Some(LineInfo { + algo_name: None, + algo_bit_len: None, + checksum: checksum_utf8, + filename: filename.to_vec(), + format: Self::SingleSpace, + }) + } + + /// Ensure that the given checksum is syntactically valid (that it is either + /// hexadecimal or base64 encoded). + fn validate_checksum_format(checksum: &[u8]) -> Option { + if checksum.is_empty() { + return None; + } + + let mut is_base64 = false; + + for index in 0..checksum.len() { + match checksum[index..] { + // ASCII alphanumeric + [b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9', ..] => (), + // Base64 special character + [b'+' | b'/', ..] => is_base64 = true, + // Base64 end of string padding + [b'='] | [b'=', b'='] | [b'=', b'=', b'='] => { + is_base64 = true; + break; + }, + // Any other character means the checksum is wrong + _ => return None, + } + } + + // If base64 characters were encountered, make sure the checksum has a + // length multiple of 4. + // + // This check is not enough because it may allow base64-encoded + // checksums that are fully alphanumeric. Another check happens later + // when we are provided with a length hint to detect ambiguous + // base64-encoded checksums. + if is_base64 && !checksum.len().is_multiple_of(4) { + return None; + } + + // SAFETY: we just validated the contents of checksum, we can unsafely make a + // String from it + Some(unsafe { String::from_utf8_unchecked(checksum.to_vec()) }) + } +} + +// Helper trait for byte slice operations +trait ByteSliceExt { + /// Look for a pattern from right to left, return surrounding parts if found. + fn rsplit_once(&self, pattern: &[u8]) -> Option<(&Self, &Self)>; +} + +impl ByteSliceExt for [u8] { + fn rsplit_once(&self, pattern: &[u8]) -> Option<(&Self, &Self)> { + let pos = self + .windows(pattern.len()) + .rev() + .position(|w| w == pattern)?; + Some((&self[..self.len() - pattern.len() - pos], &self[self.len() - pos..])) + } +} + +/// Hold the data extracted from a checksum line. +struct LineInfo { + algo_name: Option, + algo_bit_len: Option, + checksum: String, + filename: Vec, + format: LineFormat, +} + +impl LineInfo { + /// Returns a `LineInfo` parsed from a checksum line. + /// The function will run 3 parsers against the line and select the first one + /// that matches to populate the fields of the struct. + /// However, there is a catch to handle regarding the handling of + /// `cached_line_format`. In case of non-algo-based format, if + /// `cached_line_format` is Some, it must take the priority + /// over the detected format. Otherwise, we must set it the the detected + /// format. This specific behavior is emphasized by the test + /// `test_md5sum::test_check_md5sum_only_one_space`. + fn parse(s: impl AsRef, cached_line_format: &mut Option) -> Option { + let line_bytes = os_bytes(s.as_ref())?; + + if let Some(info) = LineFormat::parse_algo_based(line_bytes) { + return Some(info); + } + if let Some(cached_format) = cached_line_format { + match cached_format { + LineFormat::Untagged => LineFormat::parse_untagged(line_bytes), + LineFormat::SingleSpace => LineFormat::parse_single_space(line_bytes), + LineFormat::AlgoBased => unreachable!("we never catch the algo based format"), + } + } else if let Some(info) = LineFormat::parse_untagged(line_bytes) { + *cached_line_format = Some(LineFormat::Untagged); + Some(info) + } else if let Some(info) = LineFormat::parse_single_space(line_bytes) { + *cached_line_format = Some(LineFormat::SingleSpace); + Some(info) + } else { + None + } + } +} + +/// Decodes standard Base64 using the forgiving-padding rules required by GNU. +fn forgiving_base64_decode(input: &[u8]) -> Option> { + let input = input.strip_suffix(b"==").or_else(|| input.strip_suffix(b"=")).unwrap_or(input); + if input.len() % 4 == 1 { + return None; + } + + fn sextet(byte: u8) -> Option { + match byte { + b'A'..=b'Z' => Some(byte - b'A'), + b'a'..=b'z' => Some(byte - b'a' + 26), + b'0'..=b'9' => Some(byte - b'0' + 52), + b'+' => Some(62), + b'/' => Some(63), + _ => None, + } + } + + let mut output = Vec::with_capacity(input.len() / 4 * 3 + 2); + let mut chunks = input.chunks_exact(4); + for chunk in &mut chunks { + let a = sextet(chunk[0])?; + let b = sextet(chunk[1])?; + let c = sextet(chunk[2])?; + let d = sextet(chunk[3])?; + output.extend_from_slice(&[ + (a << 2) | (b >> 4), + (b << 4) | (c >> 2), + (c << 6) | d, + ]); + } + match chunks.remainder() { + [] => {}, + [a, b] => output.push((sextet(*a)? << 2) | (sextet(*b)? >> 4)), + [a, b, c] => { + let a = sextet(*a)?; + let b = sextet(*b)?; + let c = sextet(*c)?; + output.extend_from_slice(&[(a << 2) | (b >> 4), (b << 4) | (c >> 2)]); + }, + _ => return None, + } + Some(output) +} + +/// Extracts and decodes the expected digest from a checksum string. +fn get_raw_expected_digest(checksum: &str, bit_len_hint: Option) -> Option> { + // If the length of the digest is not a multiple of 2, then it must be + // improperly formatted (1 byte is 2 hex digits, and base64 strings should + // always be a multiple of 4). + if !checksum.len().is_multiple_of(2) { + return None; + } + + let byte_len_hint = bit_len_hint.map(|n| n.div_ceil(8)); + + let checks_hint = |len| byte_len_hint.is_none_or(|hint| hint == len); + + // If the length of the string matches the one to be expected (in case it's + // given) AND the digest can be decoded as hexadecimal, just go with it. + if checks_hint(checksum.len() / 2) + && let Ok(raw_ck) = hex::decode(checksum) + { + return Some(raw_ck); + } + + // If the checksum cannot be decoded as hexadecimal, interpret it as Base64 + // instead. + + // But first, verify the encoded checksum length, which should be a + // multiple of 4. + // + // It is important to check it before trying to decode, because the + // forgiving mode of decoding will ignore if padding characters '=' are + // MISSING, but to match GNU's behavior, we must reject it. + if !checksum.len().is_multiple_of(4) { + return None; + } + + // Perform the decoding and be FORGIVING about it, to allow for checksums + // with INVALID padding to still be decoded. This is enforced by + // `test_untagged_base64_matching_tag` in `test_cksum.rs` + + forgiving_base64_decode(checksum.as_bytes()).filter(|raw| checks_hint(raw.len())) +} + +/// Returns a reader that reads from the specified file, or from stdin if +/// `filename_to_check` is "-". +fn get_file_to_check<'a>( + host: &'a mut Host, + filename: &OsStr, + opts: ChecksumValidateOptions, +) -> Result, LineCheckError> { + let filename_bytes = os_bytes(filename).ok_or_else(|| failure("invalid filename"))?; + + if filename == "-" { + return Ok(Box::new(&mut host.stdin)); + } + + match File::open(host.resolve(filename)) { + Ok(file) => { + if file.metadata().map_err(|_| LineCheckError::CantOpenFile)?.is_dir() { + let escaped = locale_aware_escape_name(filename, QuotingStyle::SHELL_ESCAPE); + host.error(format!("{}: Is a directory", escaped.to_string_lossy()), 1); + write_file_report( + &mut host.stdout, + filename_bytes, + FileChecksumResult::CantOpen, + "", + opts.verbose, + ); + Err(LineCheckError::FileIsDirectory) + } else { + Ok(Box::new(file)) + } + }, + Err(error) => { + if !opts.ignore_missing { + let escaped = locale_aware_escape_name(filename, QuotingStyle::SHELL_ESCAPE); + host.error(format!("{}: {error}", escaped.to_string_lossy()), 1); + write_file_report( + &mut host.stdout, + filename_bytes, + FileChecksumResult::CantOpen, + "", + opts.verbose, + ); + } + Err(LineCheckError::FileNotFound) + }, + } +} + +/// Returns a reader to the list of checksums. +fn get_input_file(host: &Host, filename: &OsStr) -> ExecResult> { + match File::open(host.resolve(filename)) { + Ok(file) => { + if file.metadata()?.is_dir() { + Err(failure(format!("{}: Is a directory", filename.maybe_quote()))) + } else { + Ok(Box::new(file)) + } + }, + Err(_) => Err(failure(format!( + "{}: No such file or directory", + filename.maybe_quote() + ))), + } +} + +/// Gets the algorithm name and length from the `LineInfo` if the algo-based +/// format is matched. +fn identify_algo_name_and_length( + line_info: &LineInfo, + algo_name_input: Option, + last_algo: &mut Option, +) -> Result<(AlgoKind, Option), LineCheckError> { + use AlgoKind as ak; + let algo_from_line = line_info.algo_name.clone().unwrap_or_default(); + let Ok(line_algo) = AlgoKind::from_cksum(algo_from_line.to_lowercase()) else { + // Unknown algorithm + return Err(LineCheckError::ImproperlyFormatted); + }; + *last_algo = Some(algo_from_line); + + // check if we are called with XXXsum (example: md5sum) but we detected a + // different algo parsing the file (for example SHA1 (f) = d...) + // + // Also handle the case cksum -s sm3 but the file contains other formats + if let Some(algo_name_input) = algo_name_input { + match (algo_name_input, line_algo) { + (l, r) if l == r => (), + // Edge case for SHA2, which matches SHA(224|256|384|512) + (ak::Sha2, ak::Sha224 | ak::Sha256 | ak::Sha384 | ak::Sha512) => (), + _ => return Err(LineCheckError::ImproperlyFormatted), + } + } + + let bytes = if let Some(bitlen) = line_info.algo_bit_len { + match line_algo { + algo @ (ak::Blake2b | ak::Blake3) => { + match parse_blake_length(algo, BlakeLength::Int(bitlen)) { + Ok(len) => Some(len), + Err(_) => return Err(LineCheckError::ImproperlyFormatted), + } + }, + ak::Sha2 | ak::Sha3 if [224, 256, 384, 512].contains(&bitlen) => Some(bitlen), + ak::Shake128 | ak::Shake256 => Some(bitlen), + // Either + // the algo based line is provided with a bit length with an + // algorithm that does not support it (only Blake2b, Blake3, sha2, + // and sha3 do). + // + // eg: MD5-128 (foo.txt) = fffffffff + // ^ This is illegal + // OR + // the given length is wrong because it's not a multiple of 8. + _ => return Err(LineCheckError::ImproperlyFormatted), + } + } else if line_algo == ak::Blake2b { + // Default length with BLAKE2b, + Some(Blake2b::DEFAULT_BYTE_SIZE) + } else if line_algo == ak::Blake3 { + // Default length with BLAKE3, + Some(Blake3::DEFAULT_BYTE_SIZE) + } else { + None + }; + + Ok((line_algo, bytes)) +} + +/// Given a filename and an algorithm, compute the digest and compare it with +/// the expected one. +fn compute_and_check_digest_from_file( + host: &mut Host, + filename: &[u8], + expected_checksum: &[u8], + algo: SizedAlgoKind, + opts: ChecksumValidateOptions, +) -> Result<(), LineCheckError> { + let (filename_to_check_unescaped, prefix) = unescape_filename(filename); + let real_filename_to_check = os_str_from_bytes(&filename_to_check_unescaped) + .map_err(|error| failure(error))?; + + let file_to_check = get_file_to_check(host, &real_filename_to_check, opts)?; + let mut file_reader = BufReader::new(file_to_check); + let mut digest = algo.create_digest(); + let calculated_checksum = match digest_reader(&mut digest, &mut file_reader, ReadingMode::Text) { + Ok((result, _)) => result, + Err(error) => { + drop(file_reader); + let escaped = locale_aware_escape_name( + &real_filename_to_check, + QuotingStyle::SHELL_ESCAPE, + ); + host.error(format!("{}: {error}", escaped.to_string_lossy()), 1); + write_file_report( + &mut host.stdout, + filename, + FileChecksumResult::CantOpen, + prefix, + opts.verbose, + ); + return Err(LineCheckError::CantOpenFile); + }, + }; + drop(file_reader); + + let checksum_correct = match calculated_checksum { + DigestOutput::Vec(data) => data == expected_checksum, + DigestOutput::Crc(n) => n.to_be_bytes() == expected_checksum, + DigestOutput::U16(n) => n.to_be_bytes() == expected_checksum, + }; + write_file_report( + &mut host.stdout, + filename, + FileChecksumResult::from_bool(checksum_correct), + prefix, + opts.verbose, + ); + + if checksum_correct { Ok(()) } else { Err(LineCheckError::DigestMismatch) } +} + +/// Check a digest checksum with non-algo based pre-treatment. +fn process_algo_based_line( + host: &mut Host, + line_info: &LineInfo, + cli_algo_kind: Option, + opts: ChecksumValidateOptions, + last_algo: &mut Option, +) -> Result<(), LineCheckError> { + let filename_to_check = line_info.filename.as_slice(); + + let (algo_kind, algo_len) = identify_algo_name_and_length(line_info, cli_algo_kind, last_algo)?; + + // If the digest bitlen is known, we can check the format of the expected + // checksum with it. + let digest_bit_length_hint = match (algo_kind, algo_len) { + (AlgoKind::Blake2b | AlgoKind::Blake3, Some(byte_len)) => Some(byte_len * 8), + (AlgoKind::Shake128 | AlgoKind::Shake256, Some(bit_len)) => Some(bit_len), + (AlgoKind::Shake128, None) => Some(sum::Shake128::DEFAULT_BIT_SIZE), + (AlgoKind::Shake256, None) => Some(sum::Shake256::DEFAULT_BIT_SIZE), + _ => None, + }; + + let expected_checksum = get_raw_expected_digest(&line_info.checksum, digest_bit_length_hint) + .ok_or(LineCheckError::ImproperlyFormatted)?; + + let algo = SizedAlgoKind::from_unsized(algo_kind, algo_len) + .map_err(|_| LineCheckError::ImproperlyFormatted)?; + + compute_and_check_digest_from_file(host, filename_to_check, &expected_checksum, algo, opts) +} + +/// Check a digest checksum with non-algo based pre-treatment. +fn process_non_algo_based_line( + host: &mut Host, + line_number: usize, + line_info: &LineInfo, + cli_algo_kind: AlgoKind, + cli_algo_length: Option, + opts: ChecksumValidateOptions, +) -> Result<(), LineCheckError> { + use AlgoKind as ak; + let mut filename_to_check = line_info.filename.as_slice(); + if filename_to_check.starts_with(b"*") + && line_number == 0 + && line_info.format == LineFormat::SingleSpace + { + // Remove the leading asterisk if present - only for the first line + filename_to_check = &filename_to_check[1..]; + } + + let expected_digest_sum = cli_algo_kind.expected_digest_bit_len(); + let expected_checksum = get_raw_expected_digest(&line_info.checksum, expected_digest_sum) + .ok_or(LineCheckError::ImproperlyFormatted)?; + + // When a specific algorithm name is input, use it and use the provided + // bits except when dealing with blake2b, sha2 and sha3, where we will + // detect the length. + let algo_byte_len = match cli_algo_kind { + ak::Blake2b | ak::Blake3 => Some(expected_checksum.len()), + ak::Sha2 | ak::Sha3 => { + // multiplication by 8 to get the number of bits + Some( + ShaLength::try_from(expected_checksum.len() * 8) + .map_err(|_| LineCheckError::ImproperlyFormatted)? + .as_usize(), + ) + }, + _ => cli_algo_length, + }; + + let algo = SizedAlgoKind::from_unsized(cli_algo_kind, algo_byte_len) + .map_err(|error| LineCheckError::Critical(failure(error)))?; + + compute_and_check_digest_from_file(host, filename_to_check, &expected_checksum, algo, opts) +} + +/// Parses a checksum line, detect the algorithm to use, read the file and +/// produce its digest, and compare it to the expected value. +/// +/// Returns `Ok(bool)` if the comparison happened, bool indicates if the digest +/// matched the expected. +/// If the comparison didn't happen, return a `LineChecksumError`. +fn process_checksum_line( + host: &mut Host, + line: &OsStr, + i: usize, + cli_algo_name: Option, + cli_algo_length: Option, + opts: ChecksumValidateOptions, + cached_line_format: &mut Option, + last_algo: &mut Option, +) -> Result<(), LineCheckError> { + let line_bytes = os_bytes(line).ok_or_else(|| failure("invalid checksum line"))?; + if line.is_empty() || line_bytes.starts_with(b"#") { + return Err(LineCheckError::Skipped); + } + + let Some(line_info) = LineInfo::parse(line, cached_line_format) else { + return Err(LineCheckError::ImproperlyFormatted); + }; + + if line_info.format == LineFormat::AlgoBased { + process_algo_based_line(host, &line_info, cli_algo_name, opts, last_algo) + } else if let Some(cli_algo) = cli_algo_name { + process_non_algo_based_line(host, i, &line_info, cli_algo, cli_algo_length, opts) + } else { + Err(LineCheckError::ImproperlyFormatted) + } +} + +fn process_checksum_file( + host: &mut Host, + filename_input: &OsStr, + cli_algo_kind: Option, + cli_algo_length: Option, + opts: ChecksumValidateOptions, +) -> Result<(), FileCheckError> { + let mut res = ChecksumResult::default(); + let input_is_stdin = filename_input == OsStr::new("-"); + + let lines = { + let file: Box = if input_is_stdin { + Box::new(&mut host.stdin) + } else { + match get_input_file(host, filename_input) { + Ok(file) => file, + Err(error) => { + let name = host.name().to_owned(); + let _ = writeln!(host.stderr, "{name}: {error}"); + return Err(FileCheckError::CantOpenChecksumFile); + }, + } + }; + read_os_string_lines(BufReader::new(file)) + .collect::, _>>() + .map_err(|_| failure(format!("{}: read error", filename_input.maybe_quote())))? + }; + + let mut cached_line_format = None; + let mut last_algo = None; + for (i, line) in lines.into_iter().enumerate() { + let line_result = process_checksum_line( + host, + &line, + i, + cli_algo_kind, + cli_algo_length, + opts, + &mut cached_line_format, + &mut last_algo, + ); + + use LineCheckError::*; + match &line_result { + Err(Critical(error)) => return Err(FileCheckError::Critical(error.clone())), + Err(Skipped) => (), + _ => res.total += 1, + } + + match line_result { + Ok(()) => res.correct += 1, + Err(DigestMismatch) => res.failed_cksum += 1, + Err(ImproperlyFormatted) => { + res.bad_format += 1; + if opts.verbose.at_least_warning() { + let algo = if let Some(input) = cli_algo_kind { + input.to_uppercase() + } else if let Some(algo) = &last_algo { + algo.as_str() + } else { + "Unknown algorithm" + }; + let name = host.name().to_owned(); + let _ = writeln!( + host.stderr, + "{name}: {}: line {}: improperly formatted {algo} checksum line", + filename_input.maybe_quote(), + i + 1, + ); + } + }, + Err(CantOpenFile | FileIsDirectory) => res.failed_open_file += 1, + Err(FileNotFound) if !opts.ignore_missing => res.failed_open_file += 1, + _ => (), + } + } + + let filename_display = || { + if input_is_stdin { "standard input".maybe_quote() } else { filename_input.maybe_quote() } + }; + if res.total_properly_formatted() == 0 { + if opts.verbose.over_status() { + log_no_properly_formatted(host, filename_display()); + } + return Err(FileCheckError::Failed); + } + if opts.verbose.over_status() { + print_cksum_report(host, &res); + } + if opts.ignore_missing && res.correct == 0 { + if opts.verbose.over_status() { + log_no_file_verified(host, filename_display()); + } + return Err(FileCheckError::Failed); + } + if opts.strict && res.bad_format > 0 { + return Err(FileCheckError::Failed); + } + if res.failed_open_file > 0 && !opts.ignore_missing { + return Err(FileCheckError::Failed); + } + if res.failed_cksum > 0 { + return Err(FileCheckError::Failed); + } + Ok(()) +} + +/// Do the checksum validation (can be strict or not) +fn perform_checksum_validation<'a, I>( + host: &mut Host, + files: I, + algo_kind: Option, + length_input: Option, + opts: ChecksumValidateOptions, +) -> ExecResult<()> +where + I: Iterator, +{ + let mut failed = false; + for filename_input in files { + use FileCheckError::*; + match process_checksum_file(host, filename_input, algo_kind, length_input, opts) { + Err(Critical(error)) => return Err(error), + Err(Failed | CantOpenChecksumFile) => failed = true, + Ok(()) => (), + } + } + if failed { Err(Failure(String::new())) } else { Ok(()) } +} + +#[cfg(test)] +mod tests { + use std::ffi::OsString; + + use super::*; + + #[test] + fn test_algo_based_parser() { + #[allow(clippy::type_complexity)] + let test_cases: &[(&[u8], Option<(&[u8], Option<&[u8]>, &[u8], &[u8])>)] = &[ + (b"SHA256 (example.txt) = d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2", Some((b"SHA256", None, b"example.txt", b"d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2"))), + // cspell:disable + (b"BLAKE2b-512 (file) = abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef", Some((b"BLAKE2b", Some(b"512"), b"file", b"abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"))), + (b" MD5 (test) = 9e107d9d372bb6826bd81d3542a419d6", Some((b"MD5", None, b"test", b"9e107d9d372bb6826bd81d3542a419d6"))), + (b"SHA-1 (anotherfile) = a9993e364706816aba3e25717850c26c9cd0d89d", Some((b"SHA", Some(b"1"), b"anotherfile", b"a9993e364706816aba3e25717850c26c9cd0d89d"))), + (b" MD5 (anothertest) = fds65dsf46as5df4d6f54asds5d7f7g9", Some((b"MD5", None, b"anothertest", b"fds65dsf46as5df4d6f54asds5d7f7g9"))), + (b" MD5(anothertest2) = fds65dsf46as5df4d6f54asds5d7f7g9", None), + (b" MD5(weirdfilename0)= stillfilename)= fds65dsf46as5df4d6f54asds5d7f7g9", Some((b"MD5", None, b"weirdfilename0)= stillfilename", b"fds65dsf46as5df4d6f54asds5d7f7g9"))), + (b" MD5(weirdfilename1)= )= fds65dsf46as5df4d6f54asds5d7f7g9", Some((b"MD5", None, b"weirdfilename1)= ", b"fds65dsf46as5df4d6f54asds5d7f7g9"))), + (b" MD5(weirdfilename2) = )= fds65dsf46as5df4d6f54asds5d7f7g9", Some((b"MD5", None, b"weirdfilename2) = ", b"fds65dsf46as5df4d6f54asds5d7f7g9"))), + (b" MD5 (weirdfilename3)= ) = fds65dsf46as5df4d6f54asds5d7f7g9", Some((b"MD5", None, b"weirdfilename3)= ", b"fds65dsf46as5df4d6f54asds5d7f7g9"))), + (b" MD5 (weirdfilename4) = ) = fds65dsf46as5df4d6f54asds5d7f7g9", Some((b"MD5", None, b"weirdfilename4) = ", b"fds65dsf46as5df4d6f54asds5d7f7g9"))), + (b" MD5(weirdfilename5)= ) = fds65dsf46as5df4d6f54asds5d7f7g9", None), + (b" MD5(weirdfilename6) = ) = fds65dsf46as5df4d6f54asds5d7f7g9", None), + (b" MD5 (weirdfilename7)= )= fds65dsf46as5df4d6f54asds5d7f7g9", None), + (b" MD5 (weirdfilename8) = )= fds65dsf46as5df4d6f54asds5d7f7g9", None), + ]; + + // cspell:enable + for (input, expected) in test_cases { + let line_info = LineFormat::parse_algo_based(input); + match expected { + Some((algo, bits, filename, checksum)) => { + assert!( + line_info.is_some(), + "expected Some, got None for {}", + String::from_utf8_lossy(filename) + ); + let line_info = line_info.unwrap(); + assert_eq!( + &line_info.algo_name.unwrap().as_bytes(), + algo, + "failed for {}", + String::from_utf8_lossy(filename) + ); + assert_eq!( + line_info + .algo_bit_len + .map(|m| m.to_string().as_bytes().to_owned()), + bits.map(ToOwned::to_owned), + "failed for {}", + String::from_utf8_lossy(filename) + ); + assert_eq!( + &line_info.filename, + filename, + "failed for {}", + String::from_utf8_lossy(filename) + ); + assert_eq!( + &line_info.checksum.as_bytes(), + checksum, + "failed for {}", + String::from_utf8_lossy(filename) + ); + } + None => { + assert!( + line_info.is_none(), + "failed for {}", + String::from_utf8_lossy(input) + ); + } + } + } + } + + #[test] + fn test_double_space_parser() { + #[allow(clippy::type_complexity)] + let test_cases: &[(&[u8], Option<(&[u8], &[u8])>)] = &[ + ( + b"60b725f10c9c85c70d97880dfe8191b3 a", + Some((b"60b725f10c9c85c70d97880dfe8191b3", b"a")), + ), + ( + b"bf35d7536c785cf06730d5a40301eba2 b", + Some((b"bf35d7536c785cf06730d5a40301eba2", b" b")), + ), + ( + b"f5b61709718c1ecf8db1aea8547d4698 *c", + Some((b"f5b61709718c1ecf8db1aea8547d4698", b"*c")), + ), + ( + b"b064a020db8018f18ff5ae367d01b212 dd", + Some((b"b064a020db8018f18ff5ae367d01b212", b"dd")), + ), + ( + b"b064a020db8018f18ff5ae367d01b212 ", + Some((b"b064a020db8018f18ff5ae367d01b212", b" ")), + ), + // base64 checksums are accepted + ( + b"b21lbGV0dGUgZHUgZnJvbWFnZQ== ", + Some((b"b21lbGV0dGUgZHUgZnJvbWFnZQ==", b" ")), + ), + // Invalid checksums fail + (b"inva|idchecksum test", None), + ]; + + for (input, expected) in test_cases { + let line_info = LineFormat::parse_untagged(input); + match expected { + Some((checksum, filename)) => { + assert!(line_info.is_some()); + let line_info = line_info.unwrap(); + assert_eq!(&line_info.filename, filename); + assert_eq!(&line_info.checksum.as_bytes(), checksum); + } + None => { + assert!(line_info.is_none()); + } + } + } + } + + #[test] + fn test_single_space_parser() { + #[allow(clippy::type_complexity)] + let test_cases: &[(&[u8], Option<(&[u8], &[u8])>)] = &[ + ( + b"60b725f10c9c85c70d97880dfe8191b3 a", + Some((b"60b725f10c9c85c70d97880dfe8191b3", b"a")), + ), + ( + b"bf35d7536c785cf06730d5a40301eba2 b", + Some((b"bf35d7536c785cf06730d5a40301eba2", b"b")), + ), + ( + b"f5b61709718c1ecf8db1aea8547d4698 *c", + Some((b"f5b61709718c1ecf8db1aea8547d4698", b"*c")), + ), + ( + b"b064a020db8018f18ff5ae367d01b212 dd", + Some((b"b064a020db8018f18ff5ae367d01b212", b"dd")), + ), + (b"invalidchecksum test", None), + ]; + + for (input, expected) in test_cases { + let line_info = LineFormat::parse_single_space(input); + match expected { + Some((checksum, filename)) => { + assert!(line_info.is_some()); + let line_info = line_info.unwrap(); + assert_eq!(&line_info.filename, filename); + assert_eq!(&line_info.checksum.as_bytes(), checksum); + } + None => { + assert!(line_info.is_none()); + } + } + } + } + + #[test] + fn test_line_info() { + let mut cached_line_format = None; + + // Test algo-based parser + let line_algo_based = + OsString::from("MD5 (example.txt) = d41d8cd98f00b204e9800998ecf8427e"); + let line_info = LineInfo::parse(&line_algo_based, &mut cached_line_format).unwrap(); + assert_eq!(line_info.algo_name.as_deref(), Some("MD5")); + assert!(line_info.algo_bit_len.is_none()); + assert_eq!(line_info.filename, b"example.txt"); + assert_eq!(line_info.checksum, "d41d8cd98f00b204e9800998ecf8427e"); + assert_eq!(line_info.format, LineFormat::AlgoBased); + assert!(cached_line_format.is_none()); + + // Test double-space parser + let line_double_space = OsString::from("d41d8cd98f00b204e9800998ecf8427e example.txt"); + let line_info = LineInfo::parse(&line_double_space, &mut cached_line_format).unwrap(); + assert!(line_info.algo_name.is_none()); + assert!(line_info.algo_bit_len.is_none()); + assert_eq!(line_info.filename, b"example.txt"); + assert_eq!(line_info.checksum, "d41d8cd98f00b204e9800998ecf8427e"); + assert_eq!(line_info.format, LineFormat::Untagged); + assert!(cached_line_format.is_some()); + + cached_line_format = None; + + // Test single-space parser + let line_single_space = OsString::from("d41d8cd98f00b204e9800998ecf8427e example.txt"); + let line_info = LineInfo::parse(&line_single_space, &mut cached_line_format).unwrap(); + assert!(line_info.algo_name.is_none()); + assert!(line_info.algo_bit_len.is_none()); + assert_eq!(line_info.filename, b"example.txt"); + assert_eq!(line_info.checksum, "d41d8cd98f00b204e9800998ecf8427e"); + assert_eq!(line_info.format, LineFormat::SingleSpace); + assert!(cached_line_format.is_some()); + + cached_line_format = None; + + // Test invalid checksum line + let line_invalid = OsString::from("invalid checksum line"); + assert!(LineInfo::parse(&line_invalid, &mut cached_line_format).is_none()); + assert!(cached_line_format.is_none()); + + // Test leading space before checksum line + let line_algo_based_leading_space = + OsString::from(" MD5 (example.txt) = d41d8cd98f00b204e9800998ecf8427e"); + let line_info = + LineInfo::parse(&line_algo_based_leading_space, &mut cached_line_format).unwrap(); + assert_eq!(line_info.format, LineFormat::AlgoBased); + assert!(cached_line_format.is_none()); + + // Test trailing space after checksum line (should fail) + let line_algo_based_leading_space = + OsString::from("MD5 (example.txt) = d41d8cd98f00b204e9800998ecf8427e "); + let res = LineInfo::parse(&line_algo_based_leading_space, &mut cached_line_format); + assert!(res.is_none()); + assert!(cached_line_format.is_none()); + } + + #[test] + fn test_get_expected_digest() { + let ck = "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=".to_owned(); + + let result = get_raw_expected_digest(&ck, None); + + assert_eq!( + result.unwrap(), + hex::decode(b"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855") + .unwrap() + ); + } + + #[test] + fn test_get_expected_checksum_invalid() { + // The line misses a '=' at the end to be valid base64 + let ck = "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU".to_owned(); + + let result = get_raw_expected_digest(&ck, None); + + assert!(result.is_none()); + } + + #[test] + fn test_get_expected_checksum_forgives_invalid_padding() { + let checksum = "Zh=="; + assert_eq!(get_raw_expected_digest(checksum, None), Some(b"f".to_vec())); + } + + #[test] + fn test_write_file_report() { + let opts = ChecksumValidateOptions::default(); + + let cases: &[(&[u8], FileChecksumResult, &str, &[u8])] = &[ + (b"filename", FileChecksumResult::Ok, "", b"filename: OK\n"), + ( + b"filename", + FileChecksumResult::Failed, + "", + b"filename: FAILED\n", + ), + ( + b"filename", + FileChecksumResult::CantOpen, + "", + b"filename: FAILED open or read\n", + ), + ( + b"filename", + FileChecksumResult::Ok, + "prefix", + b"prefixfilename: OK\n", + ), + ( + b"funky\xffname", + FileChecksumResult::Ok, + "", + b"funky\xffname: OK\n", + ), + ]; + + for (filename, result, prefix, expected) in cases { + let mut buffer: Vec = vec![]; + write_file_report(&mut buffer, filename, *result, prefix, opts.verbose); + assert_eq!(&buffer, expected); + } + } +} + diff --git a/crates/pi-shell/src/cmp.rs b/crates/pi-builtins/src/cmp.rs similarity index 74% rename from crates/pi-shell/src/cmp.rs rename to crates/pi-builtins/src/cmp.rs index 517fb3c2a..69157e790 100644 --- a/crates/pi-shell/src/cmp.rs +++ b/crates/pi-builtins/src/cmp.rs @@ -1,13 +1,21 @@ -//! Context-safe, in-process `cmp` implementation for the embedded shell. +//! `cmp` builtin: compare two files byte by byte. +//! +//! Ported from the `pi-shell` in-process implementation. use std::{ ffi::{OsStr, OsString}, fs::{self, File}, io::{self, BufRead, BufReader, Cursor, Read, Seek, SeekFrom, Write}, + path::Path, + sync::{ + atomic::{AtomicBool, Ordering}, + }, }; +use brush_core::{ShellExtensions, builtins::Registration}; use clap::{Arg, ArgAction, ArgMatches, Command}; -use pi_uutils_ctx::format_usage; + +use crate::host::{Host, Stdin, Utility, format_usage, matches_parser, util}; const OPT_PRINT_BYTES: &str = "print-bytes"; const OPT_IGNORE_INITIAL: &str = "ignore-initial"; @@ -36,13 +44,13 @@ struct Options { skip2: u64, } -enum InputReader { +enum InputReader<'a> { File(File), - Stdin(pi_uutils_ctx::CtxStdin), + Stdin(&'a mut Stdin), Bytes(Cursor>), } -impl Read for InputReader { +impl Read for InputReader<'_> { fn read(&mut self, buf: &mut [u8]) -> io::Result { match self { Self::File(file) => file.read(buf), @@ -52,7 +60,7 @@ impl Read for InputReader { } } -impl InputReader { +impl InputReader<'_> { fn skip(&mut self, count: u64) -> io::Result<()> { match self { Self::File(file) => { @@ -70,40 +78,36 @@ impl InputReader { } } -struct Input { - reader: BufReader, +struct Input<'a> { + reader: BufReader>, regular_len: Option, } -/// Runs `cmp` against invocation-scoped stdin/stdout/stderr and shell-relative -/// paths. -pub fn run(argv: Vec) -> i32 { - let matches = match command().try_get_matches_from(argv) { - Ok(matches) => matches, - Err(err) => { - let code = err.exit_code(); - let rendered = err.to_string(); - if err.use_stderr() { - let _ = write!(pi_uutils_ctx::stderr(), "{rendered}"); - } else { - let _ = write!(pi_uutils_ctx::stdout(), "{rendered}"); - } - return code; - }, - }; +/// Parsed `cmp` invocation. +pub(crate) struct Cmp { + matches: ArgMatches, +} - match compare(&matches) { - Ok(code) => code, - Err(message) => { - let _ = writeln!(pi_uutils_ctx::stderr(), "cmp: {message}"); - 2 - }, +matches_parser!(Cmp, command); + +impl Utility for Cmp { + const NAME: &'static str = "cmp"; + const USAGE_ERROR: u8 = 2; + + fn run(self, host: &mut Host) -> i32 { + match compare(&self.matches, host) { + Ok(code) => code, + Err(message) => { + host.error(message, 2); + 2 + }, + } } } fn command() -> Command { - Command::new("cmp") - .version(concat!("cmp (pi-shell) ", env!("CARGO_PKG_VERSION"))) + Command::new(Cmp::NAME) + .version("cmp (pi-shell) 17.2.11") .about("Compare two files byte by byte.") .override_usage(format_usage("cmp [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]")) .disable_help_flag(true) @@ -188,7 +192,7 @@ fn command() -> Command { .arg(Arg::new(ARG_SKIP2).value_name("SKIP2")) } -fn compare(matches: &ArgMatches) -> Result { +fn compare(matches: &ArgMatches, host: &mut Host) -> Result { let name1 = matches.get_one::(ARG_FILE1).unwrap(); let default_stdin = OsString::from("-"); let name2 = matches @@ -213,36 +217,50 @@ fn compare(matches: &ArgMatches) -> Result { skip1, skip2, }; + let path1 = (name1 != OsStr::new("-")).then(|| host.resolve(name1)); + let path2 = (name2 != OsStr::new("-")).then(|| host.resolve(name2)); + let cancel = host.cancel_flag(); - let mut input1 = open_input(name1, options.no_follow)?; - let mut input2 = open_input(name2, options.no_follow)?; - if options.size_first - && let (Some(len1), Some(len2)) = (input1.regular_len, input2.regular_len) - && len1 != len2 - { - if !options.quiet { - writeln!( - pi_uutils_ctx::stdout(), - "{} {} differ: size", - display_name(name1), - display_name(name2) - ) - .map_err(io_message)?; - } - return Ok(1); + if name1 == OsStr::new("-") { + let input1 = stdin_input(&mut host.stdin); + let input2 = open_input(name2, path2.as_deref().unwrap(), options.no_follow)?; + compare_inputs( + input1, + input2, + name1, + name2, + options, + &mut host.stdout, + &mut host.stderr, + &cancel, + ) + } else if name2 == OsStr::new("-") { + let input1 = open_input(name1, path1.as_deref().unwrap(), options.no_follow)?; + let input2 = stdin_input(&mut host.stdin); + compare_inputs( + input1, + input2, + name1, + name2, + options, + &mut host.stdout, + &mut host.stderr, + &cancel, + ) + } else { + let input1 = open_input(name1, path1.as_deref().unwrap(), options.no_follow)?; + let input2 = open_input(name2, path2.as_deref().unwrap(), options.no_follow)?; + compare_inputs( + input1, + input2, + name1, + name2, + options, + &mut host.stdout, + &mut host.stderr, + &cancel, + ) } - - input1 - .reader - .get_mut() - .skip(options.skip1) - .map_err(|err| input_error(name1, &err))?; - input2 - .reader - .get_mut() - .skip(options.skip2) - .map_err(|err| input_error(name2, &err))?; - compare_readers(&mut input1.reader, &mut input2.reader, name1, name2, options) } fn skips(matches: &ArgMatches) -> Result<(u64, u64), String> { @@ -313,25 +331,22 @@ fn parse_count(value: &str) -> Result { .ok_or_else(|| format!("byte count '{value}' is too large")) } -fn open_input(name: &OsStr, no_follow: bool) -> Result { - if name == OsStr::new("-") { - return Ok(Input { - reader: BufReader::with_capacity( - BUFFER_SIZE, - InputReader::Stdin(pi_uutils_ctx::stdin()), - ), - regular_len: None, - }); +fn stdin_input(stdin: &mut Stdin) -> Input<'_> { + Input { + reader: BufReader::with_capacity(BUFFER_SIZE, InputReader::Stdin(stdin)), + regular_len: None, } - let path = pi_uutils_ctx::resolve(name); +} + +fn open_input<'a>(name: &OsStr, path: &Path, no_follow: bool) -> Result, String> { let metadata = if no_follow { - fs::symlink_metadata(&path) + fs::symlink_metadata(path) } else { - fs::metadata(&path) + fs::metadata(path) } .map_err(|err| input_error(name, &err))?; if no_follow && metadata.file_type().is_symlink() { - let target = fs::read_link(&path).map_err(|err| input_error(name, &err))?; + let target = fs::read_link(path).map_err(|err| input_error(name, &err))?; return Ok(Input { reader: BufReader::with_capacity( BUFFER_SIZE, @@ -348,12 +363,63 @@ fn open_input(name: &OsStr, no_follow: bool) -> Result { Ok(Input { reader: BufReader::with_capacity(BUFFER_SIZE, InputReader::File(file)), regular_len }) } +fn compare_inputs( + mut input1: Input<'_>, + mut input2: Input<'_>, + name1: &OsStr, + name2: &OsStr, + options: Options, + stdout: &mut impl Write, + stderr: &mut impl Write, + cancel: &AtomicBool, +) -> Result { + if options.size_first + && let (Some(len1), Some(len2)) = (input1.regular_len, input2.regular_len) + && len1 != len2 + { + if !options.quiet { + writeln!( + stdout, + "{} {} differ: size", + display_name(name1), + display_name(name2) + ) + .map_err(io_message)?; + } + return Ok(1); + } + + input1 + .reader + .get_mut() + .skip(options.skip1) + .map_err(|err| input_error(name1, &err))?; + input2 + .reader + .get_mut() + .skip(options.skip2) + .map_err(|err| input_error(name2, &err))?; + compare_readers( + &mut input1.reader, + &mut input2.reader, + name1, + name2, + options, + stdout, + stderr, + cancel, + ) +} + fn compare_readers( input1: &mut impl BufRead, input2: &mut impl BufRead, name1: &OsStr, name2: &OsStr, options: Options, + stdout: &mut impl Write, + stderr: &mut impl Write, + cancel: &AtomicBool, ) -> Result { let mut byte_number = 1u64; let mut line_number = 1u64; @@ -361,7 +427,7 @@ fn compare_readers( let mut different = false; loop { - if pi_uutils_ctx::is_cancelled() { + if cancel.load(Ordering::Relaxed) { return Err("interrupted".to_string()); } if options.limit.is_some_and(|limit| compared >= limit) { @@ -377,7 +443,7 @@ fn compare_readers( if !options.quiet { let eof_name = if left.is_empty() { name1 } else { name2 }; writeln!( - pi_uutils_ctx::stderr(), + stderr, "cmp: EOF on {} after byte {}", display_name(eof_name), compared @@ -405,6 +471,7 @@ fn compare_readers( name1, name2, options, + stdout, )?; if !options.verbose && !options.hex { return Ok(1); @@ -431,8 +498,8 @@ fn report_difference( name1: &OsStr, name2: &OsStr, options: Options, + out: &mut impl Write, ) -> Result<(), String> { - let mut out = pi_uutils_ctx::stdout(); if options.hex { return writeln!(out, "{:08x} {left:02x} {right:02x}", byte_number - 1).map_err(io_message); } @@ -440,12 +507,12 @@ fn report_difference( write!(out, "{byte_number} {left:3o}").map_err(io_message)?; if options.print_bytes { write!(out, " ").map_err(io_message)?; - write_visible_byte_padded(&mut out, left).map_err(io_message)?; + write_visible_byte_padded(out, left).map_err(io_message)?; } write!(out, " {right:3o}").map_err(io_message)?; if options.print_bytes { write!(out, " ").map_err(io_message)?; - write_visible_byte(&mut out, right).map_err(io_message)?; + write_visible_byte(out, right).map_err(io_message)?; } return writeln!(out).map_err(io_message); } @@ -459,9 +526,9 @@ fn report_difference( .map_err(io_message)?; if options.print_bytes { write!(out, " is {left:3o} ").map_err(io_message)?; - write_visible_byte(&mut out, left).map_err(io_message)?; + write_visible_byte(out, left).map_err(io_message)?; write!(out, " {right:3o} ").map_err(io_message)?; - write_visible_byte(&mut out, right).map_err(io_message)?; + write_visible_byte(out, right).map_err(io_message)?; } writeln!(out).map_err(io_message) } @@ -508,56 +575,21 @@ fn io_message(err: io::Error) -> String { err.to_string() } +/// Creates the `cmp` builtin registration. +pub(crate) fn cmp_builtin() -> Registration { + util::() +} + #[cfg(test)] mod tests { - use std::{ - collections::HashMap, - ffi::OsString, - fs, - io::{Cursor, Write}, - path::PathBuf, - sync::{Arc, atomic::AtomicBool}, - }; + use std::{fs, path::PathBuf}; - use parking_lot::Mutex; - use pi_uutils_ctx::ScopeIo; + use super::Cmp; + use crate::host::run_util; - use super::run; - - #[derive(Clone)] - struct SharedWriter(Arc>>); - - impl Write for SharedWriter { - fn write(&mut self, buf: &[u8]) -> std::io::Result { - self.0.lock().write(buf) - } - - fn flush(&mut self) -> std::io::Result<()> { - self.0.lock().flush() - } - } - - fn run_in(cwd: PathBuf, stdin: &[u8], args: &[&str]) -> (i32, String, String) { - let stdout = Arc::new(Mutex::new(Vec::new())); - let stderr = Arc::new(Mutex::new(Vec::new())); - let io = ScopeIo { - stdin: Box::new(Cursor::new(stdin.to_vec())), - stdin_fd: None, - stdin_is_search_input: false, - stdout: Box::new(SharedWriter(Arc::clone(&stdout))), - stderr: Box::new(SharedWriter(Arc::clone(&stderr))), - cwd, - env: HashMap::new(), - cancel: Arc::new(AtomicBool::new(false)), - }; - let argv = std::iter::once("cmp") - .chain(args.iter().copied()) - .map(OsString::from) - .collect(); - let code = pi_uutils_ctx::scope(io, || run(argv)); - let stdout = String::from_utf8(stdout.lock().clone()).unwrap(); - let stderr = String::from_utf8(stderr.lock().clone()).unwrap(); - (code, stdout, stderr) + fn run_in(cwd: PathBuf, stdin: &str, args: &[&str]) -> (i32, String, String) { + let (code, capture) = run_util::(args, stdin, cwd); + (code, capture.out(), capture.err()) } fn tempdir() -> (tempfile::TempDir, PathBuf) { @@ -573,8 +605,8 @@ mod tests { fs::write(root.join("b"), b"same").unwrap(); fs::write(root.join("c"), b"different").unwrap(); - assert_eq!(run_in(root.clone(), b"", &["-s", "a", "b"]), (0, String::new(), String::new())); - assert_eq!(run_in(root, b"", &["-s", "a", "c"]), (1, String::new(), String::new())); + assert_eq!(run_in(root.clone(), "", &["-s", "a", "b"]), (0, String::new(), String::new())); + assert_eq!(run_in(root, "", &["-s", "a", "c"]), (1, String::new(), String::new())); } #[test] @@ -583,7 +615,7 @@ mod tests { fs::write(root.join("a"), b"one\ntwo\n").unwrap(); fs::write(root.join("b"), b"one\ntXo\n").unwrap(); - let (code, stdout, stderr) = run_in(root, b"", &["a", "b"]); + let (code, stdout, stderr) = run_in(root, "", &["a", "b"]); assert_eq!(code, 1); assert_eq!(stdout, "a b differ: char 6, line 2\n"); assert_eq!(stderr, ""); @@ -595,10 +627,10 @@ mod tests { fs::write(root.join("file"), b"abc").unwrap(); assert_eq!( - run_in(root.clone(), b"xxabc", &["-i", "0:2", "file"]), + run_in(root.clone(), "xxabc", &["-i", "0:2", "file"]), (0, String::new(), String::new()) ); - assert_eq!(run_in(root, b"abZ", &["-n", "0x2", "file"]), (0, String::new(), String::new())); + assert_eq!(run_in(root, "abZ", &["-n", "0x2", "file"]), (0, String::new(), String::new())); } #[test] @@ -607,29 +639,28 @@ mod tests { fs::write(root.join("a"), b"abc").unwrap(); fs::write(root.join("b"), b"axd").unwrap(); - let (code, stdout, stderr) = run_in(root.clone(), b"", &["-l", "a", "b"]); + let (code, stdout, stderr) = run_in(root.clone(), "", &["-l", "a", "b"]); assert_eq!((code, stdout.as_str(), stderr.as_str()), (1, "2 142 170\n3 143 144\n", "")); - let (code, stdout, stderr) = run_in(root, b"", &["-x", "a", "b"]); + let (code, stdout, stderr) = run_in(root, "", &["-x", "a", "b"]); assert_eq!( (code, stdout.as_str(), stderr.as_str()), (1, "00000001 62 78\n00000002 63 64\n", "") ); } + #[cfg(unix)] #[test] fn no_follow_compares_symlink_targets() { let (_dir, root) = tempdir(); fs::write(root.join("a"), b"same").unwrap(); fs::write(root.join("b"), b"same").unwrap(); - #[cfg(unix)] - { - std::os::unix::fs::symlink("a", root.join("left")).unwrap(); - std::os::unix::fs::symlink("b", root.join("right")).unwrap(); - let (code, stdout, stderr) = run_in(root, b"", &["-h", "left", "right"]); - assert_eq!(code, 1); - assert_eq!(stdout, "left right differ: char 1, line 1\n"); - assert_eq!(stderr, ""); - } + std::os::unix::fs::symlink("a", root.join("left")).unwrap(); + std::os::unix::fs::symlink("b", root.join("right")).unwrap(); + + let (code, stdout, stderr) = run_in(root, "", &["-h", "left", "right"]); + assert_eq!(code, 1); + assert_eq!(stdout, "left right differ: char 1, line 1\n"); + assert_eq!(stderr, ""); } } diff --git a/crates/vendor/brush-builtins/src/colon.rs b/crates/pi-builtins/src/colon.rs similarity index 100% rename from crates/vendor/brush-builtins/src/colon.rs rename to crates/pi-builtins/src/colon.rs diff --git a/crates/pi-builtins/src/combine.rs b/crates/pi-builtins/src/combine.rs new file mode 100644 index 000000000..908a982af --- /dev/null +++ b/crates/pi-builtins/src/combine.rs @@ -0,0 +1,381 @@ +//! `combine` builtin: boolean set operations on the lines of two files. +//! +//! Ported from the moreutils-inspired in-process implementation in `pi-shell`. +//! Keeping the utility in process lets it use the shell's scoped streams, +//! working directory, and cancellation rather than spawning an external tool. +//! +//! `combine FILE1 OP FILE2` accepts the case-insensitive operators `and`, `not`, +//! `or`, and `xor`. `-` names stdin, but only for one operand. Lines remain raw +//! byte strings; membership ignores a trailing newline, while output preserves +//! each original line exactly. + +use std::{ + collections::HashSet, + ffi::{OsStr, OsString}, + fs::File, + io::{BufRead, BufReader, Write}, + sync::atomic::{AtomicBool, Ordering}, +}; + +use brush_core::{ShellExtensions, builtins::Registration}; +use clap::{Arg, ArgAction, ArgMatches, Command, value_parser}; + +use crate::host::{Host, Utility, format_usage, matches_parser, util}; + +const ARG_FILE1: &str = "file1"; +const ARG_OP: &str = "op"; +const ARG_FILE2: &str = "file2"; + +#[derive(Clone, Copy, PartialEq)] +enum Op { + And, + Not, + Or, + Xor, +} + +enum Error { + Cancelled, + Msg(String), +} + +/// Parsed `combine` invocation. +pub(crate) struct Combine { + matches: ArgMatches, +} + +matches_parser!(Combine, command); + +impl Utility for Combine { + const NAME: &'static str = "combine"; + + fn run(self, host: &mut Host) -> i32 { + let file1 = self + .matches + .get_one::(ARG_FILE1) + .expect("required") + .clone(); + let op = self.matches.get_one::(ARG_OP).expect("required"); + let file2 = self + .matches + .get_one::(ARG_FILE2) + .expect("required") + .clone(); + + match execute(&file1, op, &file2, host) { + Ok(()) => 0, + Err(Error::Cancelled) => 130, + Err(Error::Msg(message)) => { + host.error(message, 1); + 1 + }, + } + } +} + +/// The `combine` argument model. +fn command() -> Command { + Command::new(Combine::NAME) + .version("combine (pi-shell) 17.2.11") + .about("Combine the lines of two files using boolean operations.") + .override_usage(format_usage("combine FILE1 and|not|or|xor FILE2")) + .disable_help_flag(true) + .disable_version_flag(true) + .arg(Arg::new("help").long("help").action(ArgAction::Help)) + .arg( + Arg::new(ARG_FILE1) + .value_name("FILE1") + .required(true) + .value_parser(value_parser!(OsString)), + ) + .arg(Arg::new(ARG_OP).value_name("OP").required(true)) + .arg( + Arg::new(ARG_FILE2) + .value_name("FILE2") + .required(true) + .value_parser(value_parser!(OsString)), + ) +} + +fn execute(file1: &OsStr, op: &str, file2: &OsStr, host: &mut Host) -> Result<(), Error> { + let op = match op.to_ascii_lowercase().as_str() { + "and" => Op::And, + "not" => Op::Not, + "or" => Op::Or, + "xor" => Op::Xor, + other => { + return Err(Error::Msg(format!( + "unknown operation '{other}' (expected and, not, or, xor)" + ))); + }, + }; + let dash = OsStr::new("-"); + if file1 == dash && file2 == dash { + return Err(Error::Msg("only one file can be stdin".into())); + } + + // Open both up front so a missing FILE2 fails before stdin is consumed. + let input1 = open_input(file1, host)?; + let input2 = open_input(file2, host)?; + let cancel = host.cancel_flag(); + + match (input1, input2) { + (Some(input1), Some(input2)) => operate( + BufReader::new(input1), + file1, + BufReader::new(input2), + file2, + op, + &cancel, + &mut host.stdout, + ), + (None, Some(input2)) => operate( + BufReader::new(&mut host.stdin), + file1, + BufReader::new(input2), + file2, + op, + &cancel, + &mut host.stdout, + ), + (Some(input1), None) => operate( + BufReader::new(input1), + file1, + BufReader::new(&mut host.stdin), + file2, + op, + &cancel, + &mut host.stdout, + ), + (None, None) => unreachable!("two stdin operands were rejected above"), + } +} + +fn operate( + mut input1: impl BufRead, + file1: &OsStr, + mut input2: impl BufRead, + file2: &OsStr, + op: Op, + cancel: &AtomicBool, + out: &mut impl Write, +) -> Result<(), Error> { + match op { + Op::And | Op::Not => { + // Membership side must be fully loaded before streaming FILE1. + let lines2 = read_lines(&mut input2, file2, cancel)?; + let set2: HashSet<&[u8]> = lines2.iter().map(|line| key(line)).collect(); + let keep_member = op == Op::And; + each_line(&mut input1, file1, cancel, |line| { + if set2.contains(key(line)) == keep_member { + write_line(out, line)?; + } + Ok(()) + })?; + }, + Op::Or => { + each_line(&mut input1, file1, cancel, |line| write_line(out, line))?; + each_line(&mut input2, file2, cancel, |line| write_line(out, line))?; + }, + Op::Xor => { + let lines1 = read_lines(&mut input1, file1, cancel)?; + let lines2 = read_lines(&mut input2, file2, cancel)?; + let set1: HashSet<&[u8]> = lines1.iter().map(|line| key(line)).collect(); + let set2: HashSet<&[u8]> = lines2.iter().map(|line| key(line)).collect(); + for line in &lines1 { + if !set2.contains(key(line)) { + write_line(out, line)?; + } + } + for line in &lines2 { + if !set1.contains(key(line)) { + write_line(out, line)?; + } + } + }, + } + out.flush().map_err(|err| Error::Msg(err.to_string()))?; + Ok(()) +} + +fn open_input(name: &OsStr, host: &Host) -> Result, Error> { + if name == OsStr::new("-") { + return Ok(None); + } + let path = host.resolve(name); + let file = File::open(path).map_err(|err| Error::Msg(input_error(name, &err.to_string())))?; + Ok(Some(file)) +} + +/// Streams `reader` line by line (trailing `\n` retained when present), +/// polling for cancellation between lines. +fn each_line( + reader: &mut dyn BufRead, + name: &OsStr, + cancel: &AtomicBool, + mut f: impl FnMut(&[u8]) -> Result<(), Error>, +) -> Result<(), Error> { + let mut line = Vec::new(); + loop { + if cancel.load(Ordering::Relaxed) { + return Err(Error::Cancelled); + } + line.clear(); + let n = reader + .read_until(b'\n', &mut line) + .map_err(|err| Error::Msg(input_error(name, &err.to_string())))?; + if n == 0 { + return Ok(()); + } + f(&line)?; + } +} + +fn read_lines( + reader: &mut dyn BufRead, + name: &OsStr, + cancel: &AtomicBool, +) -> Result>, Error> { + let mut lines = Vec::new(); + each_line(reader, name, cancel, |line| { + lines.push(line.to_vec()); + Ok(()) + })?; + Ok(lines) +} + +/// Membership key: the line with any trailing newline stripped, so `foo` +/// (no newline) matches `foo\n`. +fn key(line: &[u8]) -> &[u8] { + line.strip_suffix(b"\n").unwrap_or(line) +} + +fn write_line(out: &mut impl Write, line: &[u8]) -> Result<(), Error> { + out.write_all(line) + .map_err(|err| Error::Msg(err.to_string())) +} + +fn input_error(name: &OsStr, err: &str) -> String { + format!("{}: {}", name.to_string_lossy(), err) +} + +/// Creates the `combine` builtin registration. +pub(crate) fn combine_builtin() -> Registration { + util::() +} + +#[cfg(test)] +mod tests { + use std::{fs, path::Path}; + + use super::Combine; + use crate::host::run_util; + + fn run_in(cwd: &Path, stdin: &str, args: &[&str]) -> (i32, Vec, String) { + let (code, capture) = run_util::(args, stdin, cwd); + (code, capture.stdout(), capture.err()) + } + + fn fixture() -> tempfile::TempDir { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("one"), b"a\nb\na\nc\n").unwrap(); + fs::write(dir.path().join("two"), b"a\nc\nd\n").unwrap(); + dir + } + + #[test] + fn and_keeps_file1_order_and_duplicates() { + let dir = fixture(); + let (code, stdout, stderr) = run_in(dir.path(), "", &["one", "and", "two"]); + assert_eq!((code, stdout.as_slice(), stderr.as_str()), (0, b"a\na\nc\n".as_slice(), "")); + } + + #[test] + fn not_removes_file2_members() { + let dir = fixture(); + let (code, stdout, stderr) = run_in(dir.path(), "", &["one", "not", "two"]); + assert_eq!((code, stdout.as_slice(), stderr.as_str()), (0, b"b\n".as_slice(), "")); + } + + #[test] + fn or_concatenates_both_files() { + let dir = fixture(); + let (code, stdout, stderr) = run_in(dir.path(), "", &["one", "or", "two"]); + assert_eq!( + (code, stdout.as_slice(), stderr.as_str()), + (0, b"a\nb\na\nc\na\nc\nd\n".as_slice(), "") + ); + } + + #[test] + fn xor_emits_exclusive_lines_from_both_sides() { + let dir = fixture(); + let (code, stdout, stderr) = run_in(dir.path(), "", &["one", "XOR", "two"]); + assert_eq!((code, stdout.as_slice(), stderr.as_str()), (0, b"b\nd\n".as_slice(), "")); + } + + #[test] + fn dash_reads_file1_from_stdin() { + let dir = fixture(); + let (code, stdout, stderr) = + run_in(dir.path(), "a\nb\na\nc\n", &["-", "and", "two"]); + assert_eq!((code, stdout.as_slice(), stderr.as_str()), (0, b"a\na\nc\n".as_slice(), "")); + } + + #[test] + fn both_sides_stdin_is_rejected() { + let dir = tempfile::tempdir().unwrap(); + let (code, stdout, stderr) = run_in(dir.path(), "", &["-", "and", "-"]); + assert_eq!(code, 1); + assert!(stdout.is_empty()); + assert_eq!(stderr, "combine: only one file can be stdin\n"); + } + + #[test] + fn non_utf8_lines_survive_byte_exact() { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("one"), b"\xff\xfe\n\x80ok\n").unwrap(); + fs::write(dir.path().join("two"), b"\xff\xfe\n").unwrap(); + let (code, stdout, stderr) = run_in(dir.path(), "", &["one", "and", "two"]); + assert_eq!((code, stdout.as_slice(), stderr.as_str()), (0, b"\xff\xfe\n".as_slice(), "")); + } + + #[test] + fn missing_file_reports_error_exit_1() { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("one"), b"a\n").unwrap(); + let (code, stdout, stderr) = run_in(dir.path(), "", &["one", "and", "nope"]); + assert_eq!(code, 1); + assert!(stdout.is_empty()); + assert!(stderr.starts_with("combine: nope: "), "stderr: {stderr}"); + } + + #[test] + fn unknown_op_is_usage_error_exit_1() { + let dir = fixture(); + let (code, stdout, stderr) = run_in(dir.path(), "", &["one", "nand", "two"]); + assert_eq!(code, 1); + assert!(stdout.is_empty()); + assert_eq!(stderr, "combine: unknown operation 'nand' (expected and, not, or, xor)\n"); + } + + #[test] + fn wrong_arg_count_is_usage_error_exit_1() { + let dir = tempfile::tempdir().unwrap(); + let (code, stdout, stderr) = run_in(dir.path(), "", &["only-one"]); + assert_eq!(code, 1); + assert!(stdout.is_empty()); + assert!(stderr.contains("Usage"), "stderr: {stderr}"); + } + + #[test] + fn last_line_without_newline_matches_and_is_emitted_as_is() { + // `b` without a trailing newline still counts as a line, matches + // `b\n` in the other file, and is emitted without adding a newline. + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("one"), b"a\nb").unwrap(); + fs::write(dir.path().join("two"), b"b\n").unwrap(); + let (code, stdout, stderr) = run_in(dir.path(), "", &["one", "and", "two"]); + assert_eq!((code, stdout.as_slice(), stderr.as_str()), (0, b"b".as_slice(), "")); + } +} diff --git a/crates/pi-builtins/src/comm.rs b/crates/pi-builtins/src/comm.rs new file mode 100644 index 000000000..6c6e9ef16 --- /dev/null +++ b/crates/pi-builtins/src/comm.rs @@ -0,0 +1,422 @@ +//! `comm` builtin: compare two sorted files line by line. +//! +//! Ported from uutils coreutils 0.8.0. + +use std::{ + cmp::Ordering, + ffi::{OsStr, OsString}, + fs::{self, File}, + io::{self, BufRead, BufReader, BufWriter, Read, Write}, + path::Path, +}; + +use brush_core::{ShellExtensions, builtins::Registration}; +use clap::{Arg, ArgAction, ArgMatches, Command}; +use uucore::{display::Quotable, line_ending::LineEnding}; + +use crate::host::{Host, Utility, format_usage, matches_parser, util}; + +mod options { + pub const COLUMN_1: &str = "1"; + pub const COLUMN_2: &str = "2"; + pub const COLUMN_3: &str = "3"; + pub const DELIMITER: &str = "output-delimiter"; + pub const FILE_1: &str = "FILE1"; + pub const FILE_2: &str = "FILE2"; + pub const TOTAL: &str = "total"; + pub const ZERO_TERMINATED: &str = "zero-terminated"; + pub const CHECK_ORDER: &str = "check-order"; + pub const NO_CHECK_ORDER: &str = "nocheck-order"; +} + +#[derive(Clone, Copy)] +enum FileNumber { + One, + Two, +} + +impl FileNumber { + fn as_str(self) -> &'static str { + match self { + Self::One => "1", + Self::Two => "2", + } + } +} + +struct OrderChecker { + last_line: Vec, + file_num: FileNumber, + check_order: bool, + has_error: bool, +} + +impl OrderChecker { + fn new(file_num: FileNumber, check_order: bool) -> Self { + Self { last_line: Vec::new(), file_num, check_order, has_error: false } + } + + fn verify_order(&mut self, line: &[u8], stderr: &mut impl Write) -> bool { + if self.last_line.is_empty() { + self.last_line = line.to_vec(); + return true; + } + let ordered = line >= self.last_line.as_slice(); + if !ordered && !self.has_error { + let _ = writeln!(stderr, "comm: file {} is not in sorted order", self.file_num.as_str()); + self.has_error = true; + } + self.last_line.clear(); + self.last_line.extend_from_slice(line); + ordered || !self.check_order + } +} + +struct LineReader<'a> { + line_ending: u8, + input: Box, +} + +impl<'a> LineReader<'a> { + fn new(input: Box, line_ending: LineEnding) -> Self { + Self { input, line_ending: line_ending.into() } + } + + fn read_line(&mut self, buf: &mut Vec) -> io::Result { + let result = self.input.read_until(self.line_ending, buf)?; + if result != 0 && !buf.ends_with(&[self.line_ending]) { + buf.push(self.line_ending); + } + Ok(result) + } +} + +fn files_identical(path1: &Path, path2: &Path) -> io::Result { + let m1 = fs::metadata(path1)?; + let m2 = fs::metadata(path2)?; + if !m1.is_file() || !m2.is_file() || m1.len() != m2.len() { + return Ok(false); + } + let mut a = BufReader::new(File::open(path1)?); + let mut b = BufReader::new(File::open(path2)?); + let mut ba = [0; 8192]; + let mut bb = [0; 8192]; + loop { + let na = loop { + match a.read(&mut ba) { + Err(e) if e.kind() == io::ErrorKind::Interrupted => {}, + r => break r?, + } + }; + let nb = loop { + match b.read(&mut bb) { + Err(e) if e.kind() == io::ErrorKind::Interrupted => {}, + r => break r?, + } + }; + if na != nb || ba[..na] != bb[..nb] { + return Ok(false); + } + if na == 0 { + return Ok(true); + } + } +} + +fn write_delimited(writer: &mut impl Write, delim: &[u8], line: &[u8]) -> io::Result<()> { + writer.write_all(delim)?; + writer.write_all(line) +} + +fn read_context(reader: &mut LineReader<'_>, buf: &mut Vec, name: &OsStr) -> Result { + reader.read_line(buf).map_err(|e| format!("{}: {e}", name.maybe_quote())) +} + +fn compare( + a: &mut LineReader<'_>, + b: &mut LineReader<'_>, + name1: &OsStr, + name2: &OsStr, + delim: &str, + opts: &ArgMatches, + identical: bool, + stdout: &mut impl Write, + stderr: &mut impl Write, +) -> Result { + let col2 = delim.repeat(usize::from(!opts.get_flag(options::COLUMN_1))); + let col3 = delim.repeat( + usize::from(!opts.get_flag(options::COLUMN_1)) + + usize::from(!opts.get_flag(options::COLUMN_2)), + ); + let mut writer = BufWriter::new(stdout); + let (mut ra, mut rb) = (Vec::new(), Vec::new()); + let mut na = read_context(a, &mut ra, name1)?; + let mut nb = read_context(b, &mut rb, name2)?; + let (mut n1, mut n2, mut n3) = (0usize, 0usize, 0usize); + let explicit = opts.get_flag(options::CHECK_ORDER); + let should_check = !opts.get_flag(options::NO_CHECK_ORDER) && (explicit || !identical); + let (mut c1, mut c2) = ( + OrderChecker::new(FileNumber::One, explicit), + OrderChecker::new(FileNumber::Two, explicit), + ); + let mut delayed_error = false; + while na != 0 || nb != 0 { + let ord = match (na, nb) { + (0, _) => Ordering::Greater, + (_, 0) => Ordering::Less, + _ => ra.cmp(&rb), + }; + match ord { + Ordering::Less => { + if should_check && !c1.verify_order(&ra, stderr) { + break; + } + if !opts.get_flag(options::COLUMN_1) { + writer.write_all(&ra).map_err(|e| format!("write error: {e}"))?; + } + ra.clear(); + na = read_context(a, &mut ra, name1)?; + n1 += 1; + }, + Ordering::Greater => { + if should_check && !c2.verify_order(&rb, stderr) { + break; + } + if !opts.get_flag(options::COLUMN_2) { + write_delimited(&mut writer, col2.as_bytes(), &rb) + .map_err(|e| format!("write error: {e}"))?; + } + rb.clear(); + nb = read_context(b, &mut rb, name2)?; + n2 += 1; + }, + Ordering::Equal => { + if should_check + && (!c1.verify_order(&ra, stderr) || !c2.verify_order(&rb, stderr)) + { + break; + } + if !opts.get_flag(options::COLUMN_3) { + write_delimited(&mut writer, col3.as_bytes(), &ra) + .map_err(|e| format!("write error: {e}"))?; + } + ra.clear(); + rb.clear(); + na = read_context(a, &mut ra, name1)?; + nb = read_context(b, &mut rb, name2)?; + n3 += 1; + }, + } + if (c1.has_error || c2.has_error) && !explicit { + delayed_error = true; + } + } + if opts.get_flag(options::TOTAL) { + let ending = LineEnding::from_zero_flag(opts.get_flag(options::ZERO_TERMINATED)); + write!(writer, "{n1}{delim}{n2}{delim}{n3}{delim}total{ending}") + .map_err(|e| format!("write error: {e}"))?; + } + writer.flush().map_err(|e| format!("write error: {e}"))?; + if should_check && (c1.has_error || c2.has_error) { + if delayed_error { + let _ = writeln!(stderr, "comm: input is not in sorted order"); + } + Ok(false) + } else { + Ok(true) + } +} + +fn open_file<'a>( + name: &OsStr, + resolved: &Path, + stdin: Option<&'a mut dyn Read>, + ending: LineEnding, +) -> io::Result> { + if name == "-" { + return Ok(LineReader::new(Box::new(BufReader::new(stdin.expect("stdin operand"))), ending)); + } + if fs::metadata(resolved)?.is_dir() { + return Err(io::Error::other("is a directory")); + } + Ok(LineReader::new(Box::new(BufReader::new(File::open(resolved)?)), ending)) +} + +/// Parsed `comm` invocation. +pub(crate) struct Comm { + matches: ArgMatches, +} + +matches_parser!(Comm, app); + +impl Utility for Comm { + const NAME: &'static str = "comm"; + + fn run(self, host: &mut Host) -> i32 { + let name1 = self.matches.get_one::(options::FILE_1).unwrap(); + let name2 = self.matches.get_one::(options::FILE_2).unwrap(); + if name1 == "-" && name2 == "-" { + host.error("standard input is specified twice", 1); + return 1; + } + let path1 = host.resolve(name1); + let path2 = host.resolve(name2); + let delimiters: Vec<_> = self + .matches + .get_many::(options::DELIMITER) + .unwrap() + .collect(); + if delimiters[1..].iter().any(|d| *d != delimiters[0]) { + host.error("multiple conflicting output delimiters specified", 1); + return 1; + } + let delim = if delimiters[0].is_empty() { "\0" } else { delimiters[0] }; + let identical = if name1 == "-" || name2 == "-" { + false + } else { + files_identical(&path1, &path2).unwrap_or(false) + }; + let ending = LineEnding::from_zero_flag(self.matches.get_flag(options::ZERO_TERMINATED)); + let opened: Result<_, (&OsStr, io::Error)> = if name1 == "-" { + open_file(name2, &path2, None, ending) + .map_err(|e| (name2.as_os_str(), e)) + .and_then(|f2| { + open_file(name1, &path1, Some(&mut host.stdin), ending) + .map(|f1| (f1, f2)) + .map_err(|e| (name1.as_os_str(), e)) + }) + } else if name2 == "-" { + open_file(name1, &path1, None, ending) + .map_err(|e| (name1.as_os_str(), e)) + .and_then(|f1| { + open_file(name2, &path2, Some(&mut host.stdin), ending) + .map(|f2| (f1, f2)) + .map_err(|e| (name2.as_os_str(), e)) + }) + } else { + open_file(name1, &path1, None, ending) + .map_err(|e| (name1.as_os_str(), e)) + .and_then(|f1| { + open_file(name2, &path2, None, ending) + .map(|f2| (f1, f2)) + .map_err(|e| (name2.as_os_str(), e)) + }) + }; + let (mut f1, mut f2) = match opened { + Ok(files) => files, + Err((name, e)) => { + let _ = writeln!(host.stderr, "comm: {}: {e}", name.maybe_quote()); + return 1; + }, + }; + match compare( + &mut f1, + &mut f2, + name1, + name2, + delim, + &self.matches, + identical, + &mut host.stdout, + &mut host.stderr, + ) { + Ok(true) => 0, + Ok(false) => 1, + Err(e) => { + let _ = writeln!(host.stderr, "comm: {e}"); + 1 + }, + } + } +} + +fn app() -> Command { + Command::new(Comm::NAME) + .version("0.8.0") + .about("Compare sorted files FILE1 and FILE2 line by line.") + .override_usage(format_usage("comm [OPTION]... FILE1 FILE2")) + .infer_long_args(true) + .args_override_self(true) + .arg(Arg::new(options::COLUMN_1).short('1').help("suppress column 1 (lines unique to FILE1)").action(ArgAction::SetTrue)) + .arg(Arg::new(options::COLUMN_2).short('2').help("suppress column 2 (lines unique to FILE2)").action(ArgAction::SetTrue)) + .arg(Arg::new(options::COLUMN_3).short('3').help("suppress column 3 (lines that appear in both files)").action(ArgAction::SetTrue)) + .arg(Arg::new(options::DELIMITER).long(options::DELIMITER).help("separate columns with STR").value_name("STR").default_value("\t").allow_hyphen_values(true).action(ArgAction::Append).hide_default_value(true)) + .arg(Arg::new(options::ZERO_TERMINATED).long(options::ZERO_TERMINATED).short('z').overrides_with(options::ZERO_TERMINATED).help("line delimiter is NUL, not newline").action(ArgAction::SetTrue)) + .arg(Arg::new(options::FILE_1).required(true).value_hint(clap::ValueHint::FilePath).value_parser(clap::value_parser!(OsString))) + .arg(Arg::new(options::FILE_2).required(true).value_hint(clap::ValueHint::FilePath).value_parser(clap::value_parser!(OsString))) + .arg(Arg::new(options::TOTAL).long(options::TOTAL).help("output a summary").action(ArgAction::SetTrue)) + .arg(Arg::new(options::CHECK_ORDER).long(options::CHECK_ORDER).help("check that input is correctly sorted, even if all input lines are pairable").action(ArgAction::SetTrue)) + .arg(Arg::new(options::NO_CHECK_ORDER).long(options::NO_CHECK_ORDER).help("do not check that input is correctly sorted").action(ArgAction::SetTrue).conflicts_with(options::CHECK_ORDER)) +} + +/// Creates the `comm` builtin registration. +pub(crate) fn comm_builtin() -> Registration { + util::() +} + +#[cfg(test)] +mod tests { + use std::fs; + + use super::Comm; + use crate::host::run_util; + + #[test] + fn compares_three_columns_and_resolves_relative_paths() { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("a"), "a\nb\nd\n").unwrap(); + fs::write(dir.path().join("b"), "b\nc\nd\n").unwrap(); + let (code, capture) = run_util::(&["a", "b"], "", dir.path()); + assert_eq!(code, 0); + assert_eq!(capture.out(), "a\n\t\tb\n\tc\n\t\td\n"); + } + + #[test] + fn accepts_one_stdin_operand_and_column_suppression() { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("b"), "b\nc\n").unwrap(); + let (code, capture) = run_util::(&["-1", "-", "b"], "a\nb\n", dir.path()); + assert_eq!(code, 0); + assert_eq!(capture.out(), "\tb\nc\n"); + } + + #[test] + fn rejects_stdin_twice() { + let (code, capture) = run_util::(&["-", "-"], "", "/"); + assert_eq!(code, 1); + assert_eq!(capture.err(), "comm: standard input is specified twice\n"); + } + + #[test] + fn supports_delimiter_total_and_zero_termination() { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("a"), b"a\0b\0").unwrap(); + fs::write(dir.path().join("b"), b"b\0c\0").unwrap(); + let (code, capture) = run_util::( + &["-z", "--output-delimiter=|", "--total", "a", "b"], + "", + dir.path(), + ); + assert_eq!(code, 0); + assert_eq!(capture.stdout(), b"a\0||b\0|c\01|1|1|total\0"); + } + + #[test] + fn check_order_reports_unsorted_input() { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("a"), "b\na\n").unwrap(); + fs::write(dir.path().join("b"), "b\na\n").unwrap(); + let (code, capture) = run_util::(&["--check-order", "a", "b"], "", dir.path()); + assert_eq!(code, 1); + assert!(capture.err().contains("file 1 is not in sorted order")); + } + + #[test] + fn nocheck_order_accepts_unsorted_input() { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("a"), "b\na\n").unwrap(); + fs::write(dir.path().join("b"), "b\na\n").unwrap(); + let (code, _) = run_util::(&["--nocheck-order", "a", "b"], "", dir.path()); + assert_eq!(code, 0); + } +} diff --git a/crates/vendor/brush-builtins/src/command.rs b/crates/pi-builtins/src/command.rs similarity index 100% rename from crates/vendor/brush-builtins/src/command.rs rename to crates/pi-builtins/src/command.rs diff --git a/crates/vendor/brush-builtins/src/complete.rs b/crates/pi-builtins/src/complete.rs similarity index 100% rename from crates/vendor/brush-builtins/src/complete.rs rename to crates/pi-builtins/src/complete.rs diff --git a/crates/vendor/brush-builtins/src/continue_.rs b/crates/pi-builtins/src/continue_.rs similarity index 100% rename from crates/vendor/brush-builtins/src/continue_.rs rename to crates/pi-builtins/src/continue_.rs diff --git a/crates/vendor/uu-cut/src/cut.rs b/crates/pi-builtins/src/cut.rs similarity index 53% rename from crates/vendor/uu-cut/src/cut.rs rename to crates/pi-builtins/src/cut.rs index 85b090b5a..d33eadbea 100644 --- a/crates/vendor/uu-cut/src/cut.rs +++ b/crates/pi-builtins/src/cut.rs @@ -1,33 +1,330 @@ -// This file is part of the uutils coreutils package. -// -// For the full copyright and license information, please view the LICENSE -// file that was distributed with this source code. - -// spell-checker:ignore (ToDO) delim sourcefiles undelimited +//! `cut` builtin: print selected byte, character, or field columns. +//! +//! Ported from uutils coreutils 0.8.0. use std::{ ffi::OsString, fs::File, - io::{BufRead, BufReader, BufWriter, Read, Write}, - path::Path, + io::{self, BufRead, BufReader, BufWriter, Read, Write}, }; use bstr::io::BufReadExt; +use brush_core::{ShellExtensions, builtins::Registration}; use clap::{Arg, ArgAction, ArgMatches, Command, builder::ValueParser}; +use uucore::{display::Quotable, line_ending::LineEnding, ranges::Range}; + +use crate::host::{Host, Utility, format_usage, matches_parser, os_bytes, util}; + +/// Parsed `cut` invocation. +pub(crate) struct Cut { + matches: ArgMatches, +} + +matches_parser!(Cut, app); + +impl Utility for Cut { + const NAME: &'static str = "cut"; + + fn rewrite_argv(argv: Vec) -> Result, String> { + // GNU cut accepts `-d=` as a delimiter spelling. Clap otherwise parses it + // as an empty value assigned to `-d`. + Ok(argv + .into_iter() + .map(|arg| if arg == "-d=" { OsString::from("--delimiter==") } else { arg }) + .collect()) + } + + fn run(self, host: &mut Host) -> i32 { + if let Err(error) = cut_main(&self.matches, host) { + host.error(error, 1); + return 1; + } + host.exit_code() + } +} + +mod matcher { +use memchr::{memchr, memchr2}; + +// Find the next matching byte sequence positions +// Return (first, last) where haystack[first..last] corresponds to the matched +// pattern +pub trait Matcher { + fn next_match(&self, haystack: &[u8]) -> Option<(usize, usize)>; +} + +// Matches for the exact byte sequence pattern +pub struct ExactMatcher<'a> { + needle: &'a [u8], +} + +impl<'a> ExactMatcher<'a> { + pub fn new(needle: &'a [u8]) -> Self { + assert!(!needle.is_empty()); + Self { needle } + } +} + +impl Matcher for ExactMatcher<'_> { + fn next_match(&self, haystack: &[u8]) -> Option<(usize, usize)> { + let mut pos = 0usize; + loop { + let match_idx = memchr(self.needle[0], &haystack[pos..])?; + let match_idx = match_idx + pos; // account for starting from pos + + if self.needle.len() == 1 || haystack[match_idx + 1..].starts_with(&self.needle[1..]) { + return Some((match_idx, match_idx + self.needle.len())); + } + + pos = match_idx + 1; + } + } +} + +// Matches for any number of SPACE or TAB +pub struct WhitespaceMatcher {} + +impl Matcher for WhitespaceMatcher { + fn next_match(&self, haystack: &[u8]) -> Option<(usize, usize)> { + let match_idx = memchr2(b' ', b'\t', haystack)?; + let mut skip = match_idx + 1; + + while skip < haystack.len() { + match haystack[skip] { + b' ' | b'\t' => skip += 1, + _ => break, + } + } + + Some((match_idx, skip)) + } +} + +#[cfg(test)] +mod matcher_tests { + + use super::*; + + #[test] + fn test_exact_matcher_single_byte() { + let matcher = ExactMatcher::new(":".as_bytes()); + assert_eq!(matcher.next_match("".as_bytes()), None); + assert_eq!(matcher.next_match(":".as_bytes()), Some((0, 1))); + assert_eq!(matcher.next_match(":abcxyz".as_bytes()), Some((0, 1))); + assert_eq!(matcher.next_match("abc:xyz".as_bytes()), Some((3, 4))); + assert_eq!(matcher.next_match("abcxyz:".as_bytes()), Some((6, 7))); + assert_eq!(matcher.next_match("abcxyz".as_bytes()), None); + } + + #[test] + fn test_exact_matcher_multi_bytes() { + let matcher = ExactMatcher::new("<>".as_bytes()); + assert_eq!(matcher.next_match("".as_bytes()), None); + assert_eq!(matcher.next_match("<>".as_bytes()), Some((0, 2))); + assert_eq!(matcher.next_match("<>abcxyz".as_bytes()), Some((0, 2))); + assert_eq!(matcher.next_match("abc<>xyz".as_bytes()), Some((3, 5))); + assert_eq!(matcher.next_match("abcxyz<>".as_bytes()), Some((6, 8))); + assert_eq!(matcher.next_match("abcxyz".as_bytes()), None); + } + + #[test] + fn test_whitespace_matcher_single_space() { + let matcher = WhitespaceMatcher {}; + assert_eq!(matcher.next_match("".as_bytes()), None); + assert_eq!(matcher.next_match(" ".as_bytes()), Some((0, 1))); + assert_eq!(matcher.next_match("\tabcxyz".as_bytes()), Some((0, 1))); + assert_eq!(matcher.next_match("abc\txyz".as_bytes()), Some((3, 4))); + assert_eq!(matcher.next_match("abcxyz ".as_bytes()), Some((6, 7))); + assert_eq!(matcher.next_match("abcxyz".as_bytes()), None); + } + + #[test] + fn test_whitespace_matcher_multi_spaces() { + let matcher = WhitespaceMatcher {}; + assert_eq!(matcher.next_match("".as_bytes()), None); + assert_eq!(matcher.next_match(" \t ".as_bytes()), Some((0, 3))); + assert_eq!(matcher.next_match("\t\tabcxyz".as_bytes()), Some((0, 2))); + assert_eq!(matcher.next_match("abc \txyz".as_bytes()), Some((3, 5))); + assert_eq!(matcher.next_match("abcxyz ".as_bytes()), Some((6, 8))); + assert_eq!(matcher.next_match("abcxyz".as_bytes()), None); + } +} +} + +mod searcher { +use super::matcher::Matcher; + +// Generic searcher that relies on a specific matcher +pub struct Searcher<'a, 'b, M: Matcher> { + matcher: &'a M, + haystack: &'b [u8], + position: usize, +} + +impl<'a, 'b, M: Matcher> Searcher<'a, 'b, M> { + pub fn new(matcher: &'a M, haystack: &'b [u8]) -> Self { + Self { matcher, haystack, position: 0 } + } +} + +// Iterate over field delimiters +// Returns (first, last) positions of each sequence, where +// `haystack[first..last]` corresponds to the delimiter. +impl Iterator for Searcher<'_, '_, M> { + type Item = (usize, usize); + + fn next(&mut self) -> Option { + let (first, last) = self.matcher.next_match(&self.haystack[self.position..])?; + let result = (first + self.position, last + self.position); + self.position += last; + + Some(result) + } +} + +#[cfg(test)] +mod exact_searcher_tests { + + use super::{super::matcher::ExactMatcher, *}; + + #[test] + fn test_normal() { + let matcher = ExactMatcher::new("a".as_bytes()); + let iter = Searcher::new(&matcher, "a.a.a".as_bytes()); + let items: Vec<(usize, usize)> = iter.collect(); + assert_eq!(vec![(0, 1), (2, 3), (4, 5)], items); + } + + #[test] + fn test_empty() { + let matcher = ExactMatcher::new("a".as_bytes()); + let iter = Searcher::new(&matcher, "".as_bytes()); + let items: Vec<(usize, usize)> = iter.collect(); + assert!(items.is_empty()); + } + + fn test_multibyte(line: &[u8], expected: &[(usize, usize)]) { + let matcher = ExactMatcher::new("ab".as_bytes()); + let iter = Searcher::new(&matcher, line); + let items: Vec<(usize, usize)> = iter.collect(); + assert_eq!(expected, items); + } + + #[test] + fn test_multibyte_normal() { + test_multibyte("...ab...ab...".as_bytes(), &[(3, 5), (8, 10)]); + } + + #[test] + fn test_multibyte_needle_head_at_end() { + test_multibyte("a".as_bytes(), &[]); + } + + #[test] + fn test_multibyte_starting_needle() { + test_multibyte("ab...ab...".as_bytes(), &[(0, 2), (5, 7)]); + } + + #[test] + fn test_multibyte_trailing_needle() { + test_multibyte("...ab...ab".as_bytes(), &[(3, 5), (8, 10)]); + } + + #[test] + fn test_multibyte_first_byte_false_match() { + test_multibyte("aA..aCaC..ab..aD".as_bytes(), &[(10, 12)]); + } + + #[test] + fn test_searcher_with_exact_matcher() { + let matcher = ExactMatcher::new("<>".as_bytes()); + let haystack = "<><>a<>b<><>cd<><>".as_bytes(); + let mut searcher = Searcher::new(&matcher, haystack); + assert_eq!(searcher.next(), Some((0, 2))); + assert_eq!(searcher.next(), Some((2, 4))); + assert_eq!(searcher.next(), Some((5, 7))); + assert_eq!(searcher.next(), Some((8, 10))); + assert_eq!(searcher.next(), Some((10, 12))); + assert_eq!(searcher.next(), Some((14, 16))); + assert_eq!(searcher.next(), Some((16, 18))); + assert_eq!(searcher.next(), None); + assert_eq!(searcher.next(), None); + } +} + +#[cfg(test)] +mod whitespace_searcher_tests { + + use super::{super::matcher::WhitespaceMatcher, *}; + + #[test] + fn test_space() { + let matcher = WhitespaceMatcher {}; + let iter = Searcher::new(&matcher, " . . ".as_bytes()); + let items: Vec<(usize, usize)> = iter.collect(); + assert_eq!(vec![(0, 1), (2, 3), (4, 5)], items); + } + + #[test] + fn test_tab() { + let matcher = WhitespaceMatcher {}; + let iter = Searcher::new(&matcher, "\t.\t.\t".as_bytes()); + let items: Vec<(usize, usize)> = iter.collect(); + assert_eq!(vec![(0, 1), (2, 3), (4, 5)], items); + } + + #[test] + fn test_empty() { + let matcher = WhitespaceMatcher {}; + let iter = Searcher::new(&matcher, "".as_bytes()); + let items: Vec<(usize, usize)> = iter.collect(); + assert!(items.is_empty()); + } + + fn test_multispace(line: &[u8], expected: &[(usize, usize)]) { + let matcher = WhitespaceMatcher {}; + let iter = Searcher::new(&matcher, line); + let items: Vec<(usize, usize)> = iter.collect(); + assert_eq!(expected, items); + } + + #[test] + fn test_multispace_normal() { + test_multispace("... ... \t...\t ... \t ...".as_bytes(), &[ + (3, 5), + (8, 10), + (13, 15), + (18, 21), + ]); + } + + #[test] + fn test_multispace_begin() { + test_multispace(" \t\t...".as_bytes(), &[(0, 3)]); + } + + #[test] + fn test_multispace_end() { + test_multispace("...\t ".as_bytes(), &[(3, 6)]); + } + + #[test] + fn test_searcher_with_whitespace_matcher() { + let matcher = WhitespaceMatcher {}; + let haystack = "\t a b \t cd\t\t".as_bytes(); + let mut searcher = Searcher::new(&matcher, haystack); + assert_eq!(searcher.next(), Some((0, 2))); + assert_eq!(searcher.next(), Some((3, 4))); + assert_eq!(searcher.next(), Some((5, 8))); + assert_eq!(searcher.next(), Some((10, 12))); + assert_eq!(searcher.next(), None); + assert_eq!(searcher.next(), None); + } +} +} + use matcher::{ExactMatcher, Matcher, WhitespaceMatcher}; -use pi_uutils_ctx::format_usage; -use uucore::{ - display::Quotable, - error::{FromIo, UResult, USimpleError}, - line_ending::LineEnding, - os_str_as_bytes, - ranges::Range, -}; - -use self::searcher::Searcher; - -mod matcher; -mod searcher; +use searcher::Searcher; struct Options<'a> { out_delimiter: Option<&'a [u8]>, @@ -57,12 +354,6 @@ impl Default for Delimiter<'_> { } } -impl<'a> From<&'a OsString> for Delimiter<'a> { - fn from(s: &'a OsString) -> Self { - Self::Slice(os_str_as_bytes(s).unwrap()) - } -} - fn list_to_ranges(list: &str, complement: bool) -> Result, String> { if complement { Range::from_list(list).map(|r| uucore::ranges::complement(&r)) @@ -76,7 +367,7 @@ fn cut_bytes( out: &mut W, ranges: &[Range], opts: &Options, -) -> UResult<()> { +) -> io::Result<()> { let newline_char = opts.line_ending.into(); let mut buf_in = BufReader::new(reader); let out_delim = opts.out_delimiter.unwrap_or(b"\t"); @@ -101,11 +392,7 @@ fn cut_bytes( Ok(true) }); - if let Err(e) = result { - return Err(USimpleError::new(1, e.to_string())); - } - - Ok(()) + result.map(|_| ()) } /// Output delimiter is explicitly specified @@ -117,7 +404,7 @@ fn cut_fields_explicit_out_delim( only_delimited: bool, newline_char: u8, out_delim: &[u8], -) -> UResult<()> { +) -> io::Result<()> { let mut buf_in = BufReader::new(reader); let result = buf_in.for_byte_record_with_terminator(newline_char, |line| { @@ -183,11 +470,7 @@ fn cut_fields_explicit_out_delim( Ok(true) }); - if let Err(e) = result { - return Err(USimpleError::new(1, e.to_string())); - } - - Ok(()) + result.map(|_| ()) } /// Output delimiter is the same as input delimiter @@ -198,7 +481,7 @@ fn cut_fields_implicit_out_delim( ranges: &[Range], only_delimited: bool, newline_char: u8, -) -> UResult<()> { +) -> io::Result<()> { let mut buf_in = BufReader::new(reader); let result = buf_in.for_byte_record_with_terminator(newline_char, |line| { @@ -251,11 +534,7 @@ fn cut_fields_implicit_out_delim( Ok(true) }); - if let Err(e) = result { - return Err(USimpleError::new(1, e.to_string())); - } - - Ok(()) + result.map(|_| ()) } /// Streams and filters fields where the record terminator and @@ -267,7 +546,7 @@ fn cut_fields_newline_char_delim( newline_char: u8, out_delim: &[u8], only_delimited: bool, -) -> UResult<()> { +) -> io::Result<()> { let mut reader = BufReader::new(reader); let mut line = Vec::new(); @@ -393,7 +672,7 @@ fn cut_fields( out: &mut W, ranges: &[Range], opts: &Options, -) -> UResult<()> { +) -> io::Result<()> { let newline_char = opts.line_ending.into(); let field_opts = opts.field_opts.as_ref().unwrap(); // it is safe to unwrap() here - field_opts will always be Some() for cut_fields() call match field_opts.delimiter { @@ -445,102 +724,96 @@ fn cut_fields( } } -// pi-uutils: route standard streams through the invocation context, and -// resolve each relative operand only when opening it while retaining the -// original operand for diagnostics. -fn cut_files<'a, I>(filenames: I, mode: &Mode) +fn cut_files<'a, I>(host: &mut Host, filenames: I, mode: &Mode) where I: IntoIterator, { + let inputs = filenames + .into_iter() + .map(|name| { + let path = if name == "-" { None } else { Some(host.resolve(name)) }; + (name, path) + }) + .collect::>(); let mut stdin_read = false; - let mut out = BufWriter::new(pi_uutils_ctx::stdout()); + let mut failed = false; + let mut out = BufWriter::new(&mut host.stdout); - for filename in filenames { - if filename == "-" { - if stdin_read { - continue; - } - let result = match mode { - Mode::Bytes(ranges, opts) | Mode::Characters(ranges, opts) => { - cut_bytes(pi_uutils_ctx::stdin(), &mut out, ranges, opts) - }, - Mode::Fields(ranges, opts) => { - cut_fields(pi_uutils_ctx::stdin(), &mut out, ranges, opts) - }, - }; - if let Err(err) = result { - let _ = writeln!(pi_uutils_ctx::stderr(), "cut: {err}"); - pi_uutils_ctx::set_exit_code(1); - } - stdin_read = true; - } else { - let result = File::open(pi_uutils_ctx::resolve(Path::new(filename))) - .map_err_context(|| filename.maybe_quote().to_string()) + for (filename, path) in inputs { + let result = if let Some(path) = path { + File::open(path) + .map_err(|error| io::Error::new(error.kind(), format!("{}: {error}", filename.maybe_quote()))) .and_then(|file| match mode { Mode::Bytes(ranges, opts) | Mode::Characters(ranges, opts) => { cut_bytes(file, &mut out, ranges, opts) }, Mode::Fields(ranges, opts) => cut_fields(file, &mut out, ranges, opts), - }); - if let Err(err) = result { - let _ = writeln!(pi_uutils_ctx::stderr(), "cut: {err}"); - pi_uutils_ctx::set_exit_code(1); + }) + } else if stdin_read { + continue; + } else { + stdin_read = true; + match mode { + Mode::Bytes(ranges, opts) | Mode::Characters(ranges, opts) => { + cut_bytes(&mut host.stdin, &mut out, ranges, opts) + }, + Mode::Fields(ranges, opts) => cut_fields(&mut host.stdin, &mut out, ranges, opts), } + }; + if let Err(error) = result { + let _ = writeln!(host.stderr, "cut: {error}"); + failed = true; } } - if let Err(err) = out.flush().map_err_context(|| "write error".to_string()) { - let _ = writeln!(pi_uutils_ctx::stderr(), "cut: {err}"); - pi_uutils_ctx::set_exit_code(1); + if let Err(error) = out.flush() { + let _ = writeln!(host.stderr, "cut: write error: {error}"); + failed = true; + } + drop(out); + if failed { + host.fail(1); } } -/// Get delimiter and output delimiter from `-d`/`--delimiter` and -/// `--output-delimiter` options respectively Allow either delimiter to have a -/// value that is neither UTF-8 nor ASCII to align with GNU behavior -fn get_delimiters(matches: &ArgMatches) -> UResult<(Delimiter<'_>, Option<&[u8]>)> { +/// Gets input and output delimiters, accepting non-UTF-8 bytes like GNU `cut`. +fn get_delimiters(matches: &ArgMatches) -> Result<(Delimiter<'_>, Option<&[u8]>), String> { let whitespace_delimited = matches.get_flag(options::WHITESPACE_DELIMITED); let delim_opt = matches.get_one::(options::DELIMITER); let delim = match delim_opt { Some(_) if whitespace_delimited => { - return Err(USimpleError::new( - 1, - "invalid input: Only one of --delimiter (-d) or -w option can be specified", - )); + return Err( + "invalid input: Only one of --delimiter (-d) or -w option can be specified".into(), + ); }, Some(os_string) => { if os_string.is_empty() { Delimiter::Slice(b"\0") } else { - // For delimiter `-d` option value - allow both UTF-8 (possibly multi-byte) - // characters and Non UTF-8 (and not ASCII) single byte "characters", like - // `b"\xAD"` to align with GNU behavior - let bytes = os_str_as_bytes(os_string)?; + let bytes = os_bytes(os_string) + .ok_or_else(|| format!("invalid argument {}", os_string.maybe_quote()))?; if os_string.to_str().is_some_and(|s| s.chars().count() > 1) || os_string.to_str().is_none() && bytes.len() > 1 { - return Err(USimpleError::new(1, "the delimiter must be a single character")); + return Err("the delimiter must be a single character".into()); } - Delimiter::from(os_string) - } - }, - None => { - if whitespace_delimited { - Delimiter::Whitespace - } else { - Delimiter::default() + Delimiter::Slice(bytes) } }, + None if whitespace_delimited => Delimiter::Whitespace, + None => Delimiter::default(), }; let out_delim = matches .get_one::(options::OUTPUT_DELIMITER) - .map(|os_string| { - if os_string.is_empty() { - b"\0" + .map(|value| { + if value.is_empty() { + Ok(&b"\0"[..]) } else { - os_str_as_bytes(os_string).unwrap() + os_bytes(value) + .ok_or_else(|| format!("invalid argument {}", value.maybe_quote())) } - }); + }) + .transpose()?; Ok((delim, out_delim)) } @@ -559,56 +832,14 @@ mod options { pub const NOTHING: &str = "nothing"; } -// pi-uutils: replace the terminating uucore entry macro and localization-aware -// clap handler with an in-process entry point and literal English messages. -/// Run `cut` against the streams and working directory installed by -/// `pi-uutils-ctx`. -pub fn run(argv: Vec) -> i32 { - // GNU cut accepts `-d=` as a delimiter spelling. Clap otherwise parses it - // as an empty value assigned to `-d`. - let argv = argv - .into_iter() - .map(|arg| { - if arg == "-d=" { - OsString::from("--delimiter==") - } else { - arg - } - }) - .collect::>(); - let matches = match uu_app().try_get_matches_from(argv) { - Ok(matches) => matches, - Err(err) => { - let rendered = err.to_string(); - if err.use_stderr() { - let _ = write!(pi_uutils_ctx::stderr(), "{rendered}"); - return 1; - } - let _ = write!(pi_uutils_ctx::stdout(), "{rendered}"); - return 0; - }, - }; - - match cut_main(&matches) { - Ok(()) => pi_uutils_ctx::exit_code(), - Err(err) => { - let code = err.code(); - let _ = writeln!(pi_uutils_ctx::stderr(), "cut: {err}"); - if code == 0 { 1 } else { code } - }, - } -} - -fn cut_main(matches: &ArgMatches) -> UResult<()> { +fn cut_main(matches: &ArgMatches, host: &mut Host) -> Result<(), String> { let complement = matches.get_flag(options::COMPLEMENT); let only_delimited = matches.get_flag(options::ONLY_DELIMITED); - let (delimiter, out_delimiter) = get_delimiters(matches)?; let line_ending = LineEnding::from_zero_flag(matches.get_flag(options::ZERO_TERMINATED)); // Only one, and only one of cutting mode arguments, i.e. `-b`, `-c`, `-f`, - // is expected. The number of those arguments is used for parsing a cutting - // mode and handling the error cases. + // is expected. Count occurrences because repeated modes are an error. let mode_args_count = [ matches.indices_of(options::BYTES), matches.indices_of(options::CHARACTERS), @@ -624,72 +855,60 @@ fn cut_main(matches: &ArgMatches) -> UResult<()> { matches.get_one::(options::CHARACTERS), matches.get_one::(options::FIELDS), ) { - (1, Some(byte_ranges), None, None) => list_to_ranges(byte_ranges, complement).map(|ranges| { + (1, Some(ranges), None, None) => list_to_ranges(ranges, complement).map(|ranges| { Mode::Bytes(ranges, Options { out_delimiter, line_ending, field_opts: None }) }), - - (1, None, Some(char_ranges), None) => list_to_ranges(char_ranges, complement).map(|ranges| { + (1, None, Some(ranges), None) => list_to_ranges(ranges, complement).map(|ranges| { Mode::Characters(ranges, Options { out_delimiter, line_ending, field_opts: None }) }), - - (1, None, None, Some(field_ranges)) => { - list_to_ranges(field_ranges, complement).map(|ranges| { - Mode::Fields(ranges, Options { - out_delimiter, - line_ending, - field_opts: Some(FieldOptions { delimiter, only_delimited }), - }) + (1, None, None, Some(ranges)) => list_to_ranges(ranges, complement).map(|ranges| { + Mode::Fields(ranges, Options { + out_delimiter, + line_ending, + field_opts: Some(FieldOptions { delimiter, only_delimited }), }) - }, - + }), (2.., ..) => Err( "invalid usage: expects no more than one of --fields (-f), --chars (-c) or --bytes (-b)" .to_owned(), ), - _ => { - Err("invalid usage: expects one of --fields (-f), --chars (-c) or --bytes (-b)".to_owned()) - }, + _ => Err( + "invalid usage: expects one of --fields (-f), --chars (-c) or --bytes (-b)".to_owned(), + ), }; - let mode_parse = match mode_parse { - Err(_) => mode_parse, - Ok(mode) => match mode { - Mode::Bytes(..) | Mode::Characters(..) if matches.contains_id(options::DELIMITER) => Err( - "invalid input: The '--delimiter' ('-d') option can only be used when printing a \ - sequence of fields" - .to_owned(), - ), - Mode::Bytes(..) | Mode::Characters(..) - if matches.get_flag(options::WHITESPACE_DELIMITED) => - { - Err( - "invalid input: The '-w' option can only be used when printing a sequence of fields" - .to_owned(), - ) - }, - Mode::Bytes(..) | Mode::Characters(..) if matches.get_flag(options::ONLY_DELIMITED) => { - Err( - "invalid input: The '--only-delimited' ('-s') option can only be used when \ - printing a sequence of fields" - .to_owned(), - ) - }, - _ => Ok(mode), + let mode = match mode_parse? { + Mode::Bytes(..) | Mode::Characters(..) if matches.contains_id(options::DELIMITER) => { + return Err( + "invalid input: The '--delimiter' ('-d') option can only be used when printing a sequence of fields" + .into(), + ); }, + Mode::Bytes(..) | Mode::Characters(..) + if matches.get_flag(options::WHITESPACE_DELIMITED) => + { + return Err( + "invalid input: The '-w' option can only be used when printing a sequence of fields".into(), + ); + }, + Mode::Bytes(..) | Mode::Characters(..) if matches.get_flag(options::ONLY_DELIMITED) => { + return Err( + "invalid input: The '--only-delimited' ('-s') option can only be used when printing a sequence of fields" + .into(), + ); + }, + mode => mode, }; - - let mode = mode_parse.map_err(|e| USimpleError::new(1, e))?; - #[allow(clippy::unwrap_used, reason = "clap provides '-' by default")] - let files = matches.get_many::(options::FILE).unwrap(); - - cut_files(files, &mode); - + let files = matches + .get_many::(options::FILE) + .expect("clap provides '-' by default"); + cut_files(host, files, &mode); Ok(()) } -pub fn uu_app() -> Command { - Command::new("cut") - .version(env!("CARGO_PKG_VERSION")) +fn app() -> Command { + Command::new(Cut::NAME) + .version("0.8.0") .override_usage(format_usage("cut OPTION... [FILE]...")) .about("Print specified byte or field columns from each line of stdin or input files") .after_help( @@ -794,3 +1013,42 @@ pub fn uu_app() -> Command { .action(ArgAction::SetTrue), ) } + +/// Creates the `cut` builtin registration. +pub(crate) fn cut_builtin() -> Registration { + util::() +} + +#[cfg(test)] +mod integration_tests { + use super::Cut; + use crate::host::run_util; + + #[test] + fn reads_default_operand_from_stdin() { + let (code, capture) = run_util::(&["-f", "2", "-d", ":"], "left:right\n", "/"); + assert_eq!(code, 0); + assert_eq!(capture.out(), "right\n"); + assert_eq!(capture.err(), ""); + } + + #[test] + fn resolves_file_operands_against_shell_cwd() { + let dir = tempfile::tempdir().unwrap(); + std::fs::write(dir.path().join("input"), b"abcdef\n").unwrap(); + let (code, capture) = run_util::(&["-b", "2-4", "input"], "", dir.path()); + assert_eq!(code, 0); + assert_eq!(capture.out(), "bcd\n"); + assert_eq!(capture.err(), ""); + } + + #[test] + fn missing_mode_is_an_error() { + let (code, capture) = run_util::(&[], "", "/"); + assert_eq!(code, 1); + assert_eq!( + capture.err(), + "cut: invalid usage: expects one of --fields (-f), --chars (-c) or --bytes (-b)\n" + ); + } +} diff --git a/crates/pi-builtins/src/date.rs b/crates/pi-builtins/src/date.rs new file mode 100644 index 000000000..6dbc88684 --- /dev/null +++ b/crates/pi-builtins/src/date.rs @@ -0,0 +1,2052 @@ +//! `date` builtin: print or set the system date and time. +//! +//! Ported from uutils coreutils 0.8.0. + +use brush_core::{ShellExtensions, builtins::Registration}; + +use crate::host::{Host, Utility, format_usage, matches_parser, util}; + +mod format_modifiers { + //! GNU date format modifier support + //! + //! This module implements GNU-compatible format modifiers for date formatting. + //! These modifiers extend standard strftime format specifiers with optional + //! width and flag modifiers. + //! + //! ## Syntax + //! + //! Format: `%[flags][width]specifier` + //! + //! ### Flags + //! - `-`: Do not pad the field + //! - `_`: Pad with spaces instead of zeros + //! - `0`: Pad with zeros (default for numeric fields) + //! - `^`: Convert to uppercase + //! - `#`: Use opposite case (uppercase becomes lowercase and vice versa) + //! - `+`: Force display of sign (+ for positive, - for negative) + //! + //! ### Width + //! - One or more digits specifying minimum field width + //! - Field will be padded to this width using the padding character + //! + //! ### Examples + //! - `%10Y`: Year padded to 10 digits with zeros (0000001999) + //! - `%_10m`: Month padded to 10 digits with spaces ( 06) + //! - `%-d`: Day without padding (1 instead of 01) + //! - `%^B`: Month name in uppercase (JUNE) + //! - `%+4C`: Century with sign, padded to 4 characters (+019) + + use std::{fmt, sync::LazyLock}; + + use jiff::{ + Zoned, + fmt::strtime::{BrokenDownTime, Config, PosixCustom}, + }; + use regex::Regex; + + /// Error type for format modifier operations + #[derive(Debug)] + pub enum FormatError { + /// Error from the underlying jiff library + JiffError(jiff::Error), + /// Field width calculation overflowed or required allocation failed + FieldWidthTooLarge { width: usize, specifier: String }, + } + + impl fmt::Display for FormatError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::JiffError(e) => write!(f, "{e}"), + // pi-uutils: literalized en-US translation of + // `date-error-format-modifier-width-too-large`. + Self::FieldWidthTooLarge { width, specifier } => { + write!(f, "format modifier width '{width}' is too large for specifier '%{specifier}'") + }, + } + } + } + + impl From for FormatError { + fn from(e: jiff::Error) -> Self { + Self::JiffError(e) + } + } + + /// Regex to match format specifiers with optional modifiers + /// Pattern: % \[flags\] \[width\] specifier + /// Flags: -, _, 0, ^, #, + + /// Width: one or more digits + /// Specifier: any letter or special sequence like :z, ::z, :::z + // pi-uutils: `LazyLock` instead of upstream's function-local `OnceLock`. + static FORMAT_SPEC_REGEX: LazyLock = + LazyLock::new(|| Regex::new(r"%([_0^#+-]*)(\d*)(:*[a-zA-Z])").unwrap()); + + /// Check if format string contains any GNU modifiers and format if present. + /// + /// This function combines modifier detection and formatting in a single pass + /// for better performance. If no modifiers are found, returns None and the + /// caller should use standard formatting. If modifiers are found, returns + /// the formatted string. + pub fn format_with_modifiers_if_present( + date: &Zoned, + format_string: &str, + config: &Config, + ) -> Option> { + let re = &*FORMAT_SPEC_REGEX; + + // Quick check: does the string contain any modifiers? + let has_modifiers = re.captures_iter(format_string).any(|cap| { + let flags = cap.get(1).map_or("", |m| m.as_str()); + let width_str = cap.get(2).map_or("", |m| m.as_str()); + !flags.is_empty() || !width_str.is_empty() + }); + + if !has_modifiers { + return None; + } + + // If we have modifiers, format the string + Some(format_with_modifiers(date, format_string, config)) + } + + /// Process a format string with GNU modifiers. + /// + /// # Arguments + /// * `date` - The date to format + /// * `format_string` - Format string with GNU modifiers + /// * `config` - Strftime configuration + /// + /// # Returns + /// Formatted string with modifiers applied + /// + /// # Errors + /// Returns `FormatError` if formatting fails + fn format_with_modifiers( + date: &Zoned, + format_string: &str, + config: &Config, + ) -> Result { + // First, replace %% with a placeholder to avoid matching it + let placeholder = "\x00PERCENT\x00"; + let temp_format = format_string.replace("%%", placeholder); + + let re = &*FORMAT_SPEC_REGEX; + let mut result = String::new(); + let mut last_end = 0; + + let broken_down = BrokenDownTime::from(date); + + for cap in re.captures_iter(&temp_format) { + let whole_match = cap.get(0).unwrap(); + let flags = cap.get(1).map_or("", |m| m.as_str()); + let width_str = cap.get(2).map_or("", |m| m.as_str()); + let spec = cap.get(3).unwrap().as_str(); + + // Add text before this match + result.push_str(&temp_format[last_end..whole_match.start()]); + + // Format the base specifier first + let base_format = format!("%{spec}"); + let formatted = broken_down.to_string_with_config(config, &base_format)?; + + // Check if this specifier has modifiers + if !flags.is_empty() || !width_str.is_empty() { + // Apply modifiers to the formatted value + let width: usize = width_str.parse().unwrap_or(0); + let explicit_width = !width_str.is_empty(); + let modified = apply_modifiers(&formatted, flags, width, spec, explicit_width)?; + result.push_str(&modified); + } else { + // No modifiers, use formatted value as-is + result.push_str(&formatted); + } + + last_end = whole_match.end(); + } + + // Add remaining text + result.push_str(&temp_format[last_end..]); + + // Restore %% by converting placeholder to % + let result = result.replace(placeholder, "%"); + + Ok(result) + } + + /// Returns true if the specifier produces text output (default pad is space) + /// rather than numeric output (default pad is zero). + fn is_text_specifier(specifier: &str) -> bool { + matches!(specifier.chars().last(), Some('A' | 'a' | 'B' | 'b' | 'h' | 'Z' | 'p' | 'P')) + } + + /// Returns true if the specifier defaults to space padding. + /// This includes text specifiers and numeric specifiers like %e and %k + /// that use blank-padding by default in GNU date. + fn is_space_padded_specifier(specifier: &str) -> bool { + matches!( + specifier.chars().last(), + Some('A' | 'a' | 'B' | 'b' | 'h' | 'Z' | 'p' | 'P' | 'e' | 'k' | 'l') + ) + } + + /// Returns the default width for a specifier. + /// This is used when a flag like `_` is used without an explicit width. + fn get_default_width(specifier: &str) -> usize { + match specifier.chars().last() { + // Day of month: 2 digits (01-31) + Some('d') | Some('e') => 2, + // Month: 2 digits (01-12) + Some('m') => 2, + // Hour: 2 digits (00-23) + Some('H') | Some('k') => 2, + // Hour (12-hour): 2 digits (01-12) + Some('I') | Some('l') => 2, + // Minute: 2 digits (00-59) + Some('M') => 2, + // Second: 2 digits (00-60) + Some('S') => 2, + // Year (2-digit): 2 digits + Some('y') => 2, + // Day of year: 3 digits (001-366) + Some('j') => 3, + // Week number: 2 digits (00-53) + Some('U') | Some('W') | Some('V') => 2, + // Day of week: 1 digit (0-6 or 1-7) + Some('w') | Some('u') => 1, + // Century: 2 digits (00-99) + Some('C') => 2, + // Full year: 4 digits + Some('Y') | Some('G') => 4, + // ISO week year (2-digit): 2 digits + Some('g') => 2, + // Epoch seconds: typically 10 digits (but variable) + Some('s') => 0, + // Nanoseconds: 9 digits + Some('N') => 9, + // Quarter: 1 digit + Some('q') => 1, + // Timezone offset: varies + Some('z') => 0, + // Text specifiers have no default width + _ => 0, + } + } + + /// Strip default padding (leading zeros or leading spaces) from a value, + /// preserving at least one character. + fn strip_default_padding(value: &str) -> String { + if value.starts_with('0') && value.len() >= 2 { + let stripped = value.trim_start_matches('0'); + if stripped.is_empty() { + return "0".to_string(); + } + if let Some(first_char) = stripped.chars().next() + && first_char.is_ascii_digit() + { + return stripped.to_string(); + } + } + if value.starts_with(' ') { + let stripped = value.trim_start(); + if !stripped.is_empty() { + return stripped.to_string(); + } + } + value.to_string() + } + + /// Apply width and flag modifiers to a formatted value. + /// + /// The `specifier` parameter is the format specifier (e.g., "d", "B", "Y") + /// which determines the default padding character (space for text, zero for + /// numeric). Flags are processed in order so that when conflicting flags + /// appear, the last one takes precedence (e.g., `_+` means `+` wins for + /// padding). + /// + /// The `explicit_width` parameter indicates whether a width was explicitly + /// specified in the format string (true) or if width is 0 (false). + fn apply_modifiers( + value: &str, + flags: &str, + width: usize, + specifier: &str, + explicit_width: bool, + ) -> Result { + let mut result = value.to_string(); + + // Determine default pad character based on specifier type + // Determine default pad character based on specifier type. + // Text specifiers (month names, etc.) and numeric specifiers like %e, %k, %l + // default to space padding; other numeric specifiers default to zero padding. + let default_pad = if is_space_padded_specifier(specifier) { + ' ' + } else { + '0' + }; + + // Process flags in order - last conflicting flag wins + let mut pad_char = default_pad; + let mut no_pad = false; + let mut uppercase = false; + let mut swap_case = false; + let mut force_sign = false; + let mut underscore_flag = false; + + for flag in flags.chars() { + match flag { + '-' => { + no_pad = true; + }, + '_' => { + no_pad = false; + pad_char = ' '; + underscore_flag = true; + }, + '0' => { + no_pad = false; + pad_char = '0'; + }, + '^' => { + uppercase = true; + swap_case = false; // ^ overrides # + }, + '#' if !uppercase => { + // Only apply # if ^ hasn't been set + swap_case = true; + }, + '+' => { + force_sign = true; + no_pad = false; + pad_char = '0'; + }, + _ => {}, + } + } + + // Apply case modifications (uppercase takes precedence over swap_case) + if uppercase { + result = result.to_uppercase(); + } else if swap_case { + if result + .chars() + .all(|c| !c.is_alphabetic() || c.is_uppercase()) + { + result = result.to_lowercase(); + } else if !result + .chars() + .all(|c| !c.is_alphabetic() || c.is_lowercase()) + { + result = result.to_uppercase(); + } + } + + // If no_pad flag is active, suppress all padding and return + if no_pad { + return Ok(strip_default_padding(&result)); + } + + // Handle padding flag without explicit width: use default width + // This applies when _ or 0 flag overrides the default padding character + // and no explicit width is specified (e.g., %_m, %0e) + let effective_width = if !explicit_width && (underscore_flag || pad_char != default_pad) { + get_default_width(specifier) + } else { + width + }; + + // When the requested width is narrower than the default formatted width, GNU + // first removes default padding and then reapplies the requested width. + if effective_width > 0 && effective_width < result.len() { + result = strip_default_padding(&result); + } + + // Strip default padding when switching pad characters on numeric fields + if !is_text_specifier(specifier) && result.len() >= 2 { + if pad_char == ' ' && result.starts_with('0') { + // Switching to space padding: strip leading zeros + result = strip_default_padding(&result); + } else if pad_char == '0' && result.starts_with(' ') { + // Switching to zero padding: strip leading spaces + result = strip_default_padding(&result); + } + } + + // Apply force sign for numeric values + // GNU behavior: + only adds sign if: + // 1. An explicit width is provided, OR + // 2. The value exceeds the default width for that specifier (e.g., year > 4 + // digits) + if force_sign + && !result.starts_with('+') + && !result.starts_with('-') + && result.chars().next().is_some_and(|c| c.is_ascii_digit()) + { + let default_w = get_default_width(specifier); + // Add sign only if explicit width provided OR result exceeds default width + if explicit_width || (default_w > 0 && result.len() > default_w) { + result.insert(0, '+'); + } + } + + // Apply width padding + if effective_width > result.len() { + let padding = effective_width - result.len(); + let has_sign = result.starts_with('+') || result.starts_with('-'); + + if pad_char == '0' && has_sign { + // Zero padding: sign first, then zeros (e.g., "-0022") + let sign = result.chars().next().unwrap(); + let rest = &result[1..]; + let mut padded = try_alloc_padded(result.len(), padding, effective_width, specifier)?; + padded.push(sign); + padded.extend(std::iter::repeat_n('0', padding)); + padded.push_str(rest); + result = padded; + } else { + // Default: pad on the left (e.g., " -22" or " 1999") + let mut padded = try_alloc_padded(result.len(), padding, effective_width, specifier)?; + padded.extend(std::iter::repeat_n(pad_char, padding)); + padded.push_str(&result); + result = padded; + } + } + + Ok(result) + } + + /// Allocate a `String` with enough capacity for `current_len + padding`, + /// returning `FieldWidthTooLarge` on arithmetic overflow or allocation failure. + fn try_alloc_padded( + current_len: usize, + padding: usize, + width: usize, + specifier: &str, + ) -> Result { + let target_len = current_len + .checked_add(padding) + .ok_or_else(|| FormatError::FieldWidthTooLarge { width, specifier: specifier.to_string() })?; + let mut s = String::new(); + s.try_reserve(target_len) + .map_err(|_| FormatError::FieldWidthTooLarge { width, specifier: specifier.to_string() })?; + Ok(s) + } + + #[cfg(test)] + mod tests { + use jiff::{civil, tz::TimeZone}; + + use super::*; + + fn make_test_date(year: i16, month: i8, day: i8, hour: i8) -> Zoned { + civil::date(year, month, day) + .at(hour, 0, 0, 0) + .to_zoned(TimeZone::UTC) + .unwrap() + } + + fn get_config() -> Config { + Config::new().custom(PosixCustom::new()).lenient(true) + } + + #[test] + fn test_width_and_padding_modifiers() { + let date = make_test_date(1999, 6, 1, 0); + let config = get_config(); + + // Test basic width with zero padding + let result = format_with_modifiers(&date, "%10Y", &config).unwrap(); + assert_eq!(result, "0000001999"); + + // Test large width + let result = format_with_modifiers(&date, "%20Y", &config).unwrap(); + assert_eq!(result, "00000000000000001999"); + assert_eq!(result.len(), 20); + + // Test underscore (space) padding with month + let result = format_with_modifiers(&date, "%_10m", &config).unwrap(); + assert_eq!(result, " 6"); + assert_eq!(result.len(), 10); + + // Test underscore padding with day + let date_day5 = make_test_date(1999, 6, 5, 0); + let result = format_with_modifiers(&date_day5, "%_10d", &config).unwrap(); + assert_eq!(result, " 5"); + } + + #[test] + fn test_no_pad_and_case_flags() { + let date = make_test_date(1999, 6, 1, 0); + let config = get_config(); + + // Test no-pad: %-10Y suppresses all padding (width ignored) + let result = format_with_modifiers(&date, "%-10Y", &config).unwrap(); + assert_eq!(result, "1999"); + + // Test no-pad: %-d strips default zero padding + let result = format_with_modifiers(&date, "%-d", &config).unwrap(); + assert_eq!(result, "1"); + + // Test uppercase: %^B should uppercase month name + let result = format_with_modifiers(&date, "%^B", &config).unwrap(); + assert_eq!(result, "JUNE"); + + // Test uppercase with width: %^10B should uppercase and space-pad (text + // specifier) + let result = format_with_modifiers(&date, "%^10B", &config).unwrap(); + assert_eq!(result, " JUNE"); + assert_eq!(result.len(), 10); + } + + #[test] + fn test_sign_flags() { + let date = make_test_date(1970, 1, 1, 0); + let config = get_config(); + + // Test force sign with century: %+4C + let result = format_with_modifiers(&date, "%+4C", &config).unwrap(); + assert!(result.starts_with('+')); + assert_eq!(result.len(), 4); + + // Test force sign with zero padding: %+6Y + let result = format_with_modifiers(&date, "%+6Y", &config).unwrap(); + assert_eq!(result, "+01970"); + } + + #[test] + fn test_combined_flags_underscore_and_sign() { + let date = make_test_date(1970, 1, 1, 0); + let config = get_config(); + // %_+6Y: _ sets space pad, then + overrides to zero pad with sign (last wins) + let result = format_with_modifiers(&date, "%_+6Y", &config).unwrap(); + assert_eq!(result, "+01970"); + } + + #[test] + fn test_combined_flags_no_pad_and_uppercase() { + let date = make_test_date(1999, 6, 1, 0); + let config = get_config(); + // %-^10B: uppercase + no-pad (- suppresses all padding, width ignored) + let result = format_with_modifiers(&date, "%-^10B", &config).unwrap(); + assert_eq!(result, "JUNE"); + } + + #[test] + fn test_swap_case_flag() { + let date = make_test_date(1999, 6, 1, 0); + let config = get_config(); + // %#B: swap case on "June" (mixed case) → uppercase + let result = format_with_modifiers(&date, "%#B", &config).unwrap(); + assert_eq!(result, "JUNE"); + } + + #[test] + fn test_width_smaller_than_result() { + let date = make_test_date(1999, 6, 1, 0); + let config = get_config(); + // %1d: width 1 < "01".len() → strip zero padding → "1" + let result = format_with_modifiers(&date, "%1d", &config).unwrap(); + assert_eq!(result, "1"); + } + + #[test] + fn test_edge_cases_and_special_formats() { + let date = make_test_date(1999, 6, 1, 0); + let config = get_config(); + + // Test width zero (no effect) + let result = format_with_modifiers(&date, "%Y", &config).unwrap(); + assert_eq!(result, "1999"); + + // Test no modifiers (standard format) + let result = format_with_modifiers(&date, "%Y-%m-%d", &config).unwrap(); + assert_eq!(result, "1999-06-01"); + + // Test %% escape sequence + let result = format_with_modifiers(&date, "%%Y=%Y", &config).unwrap(); + assert_eq!(result, "%Y=1999"); + + // Test multiple modifiers in one format string + // %-5d: no-pad suppresses all padding → "1" (width ignored) + let result = format_with_modifiers(&date, "%10Y-%_5m-%-5d", &config).unwrap(); + assert_eq!(result, "0000001999- 6-1"); + } + + #[test] + fn test_modifier_detection() { + let date = make_test_date(1999, 6, 1, 0); + let config = get_config(); + + // Should detect modifiers + let result = format_with_modifiers_if_present(&date, "%10Y", &config); + assert!(result.is_some()); + + // Should not detect modifiers + let result = format_with_modifiers_if_present(&date, "%Y-%m-%d", &config); + assert!(result.is_none()); + + // Should detect flag without width + let result = format_with_modifiers_if_present(&date, "%^B", &config); + assert!(result.is_some()); + } + + #[test] + fn test_negative_values_with_space_padding() { + // Test case from GNU test: neg-secs2 + // Format: %_5s with value -22 should produce " -22" (space-padded) + use jiff::Timestamp; + + let ts = Timestamp::from_second(-22).unwrap(); + let date = ts.to_zoned(TimeZone::UTC); + let config = get_config(); + + let result = format_with_modifiers(&date, "%_5s", &config).unwrap(); + assert_eq!(result, " -22", "Space padding should pad before the sign for negative numbers"); + } + + // Unit tests for apply_modifiers function + #[test] + fn test_apply_modifiers_basic() { + // No modifiers (numeric specifier) + assert_eq!(apply_modifiers("1999", "", 0, "Y", false).unwrap(), "1999"); + // Zero padding + assert_eq!(apply_modifiers("1999", "0", 10, "Y", true).unwrap(), "0000001999"); + // Space padding (strips leading zeros) + assert_eq!(apply_modifiers("06", "_", 5, "m", true).unwrap(), " 6"); + // No-pad (strips leading zeros, width ignored) + assert_eq!(apply_modifiers("01", "-", 5, "d", true).unwrap(), "1"); + // Uppercase + assert_eq!(apply_modifiers("june", "^", 0, "B", false).unwrap(), "JUNE"); + // Swap case: all uppercase → lowercase + assert_eq!(apply_modifiers("UTC", "#", 0, "Z", false).unwrap(), "utc"); + // Swap case: mixed case → uppercase + assert_eq!(apply_modifiers("June", "#", 0, "B", false).unwrap(), "JUNE"); + } + + #[test] + fn test_apply_modifiers_signs() { + // Force sign with explicit width + assert_eq!(apply_modifiers("1970", "+", 6, "Y", true).unwrap(), "+01970"); + // Force sign without explicit width: should NOT add sign for 4-digit year + assert_eq!(apply_modifiers("1999", "+", 0, "Y", false).unwrap(), "1999"); + // Force sign without explicit width: SHOULD add sign for year > 4 digits + assert_eq!(apply_modifiers("12345", "+", 0, "Y", false).unwrap(), "+12345"); + // Negative with zero padding: sign first, then zeros + assert_eq!(apply_modifiers("-22", "0", 5, "s", true).unwrap(), "-0022"); + // Negative with space padding: spaces first, then sign + assert_eq!(apply_modifiers("-22", "_", 5, "s", true).unwrap(), " -22"); + // Force sign (_+): + is last, overrides _ → zero pad with sign + assert_eq!(apply_modifiers("5", "_+", 5, "s", true).unwrap(), "+0005"); + // No-pad + uppercase: no padding applied + assert_eq!(apply_modifiers("june", "-^", 10, "B", true).unwrap(), "JUNE"); + } + + #[test] + fn test_case_flag_precedence() { + // Test that ^ (uppercase) overrides # (swap case) + assert_eq!(apply_modifiers("June", "^#", 0, "B", false).unwrap(), "JUNE"); + assert_eq!(apply_modifiers("June", "#^", 0, "B", false).unwrap(), "JUNE"); + // Test # alone (swap case) + assert_eq!(apply_modifiers("June", "#", 0, "B", false).unwrap(), "JUNE"); + assert_eq!(apply_modifiers("JUNE", "#", 0, "B", false).unwrap(), "june"); + } + + #[test] + fn test_apply_modifiers_text_specifiers() { + // Text specifiers default to space padding + assert_eq!(apply_modifiers("June", "", 10, "B", true).unwrap(), " June"); + assert_eq!(apply_modifiers("Mon", "", 10, "a", true).unwrap(), " Mon"); + // Numeric specifiers default to zero padding + assert_eq!(apply_modifiers("6", "", 10, "m", true).unwrap(), "0000000006"); + } + + #[test] + fn test_apply_modifiers_width_smaller_than_result() { + // Width smaller than result strips default padding + assert_eq!(apply_modifiers("01", "", 1, "d", true).unwrap(), "1"); + assert_eq!(apply_modifiers("06", "", 1, "m", true).unwrap(), "6"); + } + + #[test] + fn test_apply_modifiers_parametrized() { + let test_cases = vec![ + ("1", "0", 3, "Y", true, "001"), + ("1", "_", 3, "d", true, " 1"), + ("1", "-", 3, "d", true, "1"), // no-pad: width ignored + ("abc", "^", 5, "B", true, " ABC"), // text specifier: space pad + ("5", "+", 4, "s", true, "+005"), + ("5", "_+", 4, "s", true, "+005"), // + is last: zero pad with sign + ("-3", "0", 5, "s", true, "-0003"), + ("05", "_", 3, "d", true, " 5"), + ("09", "-", 4, "d", true, "9"), // no-pad: width ignored + ("1970", "_+", 6, "Y", true, "+01970"), // + is last: zero pad with sign + ]; + + for (value, flags, width, spec, explicit_width, expected) in test_cases { + assert_eq!( + apply_modifiers(value, flags, width, spec, explicit_width).unwrap(), + expected, + "value='{value}', flags='{flags}', width={width}, spec='{spec}', \ + explicit_width={explicit_width}", + ); + } + } + + #[test] + fn test_apply_modifiers_width_too_large() { + let err = apply_modifiers("x", "", usize::MAX, "c", true).unwrap_err(); + assert!(matches!( + err, + FormatError::FieldWidthTooLarge { width, specifier } + if width == usize::MAX && specifier == "c" + )); + } + + #[test] + fn test_underscore_flag_without_width() { + // %_m should pad month to default width 2 with spaces + assert_eq!(apply_modifiers("6", "_", 0, "m", false).unwrap(), " 6"); + // %_d should pad day to default width 2 with spaces + assert_eq!(apply_modifiers("1", "_", 0, "d", false).unwrap(), " 1"); + // %_H should pad hour to default width 2 with spaces + assert_eq!(apply_modifiers("5", "_", 0, "H", false).unwrap(), " 5"); + // %_Y should pad year to default width 4 with spaces + assert_eq!(apply_modifiers("1999", "_", 0, "Y", false).unwrap(), "1999"); + // already at default width + } + + #[test] + fn test_plus_flag_without_width() { + // %+Y without width should NOT add sign for 4-digit year + assert_eq!(apply_modifiers("1999", "+", 0, "Y", false).unwrap(), "1999"); + // %+Y without width SHOULD add sign for year > 4 digits + assert_eq!(apply_modifiers("12345", "+", 0, "Y", false).unwrap(), "+12345"); + // %+Y with explicit width should add sign + assert_eq!(apply_modifiers("1999", "+", 6, "Y", true).unwrap(), "+01999"); + } + + #[test] + fn test_zero_flag_on_space_padded_specifiers() { + // GNU date: %0e should override space-padding with zero-padding + // Verified: `date -d "2024-06-05" "+%0e"` → "05" + let date = make_test_date(1999, 6, 5, 5); + let config = get_config(); + + // %0e: day-of-month (normally space-padded) with 0 flag → zero-padded + let result = format_with_modifiers(&date, "%0e", &config).unwrap(); + assert_eq!(result, "05", "GNU: %0e should produce '05', not ' 5'"); + + // %0k: hour (normally space-padded) with 0 flag → zero-padded + let result = format_with_modifiers(&date, "%0k", &config).unwrap(); + assert_eq!(result, "05", "GNU: %0k should produce '05', not ' 5'"); + } + + #[test] + fn test_underscore_century_default_width() { + // GNU date: %C default width is 2, not 4 + // Verified: `date -d "2024-06-15" "+%_C"` → "20" (no extra padding) + let date = make_test_date(1999, 6, 1, 0); + let config = get_config(); + + // %_C: century with underscore flag, no explicit width + // Default width for %C should be 2 (century is 00-99) + let result = format_with_modifiers(&date, "%_C", &config).unwrap(); + assert_eq!( + result, "19", + "GNU: %_C should produce '19', not ' 19' (default width is 2, not 4)" + ); + } + } +} + +use std::{ + borrow::Cow, + collections::HashMap, + ffi::OsString, + fs::File, + io::{BufRead, BufReader, BufWriter, Read, Write}, + path::PathBuf, + sync::LazyLock, +}; +#[cfg(any( + target_os = "linux", + target_vendor = "apple", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd", + target_os = "dragonfly", +))] +use std::ffi::{CStr, CString}; + + +use clap::{Arg, ArgAction, ArgMatches, Command}; +use jiff::{ + Timestamp, Zoned, + fmt::strtime::{self, BrokenDownTime, Config, PosixCustom}, + tz::{Offset, TimeZone, TimeZoneDatabase}, +}; +use uucore::{display::Quotable, parser::shortcut_value_parser::ShortcutValueParser}; + +// Options +const DATE: &str = "date"; +const HOURS: &str = "hours"; +const MINUTES: &str = "minutes"; +const SECONDS: &str = "seconds"; +const NS: &str = "ns"; + +const OPT_DATE: &str = "date"; +const OPT_FORMAT: &str = "format"; +const OPT_FILE: &str = "file"; +const OPT_DEBUG: &str = "debug"; +const OPT_ISO_8601: &str = "iso-8601"; +const OPT_RESOLUTION: &str = "resolution"; +const OPT_RFC_EMAIL: &str = "rfc-email"; +const OPT_RFC_822: &str = "rfc-822"; +const OPT_RFC_2822: &str = "rfc-2822"; +const OPT_RFC_3339: &str = "rfc-3339"; +const OPT_SET: &str = "set"; +const OPT_REFERENCE: &str = "reference"; +const OPT_UNIVERSAL: &str = "universal"; +const OPT_UNIVERSAL_2: &str = "utc"; + +/// Settings for this program, parsed from the command line +struct Settings { + utc: bool, + format: Format, + date_source: DateSource, + debug: bool, + default_format: String, +} + +/// Options for parsing dates +#[derive(Clone, Copy)] +struct DebugOptions { + /// Enable debug output + debug: bool, + /// Warn when midnight is used without explicit time specification + warn_midnight: bool, +} + +impl DebugOptions { + fn new(debug: bool, warn_midnight: bool) -> Self { + Self { debug, warn_midnight } + } +} + +/// Various ways of displaying the date +enum Format { + Iso8601(Iso8601Format), + Rfc5322, + Rfc3339(Rfc3339Format), + Resolution, + Custom(String), + Default, +} + +/// Various places that dates can come from +enum DateSource { + Now, + File(PathBuf), + FileMtime(PathBuf), + Stdin, + Human(String), + Resolution, +} + +enum Iso8601Format { + Date, + Hours, + Minutes, + Seconds, + Ns, +} + +impl From<&str> for Iso8601Format { + fn from(s: &str) -> Self { + match s { + HOURS => Self::Hours, + MINUTES => Self::Minutes, + SECONDS => Self::Seconds, + NS => Self::Ns, + DATE => Self::Date, + // Note: This is caught by clap via `possible_values` + _ => unreachable!(), + } + } +} + +enum Rfc3339Format { + Date, + Seconds, + Ns, +} + +impl From<&str> for Rfc3339Format { + fn from(s: &str) -> Self { + match s { + DATE => Self::Date, + SECONDS => Self::Seconds, + NS => Self::Ns, + // Should be caught by clap + _ => panic!("Invalid format: {s}"), + } + } +} + +/// Indicates whether parsing a military timezone causes the date to remain the +/// same, roll back to the previous day, or advance to the next day. +/// This can occur when applying a military timezone with an optional hour +/// offset crosses midnight in either direction. +#[derive(PartialEq, Debug)] +enum DayDelta { + /// The date does not change + Same, + /// The date rolls back to the previous day. + Previous, + /// The date advances to the next day. + Next, +} + +/// Escape invalid UTF-8 bytes in GNU-compatible octal notation. +/// +/// Converts bytes to a string with printable ASCII characters preserved +/// and non-printable/invalid UTF-8 bytes escaped as `\NNN` octal sequences. +/// +/// This matches GNU date's behavior for invalid input. +/// +/// # Arguments +/// * `bytes` - The byte sequence to escape +/// +/// # Returns +/// A string with invalid bytes escaped in octal notation +/// +/// # Example +/// ```ignore +/// let invalid = b"\xb0"; +/// assert_eq!(escape_invalid_bytes(invalid), "\\260"); +/// ``` +fn escape_invalid_bytes(bytes: &[u8]) -> String { + let escaped = bytes + .iter() + .flat_map(|&b| { + // Preserve printable ASCII except backslash + if (0x20..0x7f).contains(&b) && b != b'\\' { + vec![b] + } else { + // Escape as octal: \NNN + format!("\\{b:03o}").into_bytes() + } + }) + .collect::>(); + String::from_utf8_lossy(&escaped).into_owned() +} + +/// Strip parenthesized comments from a date string. +/// +/// GNU date removes balanced parentheses and their content, treating them as +/// comments. If parentheses are unbalanced, everything from the unmatched '(' +/// onwards is ignored. +/// +/// Examples: +/// - "2026(comment)-01-05" -> "2026-01-05" +/// - "1(ignore comment to eol" -> "1" +/// - "(" -> "" +/// - "((foo)2026-01-05)" -> "" +fn strip_parenthesized_comments(input: &str) -> Cow<'_, str> { + if !input.contains('(') { + return Cow::Borrowed(input); + } + + let mut result = String::with_capacity(input.len()); + let mut depth = 0; + + for c in input.chars() { + match c { + '(' => { + depth += 1; + }, + ')' if depth > 0 => { + depth -= 1; + }, + _ if depth == 0 => { + result.push(c); + }, + _ => {}, + } + } + + Cow::Owned(result) +} + +/// Parse military timezone with optional hour offset. +/// Pattern: single letter (a-z except j) optionally followed by 1-2 digits. +/// Returns Some(total_hours_in_utc) or None if pattern doesn't match. +/// +/// Military timezone mappings: +/// - A-I: UTC+1 to UTC+9 (J is skipped for local time) +/// - K-M: UTC+10 to UTC+12 +/// - N-Y: UTC-1 to UTC-12 +/// - Z: UTC+0 +/// +/// The hour offset from digits is added to the base military timezone offset. +/// Examples: "m" -> 12 (noon UTC), "m9" -> 21 (9pm UTC), "a5" -> 4 (4am UTC +/// next day) +fn parse_military_timezone_with_offset(s: &str) -> Option<(i32, DayDelta)> { + if s.is_empty() || s.len() > 3 { + return None; + } + + let mut chars = s.chars(); + let letter = chars.next()?.to_ascii_lowercase(); + + // Check if first character is a letter (a-z, except j which is handled + // separately) + if !letter.is_ascii_lowercase() || letter == 'j' { + return None; + } + + // Parse optional digits (1-2 digits for hour offset) + let additional_hours: i32 = if let Some(rest) = chars.as_str().chars().next() { + if !rest.is_ascii_digit() { + return None; + } + chars.as_str().parse().ok()? + } else { + 0 + }; + + // Map military timezone letter to UTC offset + let tz_offset = match letter { + 'a'..='i' => (letter as i32 - 'a' as i32) + 1, // A=+1, B=+2, ..., I=+9 + 'k'..='m' => (letter as i32 - 'k' as i32) + 10, // K=+10, L=+11, M=+12 + 'n'..='y' => -((letter as i32 - 'n' as i32) + 1), // N=-1, O=-2, ..., Y=-12 + 'z' => 0, // Z=+0 + _ => return None, + }; + + let day_delta = match additional_hours - tz_offset { + h if h < 0 => DayDelta::Previous, + h if h >= 24 => DayDelta::Next, + _ => DayDelta::Same, + }; + + // Calculate total hours: midnight (0) + tz_offset + additional_hours + // Midnight in timezone X converted to UTC + let hours_from_midnight = (0 - tz_offset + additional_hours).rem_euclid(24); + + Some((hours_from_midnight, day_delta)) +} + +/// Parsed `date` invocation. +pub(crate) struct Date { + matches: ArgMatches, +} + +matches_parser!(Date, uu_app); + +#[derive(Debug)] +struct DateError { + code: i32, + message: String, +} + +impl DateError { + fn new(code: i32, message: impl Into) -> Self { + Self { code, message: message.into() } + } +} + +impl From for DateError { + fn from(error: std::io::Error) -> Self { + Self::new(1, error.to_string()) + } +} + +impl Utility for Date { + const NAME: &'static str = "date"; + + fn run(self, host: &mut Host) -> i32 { + match date_main(host, &self.matches) { + Ok(()) => host.exit_code(), + Err(error) => { + host.error(error.message, error.code); + host.exit_code() + }, + } + } +} +fn shell_time_zone(host: &Host) -> TimeZone { + let Some(value) = host.var("TZ") else { + return TimeZone::system(); + }; + let value = value.strip_prefix(':').unwrap_or(value); + if value.is_empty() { + return TimeZone::UTC; + } + TimeZone::get(value) + .or_else(|_| TimeZone::posix(value)) + .unwrap_or(TimeZone::UTC) +} +fn shell_locale(host: &Host) -> String { + let locale = host + .var("LC_ALL") + .filter(|value| !value.is_empty()) + .or_else(|| host.var("LC_TIME").filter(|value| !value.is_empty())) + .or_else(|| host.var("LANG").filter(|value| !value.is_empty())) + .unwrap_or("C"); + locale_default_format(locale).unwrap_or_else(|| "%a %b %e %X %Z %Y".to_string()) +} + +#[cfg(any( + target_os = "linux", + target_vendor = "apple", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd", + target_os = "dragonfly", +))] +fn locale_default_format(locale: &str) -> Option { + let locale = CString::new(locale).ok()?; + // SAFETY: the locale name is a live NUL-terminated string, the returned + // locale object is installed only for this blocking utility thread, and it + // is restored before the object is freed. + unsafe { + let locale_object = + libc::newlocale(libc::LC_TIME_MASK, locale.as_ptr(), std::ptr::null_mut()); + if locale_object.is_null() { + return None; + } + let previous = libc::uselocale(locale_object); + let format_ptr = libc::nl_langinfo(libc::D_T_FMT); + let format = (!format_ptr.is_null()) + .then(|| CStr::from_ptr(format_ptr).to_string_lossy().into_owned()) + .filter(|format| !format.is_empty()); + libc::uselocale(previous); + libc::freelocale(locale_object); + + format.map(|mut format| { + if !format.contains("%Z") && !format.contains("%z") { + if let Some(position) = format.find("%Y").or_else(|| format.find("%y")) { + format.insert_str(position, "%Z "); + } else { + format.push_str(" %Z"); + } + } + format + }) + } +} + +#[cfg(not(any( + target_os = "linux", + target_vendor = "apple", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd", + target_os = "dragonfly", +)))] +fn locale_default_format(_locale: &str) -> Option { + None +} + + + +#[allow(clippy::cognitive_complexity)] +fn date_main(host: &mut Host, matches: &ArgMatches) -> Result<(), DateError> { + let date_source = if let Some(date_os) = matches.get_one::(OPT_DATE) { + // Convert OsString to String, handling invalid UTF-8 with GNU-compatible error + let date = date_os.to_str().ok_or_else(|| { + let bytes = date_os.as_encoded_bytes(); + let escaped_str = escape_invalid_bytes(bytes); + DateError::new(1, format!("invalid date '{escaped_str}'")) + })?; + DateSource::Human(date.into()) + } else if let Some(file) = matches.get_one::(OPT_FILE) { + match file.as_ref() { + "-" => DateSource::Stdin, + _ => DateSource::File(file.into()), + } + } else if let Some(file) = matches.get_one::(OPT_REFERENCE) { + DateSource::FileMtime(file.into()) + } else if matches.get_flag(OPT_RESOLUTION) { + DateSource::Resolution + } else { + DateSource::Now + }; + + // Check for extra operands (multiple positional arguments) + if let Some(formats) = matches.get_many::(OPT_FORMAT) { + let format_args: Vec<&String> = formats.collect(); + if format_args.len() > 1 { + return Err(DateError::new(1, format!("extra operand '{}'", format_args[1]))); + } + } + + let format = if let Some(form) = matches.get_one::(OPT_FORMAT) { + if !form.starts_with('+') { + // if an optional Format String was found but the user has not provided an input + // date GNU prints an invalid date Error + if !matches!(date_source, DateSource::Human(_)) { + return Err(DateError::new(1, format!("invalid date '{form}'"))); + } + // If the user did provide an input date with the --date flag and the Format + // String is not starting with '+' GNU prints the missing '+' error message + return Err(DateError::new( + 1, + format!( + "the argument {form} lacks a leading '+';\nwhen using an option to specify \ + date(s), any non-option\nargument must be a format string beginning with '+'" + ), + )); + } + let form = form[1..].to_string(); + Format::Custom(form) + } else if let Some(fmt) = matches + .get_many::(OPT_ISO_8601) + .map(|mut iter| iter.next().unwrap_or(&DATE.to_string()).as_str().into()) + { + Format::Iso8601(fmt) + } else if matches.get_flag(OPT_RFC_EMAIL) { + Format::Rfc5322 + } else if let Some(fmt) = matches + .get_one::(OPT_RFC_3339) + .map(|s| s.as_str().into()) + { + Format::Rfc3339(fmt) + } else if matches.get_flag(OPT_RESOLUTION) { + Format::Resolution + } else { + Format::Default + }; + + let utc = matches.get_flag(OPT_UNIVERSAL); + let debug_mode = matches.get_flag(OPT_DEBUG); + + // The shell environment is isolated from the host process environment. + let local_time_zone = shell_time_zone(host); + let now = Timestamp::now().to_zoned(if utc { + TimeZone::UTC + } else { + local_time_zone.clone() + }); + if let Some(input) = matches.get_one::(OPT_SET) { + let mut error = host.stderr_clone(); + let date = parse_date( + input, + &now, + DebugOptions::new(debug_mode, true), + &mut error, + ) + .map_err(|(input, _)| DateError::new(1, format!("invalid date '{input}'")))?; + return set_system_datetime(date); + } + + let default_format = shell_locale(host); + + let settings = Settings { utc, format, date_source, debug: debug_mode, default_format }; + + // Iterate over all dates - whether it's a single date or a file. + let cancel = host.cancel_flag(); + let mut had_error = false; + let mut debug_stderr = host.stderr_clone(); + let reader_stderr = host.stderr_clone(); + let dates: Box> = match &settings.date_source { + DateSource::Human(input) => { + // GNU compatibility (Comments in parentheses) + let input = strip_parenthesized_comments(input); + let input = input.trim(); + + // GNU compatibility (Empty string): + // An empty string (or whitespace-only) should be treated as midnight today. + let is_empty_or_whitespace = input.is_empty(); + + // GNU compatibility (Military timezone 'J'): + // 'J' is reserved for local time in military timezones. + // GNU date accepts it and treats it as midnight today (00:00:00). + let is_military_j = input.eq_ignore_ascii_case("j"); + + // GNU compatibility (Military timezone with optional hour offset): + // Single letter (a-z except j) optionally followed by 1-2 digits. + // Letter represents midnight in that military timezone (UTC offset). + // Digits represent additional hours to add. + // Examples: "m" -> noon UTC (12:00); "m9" -> 21:00 UTC; "a5" -> 04:00 UTC + let military_tz_with_offset = parse_military_timezone_with_offset(input); + + // GNU compatibility (Pure numbers in date strings): + // - Manual: https://www.gnu.org/software/coreutils/manual/html_node/Pure-numbers-in-date-strings.html + // - Semantics: a pure decimal number denotes today's time-of-day (HH or HHMM). + // Examples: "0"/"00" => 00:00 today; "7"/"07" => 07:00 today; "0700" => 07:00 + // today. + // For all other forms, fall back to the general parser. + let is_pure_digits = + !input.is_empty() && input.len() <= 4 && input.chars().all(|c| c.is_ascii_digit()); + + let date = if is_empty_or_whitespace || is_military_j { + // Treat empty string or 'J' as midnight today (00:00:00) in local time + let date_part = + strtime::format("%F", &now).unwrap_or_else(|_| String::from("1970-01-01")); + let offset = if settings.utc { + String::from("+00:00") + } else { + strtime::format("%:z", &now).unwrap_or_default() + }; + let composed = if offset.is_empty() { + format!("{date_part} 00:00") + } else { + format!("{date_part} 00:00 {offset}") + }; + if settings.debug { + let _ = writeln!( + host.stderr, + "date: warning: using midnight as starting time: 00:00:00" + ); + } + parse_date( + composed, + &now, + DebugOptions::new(settings.debug, false), + &mut debug_stderr, + ) + } else if let Some((total_hours, day_delta)) = military_tz_with_offset { + // Military timezone with optional hour offset + // Convert to UTC time: midnight + military_tz_offset + additional_hours + + // When calculating a military timezone with an optional hour offset, midnight + // may be crossed in either direction. `day_delta` indicates whether the + // date remains the same, moves to the previous day, or advances to the next + // day. Changing day can result in error, this closure will help handle + // these errors gracefully. + let format_date_with_epoch_fallback = |date: Result| -> String { + date + .and_then(|d| strtime::format("%F", &d)) + .unwrap_or_else(|_| String::from("1970-01-01")) + }; + let date_part = match day_delta { + DayDelta::Same => format_date_with_epoch_fallback(Ok(now.clone())), + DayDelta::Next => format_date_with_epoch_fallback(now.tomorrow()), + DayDelta::Previous => format_date_with_epoch_fallback(now.yesterday()), + }; + let composed = format!("{date_part} {total_hours:02}:00:00 +00:00"); + parse_date( + composed, + &now, + DebugOptions::new(settings.debug, false), + &mut debug_stderr, + ) + } else if is_pure_digits { + // Derive HH and MM from the input + let (hh_opt, mm_opt) = if input.len() <= 2 { + (input.parse::().ok(), Some(0u32)) + } else { + let (h, m) = input.split_at(input.len() - 2); + (h.parse::().ok(), m.parse::().ok()) + }; + + if let (Some(hh), Some(mm)) = (hh_opt, mm_opt) { + // Compose a concrete datetime string for today with zone offset. + // Use the already-determined 'now' and settings.utc to select offset. + let date_part = + strtime::format("%F", &now).unwrap_or_else(|_| String::from("1970-01-01")); + // If -u, force +00:00; otherwise use the local offset of 'now'. + let offset = if settings.utc { + String::from("+00:00") + } else { + strtime::format("%:z", &now).unwrap_or_default() + }; + let composed = if offset.is_empty() { + format!("{date_part} {hh:02}:{mm:02}") + } else { + format!("{date_part} {hh:02}:{mm:02} {offset}") + }; + parse_date( + composed, + &now, + DebugOptions::new(settings.debug, false), + &mut debug_stderr, + ) + } else { + // Fallback on parse failure of digits + parse_date( + input, + &now, + DebugOptions::new(settings.debug, true), + &mut debug_stderr, + ) + } + } else { + parse_date( + input, + &now, + DebugOptions::new(settings.debug, true), + &mut debug_stderr, + ) + }; + + let iter = std::iter::once(date); + Box::new(iter) + }, + DateSource::Stdin => parse_dates_from_reader( + &mut host.stdin, + &now, + DebugOptions::new(settings.debug, true), + reader_stderr.clone(), + ), + DateSource::File(path) => { + // directory; `path` is kept for display. + let resolved = host.resolve(path); + if resolved.is_dir() { + return Err(DateError::new( + 2, + format!("expected file, got directory {}", path.quote()), + )); + } + let file = File::open(&resolved).map_err(|error| { + DateError::new(1, format!("{}: {error}", path.as_os_str().maybe_quote())) + })?; + parse_dates_from_reader( + file, + &now, + DebugOptions::new(settings.debug, true), + reader_stderr, + ) + }, + DateSource::FileMtime(path) => { + // directory; `path` is kept for display. + let metadata = std::fs::metadata(host.resolve(path)).map_err(|error| { + DateError::new(1, format!("{}: {error}", path.as_os_str().maybe_quote())) + })?; + let mtime = metadata.modified()?; + let ts = Timestamp::try_from(mtime) + .map_err(|_| DateError::new(1, "cannot set date".to_string()))?; + let date = ts.to_zoned(local_time_zone.clone()); + let iter = std::iter::once(Ok(date)); + Box::new(iter) + }, + DateSource::Resolution => { + let resolution = get_clock_resolution(); + let date = resolution.to_zoned(local_time_zone.clone()); + let iter = std::iter::once(Ok(date)); + Box::new(iter) + }, + DateSource::Now => { + let iter = std::iter::once(Ok(now.clone())); + Box::new(iter) + }, + }; + + let format_string = make_format_string(&settings); + let mut stdout = BufWriter::new(&mut host.stdout); + + // Format all the dates + let config = Config::new().custom(PosixCustom::new()).lenient(true); + for date in dates { + // host cancellation between lines. + if cancel.load(std::sync::atomic::Ordering::Relaxed) { + break; + } + match date { + Ok(date) => { + let date = if settings.utc { + date.with_time_zone(TimeZone::UTC) + } else { + date + }; + match format_date(&date, format_string, &config) { + Ok(s) => writeln!(stdout, "{s}") + .map_err(|e| DateError::new(1, format!("write error: {e}")))?, + Err(e) => { + let _ = stdout.flush(); + return Err(DateError::new( + 1, + format!("invalid format '{format_string}' ({e})"), + )); + }, + } + }, + Err((input, _err)) => { + let _ = stdout.flush(); + // context stderr, record the failure exit code, and keep + // processing the remaining lines. + let _ = writeln!(host.stderr, "date: invalid date '{input}'"); + had_error = true; + }, + } + } + + stdout + .flush() + .map_err(|e| DateError::new(1, format!("write error: {e}")))?; + drop(stdout); + + if had_error { + host.fail(1); + } + Ok(()) +} +fn uu_app() -> Command { + Command::new("date") + .version("0.8.0") + .about("Print or set the system date and time") + // `after_help` below; the usage proper is just the two command lines. + .override_usage(format_usage( + "date [OPTION]... [+FORMAT]...\ndate [OPTION]... [MMDDhhmm[[CC]YY][.ss]]", + )) + .after_help(FORMAT_HELP) + .infer_long_args(true) + .arg( + Arg::new(OPT_DATE) + .short('d') + .long(OPT_DATE) + .value_name("STRING") + .allow_hyphen_values(true) + .overrides_with(OPT_DATE) + .value_parser(clap::value_parser!(OsString)) + .help("display time described by STRING, not 'now'"), + ) + .arg( + Arg::new(OPT_FILE) + .short('f') + .long(OPT_FILE) + .value_name("DATEFILE") + .value_hint(clap::ValueHint::FilePath) + .conflicts_with(OPT_DATE) + .help("like --date; once for each line of DATEFILE"), + ) + .arg( + Arg::new(OPT_ISO_8601) + .short('I') + .long(OPT_ISO_8601) + .value_name("FMT") + .value_parser(ShortcutValueParser::new([DATE, HOURS, MINUTES, SECONDS, NS])) + .num_args(0..=1) + .default_missing_value(OPT_DATE) + .help( + "output date/time in ISO 8601 format.\nFMT='date' for date only (the \ + default),\n'hours', 'minutes', 'seconds', or 'ns'\nfor date and time to the \ + indicated precision.\nExample: 2006-08-14T02:34:56-06:00", + ), + ) + .arg( + Arg::new(OPT_RESOLUTION) + .long(OPT_RESOLUTION) + .conflicts_with_all([OPT_DATE, OPT_FILE]) + .overrides_with(OPT_RESOLUTION) + .help("output the available resolution of timestamps\nExample: 0.000000001") + .action(ArgAction::SetTrue), + ) + .arg( + Arg::new(OPT_RFC_EMAIL) + .short('R') + .long(OPT_RFC_EMAIL) + .alias(OPT_RFC_2822) + .alias(OPT_RFC_822) + .overrides_with(OPT_RFC_EMAIL) + .help( + "output date and time in RFC 5322 format.\nExample: Mon, 14 Aug 2006 02:34:56 -0600", + ) + .action(ArgAction::SetTrue), + ) + .arg( + Arg::new(OPT_RFC_3339) + .long(OPT_RFC_3339) + .value_name("FMT") + .value_parser(ShortcutValueParser::new([DATE, SECONDS, NS])) + .help( + "output date/time in RFC 3339 format.\nFMT='date', 'seconds', or 'ns'\nfor date \ + and time to the indicated precision.\nExample: 2006-08-14 02:34:56-06:00", + ), + ) + .arg( + Arg::new(OPT_DEBUG) + .long(OPT_DEBUG) + .help("annotate the parsed date, and warn about questionable usage to stderr") + .action(ArgAction::SetTrue), + ) + .arg( + Arg::new(OPT_REFERENCE) + .short('r') + .long(OPT_REFERENCE) + .value_name("FILE") + .value_hint(clap::ValueHint::AnyPath) + .conflicts_with_all([OPT_DATE, OPT_FILE, OPT_RESOLUTION]) + .help("display the last modification time of FILE"), + ) + .arg( + Arg::new(OPT_SET) + .short('s') + .long(OPT_SET) + .value_name("STRING") + .allow_hyphen_values(true) + .help("set time described by STRING"), + ) + .arg( + Arg::new(OPT_UNIVERSAL) + .short('u') + .long(OPT_UNIVERSAL) + .visible_alias(OPT_UNIVERSAL_2) + .alias("uct") + .overrides_with(OPT_UNIVERSAL) + .help("print or set Coordinated Universal Time (UTC)") + .action(ArgAction::SetTrue), + ) + .arg(Arg::new(OPT_FORMAT).num_args(0..)) +} + +// blob, rendered as plain text for clap's after_help. +const FORMAT_HELP: &str = "\ +FORMAT controls the output. Interpreted sequences are: + %% a literal % + %a locale's abbreviated weekday name (e.g., Sun) + %A locale's full weekday name (e.g., Sunday) + %b locale's abbreviated month name (e.g., Jan) + %B locale's full month name (e.g., January) + %c locale's date and time (e.g., Thu Mar 3 23:05:25 2005) + %C century; like %Y, except omit last two digits (e.g., 20) + %d day of month (e.g., 01) + %D date; same as %m/%d/%y + %e day of month, space padded; same as %_d + %F full date; same as %Y-%m-%d + %g last two digits of year of ISO week number (see %G) + %G year of ISO week number (see %V); normally useful only with %V + %h same as %b + %H hour (00..23) + %I hour (01..12) + %j day of year (001..366) + %k hour, space padded ( 0..23); same as %_H + %l hour, space padded ( 1..12); same as %_I + %m month (01..12) + %M minute (00..59) + %n a newline + %N nanoseconds (000000000..999999999) + %p locale's equivalent of either AM or PM; blank if not known + %P like %p, but lower case + %q quarter of year (1..4) + %r locale's 12-hour clock time (e.g., 11:11:04 PM) + %R 24-hour hour and minute; same as %H:%M + %s seconds since 1970-01-01 00:00:00 UTC + %S second (00..60) + %t a tab + %T time; same as %H:%M:%S + %u day of week (1..7); 1 is Monday + %U week number of year, with Sunday as first day of week (00..53) + %V ISO week number, with Monday as first day of week (01..53) + %w day of week (0..6); 0 is Sunday + %W week number of year, with Monday as first day of week (00..53) + %x locale's date representation (e.g., 03/03/2005) + %X locale's time representation (e.g., 23:30:30) + %y last two digits of year (00..99) + %Y year + %z +hhmm numeric time zone (e.g., -0400) + %:z +hh:mm numeric time zone (e.g., -04:00) + %::z +hh:mm:ss numeric time zone (e.g., -04:00:00) + %:::z numeric time zone with : to necessary precision (e.g., -04, +05:30) + %Z alphabetic time zone abbreviation (e.g., EDT) + +By default, date pads numeric fields with zeroes. +The following optional flags may follow '%': + - (hyphen) do not pad the field + _ (underscore) pad with spaces + 0 (zero) pad with zeros + ^ use upper case if possible + # use opposite case if possible +After any flags comes an optional field width, as a decimal number; +then an optional modifier, which is either + E to use the locale's alternate representations if available, or + O to use the locale's alternate numeric symbols if available. + +Examples: + Convert seconds since the epoch (1970-01-01 UTC) to a date + date --date='@2147483647' + Show the time on the west coast of the US (use tzselect(1) to find TZ) + TZ='America/Los_Angeles' date"; + +/// optional icu locale-aware month/day name substitution (the i18n-datetime +/// feature is not vendored, so no localization ever applies). +fn format_date( + date: &Zoned, + format_string: &str, + config: &Config, +) -> Result { + // Check if format string has GNU modifiers (width/flags) and format if present + if let Some(result) = + format_modifiers::format_with_modifiers_if_present(date, format_string, config) + { + return result.map_err(|e| e.to_string()); + } + + let broken_down = BrokenDownTime::from(date); + broken_down + .to_string_with_config(config, format_string) + .map_err(|e| e.to_string()) +} + +/// Return the appropriate format string for the given settings. +fn make_format_string(settings: &Settings) -> &str { + match &settings.format { + Format::Iso8601(fmt) => match fmt { + Iso8601Format::Date => "%F", + Iso8601Format::Hours => "%FT%H%:z", + Iso8601Format::Minutes => "%FT%H:%M%:z", + Iso8601Format::Seconds => "%FT%T%:z", + Iso8601Format::Ns => "%FT%T,%N%:z", + }, + Format::Rfc5322 => "%a, %d %h %Y %T %z", + Format::Rfc3339(fmt) => match fmt { + Rfc3339Format::Date => "%F", + Rfc3339Format::Seconds => "%F %T%:z", + Rfc3339Format::Ns => "%F %T.%N%:z", + }, + Format::Resolution => "%s.%N", + Format::Custom(fmt) => fmt, + Format::Default => &settings.default_format, + } +} + +/// Timezone abbreviations with known fixed UTC offsets. +/// Checked first because the abbreviation encodes the exact offset +/// (e.g., EDT always means UTC-4, even in winter when New York observes EST). +/// Offset is in seconds to support half-hour zones like IST (UTC+5:30). +/// All other timezones (JST, CET, etc.) are dynamically resolved from IANA +/// database. +static FIXED_OFFSET_ABBREVIATIONS: &[(&str, i32)] = &[ + ("UTC", 0), + ("GMT", 0), + ("MEST", 7200), // UTC+2 Middle European Summer Time + // US timezones (GNU compatible) + ("PST", -28800), // UTC-8 + ("PDT", -25200), // UTC-7 + ("MST", -25200), // UTC-7 + ("MDT", -21600), // UTC-6 + ("CST", -21600), // UTC-6 (Ambiguous: US Central, not China/Cuba) + ("CDT", -18000), // UTC-5 + ("EST", -18000), // UTC-5 + ("EDT", -14400), // UTC-4 + // Indian Standard Time (Ambiguous: India vs Israel vs Ireland) + ("IST", 19800), // UTC+5:30 + // Australian timezones + ("AWST", 28800), // UTC+8 + ("ACST", 34200), // UTC+9:30 + ("ACDT", 37800), // UTC+10:30 + ("AEST", 36000), // UTC+10 + ("AEDT", 39600), // UTC+11 + // German timezones + ("MEZ", 3600), // UTC+1 + ("MESZ", 7200), // UTC+2 + // Asian timezones + ("KST", 32400), // UTC+9 Korean Standard Time +]; + +/// Lazy-loaded timezone abbreviation lookup map built from IANA database. +static TZ_ABBREV_CACHE: LazyLock> = LazyLock::new(build_tz_abbrev_map); + +/// Build timezone abbreviation lookup map from IANA database. +/// This is a fallback for abbreviations not covered by +/// FIXED_OFFSET_ABBREVIATIONS. +fn build_tz_abbrev_map() -> HashMap { + let mut map = HashMap::new(); + let tzdb = TimeZoneDatabase::bundled(); + + for tz_name in tzdb.available() { + let tz_str = tz_name.as_str(); + // Use last component as potential abbreviation + // e.g., "Pacific/Fiji" could map to "FIJI" + if let Some(last_part) = tz_str.split('/').next_back() { + let potential_abbrev = last_part.to_uppercase(); + // Only add if it looks like an abbreviation (2-5 uppercase chars) + if potential_abbrev.len() >= 2 + && potential_abbrev.len() <= 5 + && potential_abbrev.chars().all(|c| c.is_ascii_uppercase()) + { + map.entry(potential_abbrev) + .or_insert_with(|| tz_str.to_string()); + } + } + } + + map +} + +/// Get IANA timezone name for a given abbreviation. +/// Uses lazy-loaded cache with preferred mappings for disambiguation. +fn tz_abbrev_to_iana(abbrev: &str) -> Option<&str> { + TZ_ABBREV_CACHE.get(abbrev).map(String::as_str) +} + +/// Attempts to parse a date string that contains a timezone abbreviation (e.g. +/// "EST"). +/// +/// If an abbreviation is found and the date is parsable, returns `Some(Zoned)`. +/// Returns `None` if no abbreviation is detected or if parsing fails, +/// indicating that standard parsing should be attempted. +fn try_parse_with_abbreviation>(date_str: S, now: &Zoned) -> Option { + let s = date_str.as_ref(); + + // Look for timezone abbreviation at the end of the string + // Pattern: ends with uppercase letters (2-5 chars) + if let Some(last_word) = s.split_whitespace().last() { + // Check if it's a potential timezone abbreviation (all uppercase, 2-5 chars) + if last_word.len() >= 2 + && last_word.len() <= 5 + && last_word.chars().all(|c| c.is_ascii_uppercase()) + { + let tz = if let Some(&(_, offset_secs)) = FIXED_OFFSET_ABBREVIATIONS + .iter() + .find(|(abbr, _)| *abbr == last_word) + { + Offset::from_seconds(offset_secs).ok().map(TimeZone::fixed) + } else { + tz_abbrev_to_iana(last_word).and_then(|name| TimeZone::get(name).ok()) + }; + + if let Some(tz) = tz { + let date_part = s.trim_end_matches(last_word).trim(); + // Parse in the target timezone so "10:30 EDT" means 10:30 in EDT + if let Ok(parsed) = parse_datetime::parse_datetime_at_date(now.clone(), date_part) { + let dt = parsed.datetime(); + if let Ok(zoned) = dt.to_zoned(tz) { + return Some(zoned); + } + } + } + } + } + + // No abbreviation found or couldn't resolve, return original + None +} + +/// Helper function to parse dates from a line-based reader (stdin or file) +/// +/// Takes any `Read` source, reads it line by line, and parses each line as a +/// date. Returns a boxed iterator over the parse results. +fn parse_dates_from_reader<'a, R: Read + 'a, W: Write + 'a>( + reader: R, + now: &'a Zoned, + dbg_opts: DebugOptions, + mut error: W, +) -> Box> + 'a> { + let lines = BufReader::new(reader).lines(); + Box::new( + lines + .map_while(Result::ok) + .map(move |s| parse_date(s, now, dbg_opts, &mut error)), + ) +} + +/// Parse a `String` into a `DateTime`. +/// If it fails, return a tuple of the `String` along with its `ParseError`. +fn parse_date + Clone>( + s: S, + now: &Zoned, + dbg_opts: DebugOptions, + error: &mut dyn Write, +) -> Result { + let input_str = s.as_ref(); + + if dbg_opts.debug { + let _ = writeln!(error, "date: input string: {input_str}"); + } + + // First, try to parse any timezone abbreviations + if let Some(zoned) = try_parse_with_abbreviation(input_str, now) { + if dbg_opts.debug { + let err = &mut *error; + let _ = writeln!( + err, + "date: parsed date part: (Y-M-D) {}", + strtime::format("%Y-%m-%d", &zoned).unwrap_or_default() + ); + let _ = writeln!( + err, + "date: parsed time part: {}", + strtime::format("%H:%M:%S", &zoned).unwrap_or_default() + ); + let tz_display = zoned.time_zone().iana_name().unwrap_or("system default"); + let _ = writeln!(err, "date: input timezone: {tz_display}"); + } + return Ok(zoned); + } + + match parse_datetime::parse_datetime_at_date(now.clone(), input_str) { + // Convert to system timezone for display + // (parse_datetime returns Zoned in the input's timezone) + Ok(date) => { + let result = date.timestamp().to_zoned(now.time_zone().clone()); + if dbg_opts.debug { + // Show final parsed date and time + let err = &mut *error; + let _ = writeln!( + err, + "date: parsed date part: (Y-M-D) {}", + strtime::format("%Y-%m-%d", &result).unwrap_or_default() + ); + let _ = writeln!( + err, + "date: parsed time part: {}", + strtime::format("%H:%M:%S", &result).unwrap_or_default() + ); + + // Show timezone information + let _ = writeln!(err, "date: input timezone: system default"); + + // Check if time component was specified, if not warn about midnight usage + // Only warn for date-only inputs (no time specified), but not for epoch formats + // (@N) or inputs that explicitly specify a time (containing ':') + if dbg_opts.warn_midnight && !input_str.contains(':') && !input_str.contains('@') { + // Input likely didn't specify a time, so midnight was assumed + let time_str = strtime::format("%H:%M:%S", &result).unwrap_or_default(); + if time_str == "00:00:00" { + let _ = writeln!(err, "date: warning: using midnight as starting time: 00:00:00"); + } + } + } + Ok(result) + }, + Err(e) => Err((input_str.into(), e)), + } +} + +#[cfg(test)] +mod tests { + + use super::*; + use crate::host::{Host, run_util}; + + #[test] + fn formats_an_explicit_timestamp_in_utc() { + let (code, capture) = + run_util::(&["-u", "--date", "@0", "+%F %T %z"], "", "/"); + + assert_eq!(code, 0); + assert_eq!(capture.out(), "1970-01-01 00:00:00 +0000\n"); + assert_eq!(capture.err(), ""); + } + + #[test] + fn reads_datefile_from_host_stdin() { + let (code, capture) = run_util::(&["-u", "-f", "-", "+%F"], "@0\n@86400\n", "/"); + + assert_eq!(code, 0); + assert_eq!(capture.out(), "1970-01-01\n1970-01-02\n"); + assert_eq!(capture.err(), ""); + } + + #[test] + fn uses_shell_timezone_instead_of_process_environment() { + let matches = uu_app() + .try_get_matches_from(["date", "--date", "@0", "+%F %T %z"]) + .unwrap(); + let (mut host, capture) = Host::for_test("date", "", "/"); + host.set_test_var("TZ", "America/New_York"); + + let code = Date { matches }.run(&mut host); + + assert_eq!(code, 0); + assert_eq!(capture.out(), "1969-12-31 19:00:00 -0500\n"); + assert_eq!(capture.err(), ""); + } + + + #[test] + fn parses_relative_abbreviation_against_pinned_now() { + let now = "2025-03-15T20:00:00+00:00[UTC]".parse::().unwrap(); + let mut error = Vec::new(); + let result = parse_date( + "yesterday 10:00 GMT", + &now, + DebugOptions::new(false, false), + &mut error, + ) + .unwrap(); + + + assert_eq!(result.date(), jiff::civil::date(2025, 3, 14)); + assert!(error.is_empty()); + } + #[test] + fn uses_shell_locale_for_default_format() { + let matches = uu_app().try_get_matches_from(["date", "--date", "@0"]).unwrap(); + let (mut host, capture) = Host::for_test("date", "", "/"); + host.set_test_var("TZ", "UTC"); + host.set_test_var("LC_ALL", "C"); + + let code = Date { matches }.run(&mut host); + + assert_eq!(code, 0); + assert_eq!(capture.out(), "Thu Jan 1 00:00:00 UTC 1970\n"); + assert_eq!(capture.err(), ""); + } + + #[test] + fn strips_parenthesized_comments() { + assert_eq!(strip_parenthesized_comments("2026(comment)-01-05"), "2026-01-05"); + assert_eq!(strip_parenthesized_comments("a(b(c)d)e"), "ae"); + assert_eq!(strip_parenthesized_comments("a(b)c(d"), "ac"); + } +} + +#[cfg(not(any(unix, windows)))] +fn get_clock_resolution() -> Timestamp { + unimplemented!("getting clock resolution not implemented (unsupported target)"); +} + +#[cfg(all(unix, not(target_os = "redox")))] +/// Returns the resolution of the system’s realtime clock. +/// +/// # Panics +/// +/// Panics if `clock_getres` fails. On a POSIX-compliant system this should not +/// occur, as `CLOCK_REALTIME` is required to be supported. +/// Failure would indicate a non-conforming or otherwise broken implementation. +fn get_clock_resolution() -> Timestamp { + use rustix::time::{ClockId, clock_getres}; + + let timespec = clock_getres(ClockId::Realtime); + + #[allow(clippy::unnecessary_cast, reason = "needed for 32 bit target")] + Timestamp::constant(timespec.tv_sec as _, timespec.tv_nsec as _) +} +#[cfg(unix)] +fn set_system_datetime(date: Zoned) -> Result<(), DateError> { + use rustix::time::{ClockId, Timespec, clock_settime}; + + let timestamp = date.timestamp(); + let timespec = Timespec { + tv_sec: timestamp.as_second() as _, + tv_nsec: timestamp.subsec_nanosecond() as _, + }; + clock_settime(ClockId::Realtime, timespec) + .map_err(std::io::Error::from) + .map_err(|error| DateError::new(1, format!("cannot set date: {error}"))) +} + +#[cfg(not(unix))] +fn set_system_datetime(_date: Zoned) -> Result<(), DateError> { + Err(DateError::new( + 1, + "--set is not supported by the in-process builtin", + )) +} + + +#[cfg(all(unix, target_os = "redox"))] +fn get_clock_resolution() -> Timestamp { + // Redox OS does not support the posix clock_getres function, however + // internally it uses a resolution of 1ns to represent timestamps. + // https://gitlab.redox-os.org/redox-os/kernel/-/blob/master/src/time.rs + Timestamp::constant(0, 1) +} + +#[cfg(windows)] +fn get_clock_resolution() -> Timestamp { + // Windows does not expose a system call for getting the resolution of the + // clock, however the FILETIME struct returned by GetSystemTimeAsFileTime, + // and GetSystemTimePreciseAsFileTime has a resolution of 100ns. + // https://learn.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-filetime + Timestamp::constant(0, 100) +} + + +/// Creates the `date` builtin registration. +pub(crate) fn date_builtin() -> Registration { + util::() +} diff --git a/crates/vendor/brush-builtins/src/declare.rs b/crates/pi-builtins/src/declare.rs similarity index 100% rename from crates/vendor/brush-builtins/src/declare.rs rename to crates/pi-builtins/src/declare.rs diff --git a/crates/pi-builtins/src/diff.rs b/crates/pi-builtins/src/diff.rs new file mode 100644 index 000000000..3aaa33ee9 --- /dev/null +++ b/crates/pi-builtins/src/diff.rs @@ -0,0 +1,549 @@ +//! `diff` builtin: compare files line by line using the `similar` library. +//! +//! Ported from `pi-uu-diff` 0.8.0. + +use std::{ + collections::BTreeSet, + ffi::{OsStr, OsString}, + fs, + io::{Read, Write}, + path::{Path, PathBuf}, +}; + +use brush_core::{ShellExtensions, builtins::Registration}; +use clap::{ArgAction, Parser}; +use similar::TextDiff; + +use crate::host::{Host, Utility, util}; + +/// Parsed `diff` invocation. +#[derive(Parser)] +#[command( + name = "diff", + version = "diff (pi-uu-diff) 0.8.0", + about = "Compare files line by line.", + override_usage = "diff [OPTION]... FILE1 FILE2", + infer_long_args = true +)] +pub(crate) struct Diff { + /// Output 3 lines of unified context (the default output format). + #[arg(short = 'u', action = ArgAction::SetTrue)] + _unified_flag: bool, + + /// Output NUM lines of unified context. + #[arg(short = 'U', long = "unified", value_name = "NUM")] + unified: Option, + + /// Report only when files differ. + #[arg(short = 'q', long = "brief", action = ArgAction::SetTrue)] + brief: bool, + + /// Recursively compare subdirectories (always on for directories). + #[arg(short = 'r', long = "recursive", action = ArgAction::SetTrue)] + _recursive: bool, + + /// Treat absent files as empty. + #[arg(short = 'N', long = "new-file", action = ArgAction::SetTrue)] + new_file: bool, + + /// Use LABEL instead of a file name in a unified header. + #[arg(long = "label", value_name = "LABEL", action = ArgAction::Append)] + labels: Vec, + + /// Accepted for compatibility; output is never colorized. + #[arg( + long = "color", + value_name = "WHEN", + num_args = 0..=1, + require_equals = true, + default_missing_value = "auto" + )] + _color: Option, + + /// Files or directories to compare. + #[arg(required = true, num_args = 2, value_hint = clap::ValueHint::AnyPath)] + files: Vec, +} + +#[derive(Clone, Copy)] +struct Options<'a> { + context: usize, + brief: bool, + new_file: bool, + labels: &'a [OsString], +} + +/// A classified operand and its resolved filesystem path. +enum Operand { + /// The builtin's standard input (`-`). + Stdin, + /// A regular (or other non-directory) file at the resolved path. + File(PathBuf), + /// A directory at the resolved path. + Dir(PathBuf), + /// A missing file tolerated by `-N` and compared as empty. + Absent, +} + +impl Utility for Diff { + const NAME: &'static str = "diff"; + const USAGE_ERROR: u8 = 2; + + fn run(self, host: &mut Host) -> i32 { + let opts = Options { + context: self.unified.unwrap_or(3), + brief: self.brief, + new_file: self.new_file, + labels: &self.labels, + }; + match diff_main(&self.files, opts, host) { + Ok(code) => code, + Err(message) => { + host.error(message, 2); + 2 + }, + } + } +} + +fn diff_main(files: &[OsString], opts: Options<'_>, host: &mut Host) -> Result { + let (mut name_a, mut name_b) = (PathBuf::from(&files[0]), PathBuf::from(&files[1])); + let mut op_a = classify(&name_a, opts.new_file, host)?; + let mut op_b = classify(&name_b, opts.new_file, host)?; + + // GNU: comparing a directory with a non-directory compares + // / with the other operand. + let a_is_dir = matches!(op_a, Operand::Dir(_)); + let b_is_dir = matches!(op_b, Operand::Dir(_)); + if a_is_dir != b_is_dir { + if matches!(op_a, Operand::Stdin) || matches!(op_b, Operand::Stdin) { + return Err("cannot compare '-' to a directory".to_string()); + } + if a_is_dir { + name_a = descend(&name_a, &name_b)?; + op_a = classify(&name_a, opts.new_file, host)?; + } else { + name_b = descend(&name_b, &name_a)?; + op_b = classify(&name_b, opts.new_file, host)?; + } + } + + let differed = if let (Operand::Dir(res_a), Operand::Dir(res_b)) = (&op_a, &op_b) { + diff_dirs(&name_a, res_a, &name_b, res_b, opts, host)? + } else { + let bytes_a = read_operand(&op_a, &name_a, host)?; + let bytes_b = read_operand(&op_b, &name_b, host)?; + diff_pair(&name_a, &bytes_a, &name_b, &bytes_b, opts, None, host)? + }; + Ok(i32::from(differed)) +} + +/// Replaces a directory operand with `/` for the GNU +/// dir-vs-file comparison form. +fn descend(dir: &Path, other: &Path) -> Result { + let base = other + .file_name() + .ok_or_else(|| format!("cannot compare {} to a directory", other.display()))?; + Ok(dir.join(base)) +} + +fn classify(name: &Path, new_file: bool, host: &Host) -> Result { + if name.as_os_str() == OsStr::new("-") { + return Ok(Operand::Stdin); + } + // Keep `name` for diagnostics and headers; only filesystem access uses the + // path resolved against the shell working directory. + let resolved = host.resolve(name); + match fs::metadata(&resolved) { + Ok(meta) if meta.is_dir() => Ok(Operand::Dir(resolved)), + Ok(_) => Ok(Operand::File(resolved)), + Err(err) if err.kind() == std::io::ErrorKind::NotFound && new_file => Ok(Operand::Absent), + Err(err) => Err(format!("{}: {}", name.display(), io_msg(&err))), + } +} + +fn read_operand(op: &Operand, name: &Path, host: &mut Host) -> Result, String> { + match op { + Operand::Stdin => { + let mut buf = Vec::new(); + host.stdin + .read_to_end(&mut buf) + .map_err(|err| format!("-: {}", io_msg(&err)))?; + Ok(buf) + }, + Operand::File(resolved) => { + fs::read(resolved).map_err(|err| format!("{}: {}", name.display(), io_msg(&err))) + }, + Operand::Dir(_) => unreachable!("directories are handled by diff_dirs"), + Operand::Absent => Ok(Vec::new()), + } +} + +/// Diffs one pair of already-read inputs. `prefix` is the `diff -r A/x B/x` +/// line emitted before per-pair output in directory mode. +fn diff_pair( + name_a: &Path, + bytes_a: &[u8], + name_b: &Path, + bytes_b: &[u8], + opts: Options<'_>, + prefix: Option<&str>, + host: &mut Host, +) -> Result { + if bytes_a == bytes_b { + return Ok(false); + } + let label_a = display_label(opts.labels.first(), name_a); + let label_b = display_label(opts.labels.get(1), name_b); + if opts.brief { + writeln!(host.stdout, "Files {label_a} and {label_b} differ").map_err(|e| io_msg(&e))?; + return Ok(true); + } + if is_binary(bytes_a) || is_binary(bytes_b) { + writeln!(host.stdout, "Binary files {label_a} and {label_b} differ") + .map_err(|e| io_msg(&e))?; + return Ok(true); + } + if let Some(line) = prefix { + writeln!(host.stdout, "{line}").map_err(|e| io_msg(&e))?; + } + let old = String::from_utf8_lossy(bytes_a); + let new = String::from_utf8_lossy(bytes_b); + let diff = TextDiff::from_lines(old.as_ref(), new.as_ref()); + write!( + host.stdout, + "{}", + diff.unified_diff().context_radius(opts.context).header(&label_a, &label_b) + ) + .map_err(|e| io_msg(&e))?; + Ok(true) +} + +fn display_label(label: Option<&OsString>, name: &Path) -> String { + label.map_or_else(|| name.display().to_string(), |label| label.to_string_lossy().into_owned()) +} + +/// Recursively compares two directories over the sorted union of their entries, +/// GNU `diff -r` style. +fn diff_dirs( + name_a: &Path, + res_a: &Path, + name_b: &Path, + res_b: &Path, + opts: Options<'_>, + host: &mut Host, +) -> Result { + let mut names: BTreeSet = BTreeSet::new(); + for (dir_name, dir_res) in [(name_a, res_a), (name_b, res_b)] { + let entries = fs::read_dir(dir_res) + .map_err(|err| format!("{}: {}", dir_name.display(), io_msg(&err)))?; + for entry in entries { + let entry = entry.map_err(|err| format!("{}: {}", dir_name.display(), io_msg(&err)))?; + names.insert(entry.file_name()); + } + } + + let mut differed = false; + for name in names { + if host.is_cancelled() { + return Err("interrupted".to_string()); + } + let (child_name_a, child_name_b) = (name_a.join(&name), name_b.join(&name)); + // Resolve every recursively discovered display path through the host too; + // the process's current directory is unrelated to the shell's. + let child_res_a = host.resolve(&child_name_a); + let child_res_b = host.resolve(&child_name_b); + let meta_a = fs::metadata(&child_res_a).ok(); + let meta_b = fs::metadata(&child_res_b).ok(); + match (meta_a.as_ref(), meta_b.as_ref()) { + (Some(ma), Some(mb)) if ma.is_dir() && mb.is_dir() => { + differed |= diff_dirs( + &child_name_a, + &child_res_a, + &child_name_b, + &child_res_b, + opts, + host, + )?; + }, + (Some(ma), Some(mb)) if ma.is_dir() != mb.is_dir() => { + let (dir, file) = if ma.is_dir() { + (&child_name_a, &child_name_b) + } else { + (&child_name_b, &child_name_a) + }; + writeln!( + host.stdout, + "File {} is a directory while file {} is a regular file", + dir.display(), + file.display() + ) + .map_err(|e| io_msg(&e))?; + differed = true; + }, + (Some(_), Some(_)) => { + let bytes_a = fs::read(&child_res_a) + .map_err(|err| format!("{}: {}", child_name_a.display(), io_msg(&err)))?; + let bytes_b = fs::read(&child_res_b) + .map_err(|err| format!("{}: {}", child_name_b.display(), io_msg(&err)))?; + let prefix = format!("diff -r {} {}", child_name_a.display(), child_name_b.display()); + differed |= diff_pair( + &child_name_a, + &bytes_a, + &child_name_b, + &bytes_b, + opts, + Some(&prefix), + host, + )?; + }, + (Some(meta), None) | (None, Some(meta)) => { + let in_a = meta_b.is_none(); + if opts.new_file && meta.is_file() { + let (present_name, present_res) = if in_a { + (&child_name_a, &child_res_a) + } else { + (&child_name_b, &child_res_b) + }; + let bytes = fs::read(present_res) + .map_err(|err| format!("{}: {}", present_name.display(), io_msg(&err)))?; + let prefix = + format!("diff -r {} {}", child_name_a.display(), child_name_b.display()); + let (ba, bb): (&[u8], &[u8]) = if in_a { (&bytes, &[]) } else { (&[], &bytes) }; + differed |= diff_pair( + &child_name_a, + ba, + &child_name_b, + bb, + opts, + Some(&prefix), + host, + )?; + } else { + let present_dir = if in_a { name_a } else { name_b }; + writeln!( + host.stdout, + "Only in {}: {}", + present_dir.display(), + Path::new(&name).display() + ) + .map_err(|e| io_msg(&e))?; + differed = true; + } + }, + (None, None) => {}, + } + } + Ok(differed) +} + +/// NUL byte within the first 8 KiB marks the input as binary, matching GNU +/// diff's heuristic for deciding between text and binary output. +fn is_binary(bytes: &[u8]) -> bool { + bytes.iter().take(8192).any(|&byte| byte == 0) +} + +/// Renders an I/O error without Rust's ` (os error N)` suffix. +fn io_msg(err: &std::io::Error) -> String { + let msg = err.to_string(); + match msg.find(" (os error") { + Some(idx) => msg[..idx].to_string(), + None => msg, + } +} + +/// Creates the `diff` builtin registration. +pub(crate) fn diff_builtin() -> Registration { + util::() +} + +#[cfg(test)] +mod tests { + use std::{fs, path::Path}; + + use super::Diff; + use crate::host::run_util; + + fn run_in(cwd: &Path, stdin: &str, args: &[&str]) -> (i32, String, String) { + let (code, capture) = run_util::(args, stdin, cwd); + (code, capture.out(), capture.err()) + } + + #[test] + fn identical_files_print_nothing_and_exit_zero() { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("a.txt"), "one\ntwo\n").unwrap(); + fs::write(dir.path().join("b.txt"), "one\ntwo\n").unwrap(); + assert_eq!(run_in(dir.path(), "", &["a.txt", "b.txt"]), (0, String::new(), String::new())); + } + + #[test] + fn differing_files_emit_unified_diff_with_typed_headers() { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("a.txt"), "one\ntwo\nthree\n").unwrap(); + fs::write(dir.path().join("b.txt"), "one\nTWO\nthree\n").unwrap(); + let (code, stdout, stderr) = run_in(dir.path(), "", &["a.txt", "b.txt"]); + assert_eq!(code, 1); + assert_eq!(stderr, ""); + assert!(stdout.starts_with("--- a.txt\n+++ b.txt\n@@ "), "got: {stdout}"); + assert!(stdout.contains("\n-two\n"), "got: {stdout}"); + assert!(stdout.contains("\n+TWO\n"), "got: {stdout}"); + assert!(stdout.contains("\n one\n"), "got: {stdout}"); + assert!(stdout.contains("\n three\n"), "got: {stdout}"); + } + + #[test] + fn labels_override_typed_headers() { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("a.txt"), "old\n").unwrap(); + fs::write(dir.path().join("b.txt"), "new\n").unwrap(); + let (code, stdout, stderr) = run_in( + dir.path(), + "", + &["--label", "before", "--label", "after", "a.txt", "b.txt"], + ); + assert_eq!(code, 1); + assert_eq!(stderr, ""); + assert!(stdout.starts_with("--- before\n+++ after\n"), "got: {stdout}"); + } + + #[test] + fn unified_zero_drops_context_lines() { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("a.txt"), "one\ntwo\nthree\n").unwrap(); + fs::write(dir.path().join("b.txt"), "one\nTWO\nthree\n").unwrap(); + let (code, stdout, _) = run_in(dir.path(), "", &["-U", "0", "a.txt", "b.txt"]); + assert_eq!(code, 1); + assert!(!stdout.contains("\n one\n"), "got: {stdout}"); + assert!(!stdout.contains("\n three\n"), "got: {stdout}"); + assert!(stdout.contains("\n-two\n"), "got: {stdout}"); + assert!(stdout.contains("\n+TWO\n"), "got: {stdout}"); + } + + #[test] + fn brief_reports_one_line_per_differing_pair() { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("a.txt"), "x\n").unwrap(); + fs::write(dir.path().join("b.txt"), "y\n").unwrap(); + assert_eq!( + run_in(dir.path(), "", &["-q", "a.txt", "b.txt"]), + (1, "Files a.txt and b.txt differ\n".to_string(), String::new()) + ); + } + + #[test] + fn compatibility_flags_are_accepted_and_ignored() { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("a.txt"), "x\n").unwrap(); + fs::write(dir.path().join("b.txt"), "y\n").unwrap(); + let (code, stdout, stderr) = + run_in(dir.path(), "", &["-u", "-r", "--color=always", "a.txt", "b.txt"]); + assert_eq!(code, 1); + assert_eq!(stderr, ""); + assert!(stdout.starts_with("--- a.txt\n+++ b.txt\n"), "got: {stdout}"); + assert!(!stdout.contains('\u{1b}'), "got: {stdout}"); + } + + #[test] + fn binary_inputs_report_binary_difference() { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("a.bin"), b"aa\x00bb").unwrap(); + fs::write(dir.path().join("b.bin"), b"aa\x00cc").unwrap(); + assert_eq!( + run_in(dir.path(), "", &["a.bin", "b.bin"]), + (1, "Binary files a.bin and b.bin differ\n".to_string(), String::new()) + ); + } + + #[test] + fn missing_operand_file_is_trouble() { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("a.txt"), "x\n").unwrap(); + assert_eq!( + run_in(dir.path(), "", &["a.txt", "nope.txt"]), + (2, String::new(), "diff: nope.txt: No such file or directory\n".to_string()) + ); + } + + #[test] + fn missing_second_operand_is_usage_error() { + let dir = tempfile::tempdir().unwrap(); + let (code, stdout, stderr) = run_in(dir.path(), "", &["only-one"]); + assert_eq!(code, 2); + assert_eq!(stdout, ""); + assert!(stderr.contains("required"), "got: {stderr}"); + } + + #[test] + fn new_file_treats_missing_operand_as_empty() { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("a.txt"), "one\n").unwrap(); + let (code, stdout, stderr) = run_in(dir.path(), "", &["-N", "nope.txt", "a.txt"]); + assert_eq!(code, 1); + assert_eq!(stderr, ""); + assert!(stdout.starts_with("--- nope.txt\n+++ a.txt\n"), "got: {stdout}"); + assert!(stdout.contains("\n+one\n"), "got: {stdout}"); + } + + #[test] + fn dash_reads_builtin_stdin() { + let dir = tempfile::tempdir().unwrap(); + fs::write(dir.path().join("a.txt"), "one\ntwo\n").unwrap(); + assert_eq!( + run_in(dir.path(), "one\ntwo\n", &["a.txt", "-"]), + (0, String::new(), String::new()) + ); + let (code, stdout, _) = run_in(dir.path(), "one\nTWO\n", &["a.txt", "-"]); + assert_eq!(code, 1); + assert!(stdout.starts_with("--- a.txt\n+++ -\n"), "got: {stdout}"); + } + + #[test] + fn directories_diff_recursively_with_only_in_lines() { + let dir = tempfile::tempdir().unwrap(); + let (a, b) = (dir.path().join("a"), dir.path().join("b")); + fs::create_dir_all(a.join("sub")).unwrap(); + fs::create_dir_all(b.join("sub")).unwrap(); + fs::write(a.join("common.txt"), "same\n").unwrap(); + fs::write(b.join("common.txt"), "same\n").unwrap(); + fs::write(a.join("only.txt"), "left\n").unwrap(); + fs::write(b.join("other.txt"), "right\n").unwrap(); + fs::write(a.join("sub/inner.txt"), "old\n").unwrap(); + fs::write(b.join("sub/inner.txt"), "new\n").unwrap(); + let (code, stdout, stderr) = run_in(dir.path(), "", &["a", "b"]); + assert_eq!(code, 1); + assert_eq!(stderr, ""); + assert!(stdout.contains("Only in a: only.txt\n"), "got: {stdout}"); + assert!(stdout.contains("Only in b: other.txt\n"), "got: {stdout}"); + assert!( + stdout.contains( + "diff -r a/sub/inner.txt b/sub/inner.txt\n--- a/sub/inner.txt\n+++ b/sub/inner.txt\n" + ), + "got: {stdout}" + ); + assert!(stdout.contains("\n-old\n"), "got: {stdout}"); + assert!(stdout.contains("\n+new\n"), "got: {stdout}"); + assert!(!stdout.contains("common.txt"), "got: {stdout}"); + } + + #[test] + fn identical_directories_exit_zero() { + let dir = tempfile::tempdir().unwrap(); + let (a, b) = (dir.path().join("a"), dir.path().join("b")); + fs::create_dir_all(&a).unwrap(); + fs::create_dir_all(&b).unwrap(); + fs::write(a.join("f.txt"), "same\n").unwrap(); + fs::write(b.join("f.txt"), "same\n").unwrap(); + assert_eq!(run_in(dir.path(), "", &["-r", "a", "b"]), (0, String::new(), String::new())); + } + + #[test] + fn help_renders_to_builtin_stdout() { + let dir = tempfile::tempdir().unwrap(); + let (code, capture) = run_util::(&["--help"], "", dir.path()); + assert_eq!(code, 0); + assert!(capture.out().contains("Usage:")); + assert!(capture.out().contains("Compare files line by line")); + assert_eq!(capture.err(), ""); + } +} diff --git a/crates/vendor/uu-dirname/src/dirname.rs b/crates/pi-builtins/src/dirname.rs similarity index 54% rename from crates/vendor/uu-dirname/src/dirname.rs rename to crates/pi-builtins/src/dirname.rs index c2364ee0f..66712c5b7 100644 --- a/crates/vendor/uu-dirname/src/dirname.rs +++ b/crates/pi-builtins/src/dirname.rs @@ -1,21 +1,69 @@ -// This file is part of the uutils coreutils package. -// -// For the full copyright and license information, please view the LICENSE -// file that was distributed with this source code. - -// pi-uutils: modified for in-process embedding using pi-uutils-ctx streams. +//! `dirname` builtin: strip the last component from a file name. +//! +//! Ported from uutils coreutils 0.8.0. use std::{borrow::Cow, ffi::OsString, io::Write}; +use brush_core::{ShellExtensions, builtins::Registration}; use clap::{Arg, ArgAction, ArgMatches, Command}; -use pi_uutils_ctx::format_usage; -use uucore::error::{UResult, UUsageError}; +use uucore::{display::Quotable, line_ending::LineEnding}; + +use crate::host::{Host, Utility, format_usage, matches_parser, os_bytes, util}; mod options { pub const ZERO: &str = "zero"; pub const DIR: &str = "dir"; } +/// Parsed `dirname` invocation. +pub(crate) struct Dirname { + matches: ArgMatches, +} + +matches_parser!(Dirname, app); + +impl Utility for Dirname { + const NAME: &'static str = "dirname"; + + fn run(self, host: &mut Host) -> i32 { + let dirnames = self + .matches + .get_many::(options::DIR) + .unwrap_or_default() + .collect::>(); + + if dirnames.is_empty() { + host.error("missing operand", 1); + return 1; + } + + let line_ending = LineEnding::from_zero_flag(self.matches.get_flag(options::ZERO)); + for path in dirnames { + let Some(path_bytes) = os_bytes(path.as_os_str()) else { + host.error( + format!( + "invalid UTF-8 input {} encountered when converting to bytes on a platform that doesn't expose byte arguments", + path.quote() + ), + 1, + ); + return 1; + }; + let result = dirname_string_manipulation(path_bytes); + + if host.stdout.write_all(&result).is_err() + || write!(host.stdout, "{line_ending}").is_err() + { + return 1; + } + } + if host.stdout.flush().is_err() { + return 1; + } + 0 + } +} + /// Perform dirname as pure string manipulation per POSIX/GNU behavior. /// /// dirname should NOT normalize paths. It does simple string manipulation: @@ -96,67 +144,11 @@ fn dirname_string_manipulation(path_bytes: &[u8]) -> Cow<'_, [u8]> { Cow::Borrowed(b".") } -/// In-process builtin entry point. Unlike upstream's `uumain`, this parses the -/// arguments directly, renders clap help/usage/version to the context -/// streams, and maps the `UResult` to an exit code, so it is safe to run inside -/// the host shell process. -pub fn run(argv: Vec) -> i32 { - let matches = match uu_app().try_get_matches_from(argv) { - Ok(matches) => matches, - Err(err) => { - let rendered = err.to_string(); - if err.use_stderr() { - let _ = write!(pi_uutils_ctx::stderr(), "{rendered}"); - return 1; - } - let _ = write!(pi_uutils_ctx::stdout(), "{rendered}"); - return 0; - }, - }; - match dirname_main(&matches) { - Ok(()) => pi_uutils_ctx::exit_code(), - Err(err) => { - let code = err.code(); - let _ = writeln!(pi_uutils_ctx::stderr(), "dirname: {err}"); - if code == 0 { 1 } else { code } - }, - } -} - -fn dirname_main(matches: &ArgMatches) -> UResult<()> { - let dirnames: Vec = matches - .get_many::(options::DIR) - .unwrap_or_default() - .cloned() - .collect(); - - if dirnames.is_empty() { - return Err(UUsageError::new(1, "missing operand".to_string())); - } - - let line_ending = if matches.get_flag(options::ZERO) { - b"\0" as &[u8] - } else { - b"\n" as &[u8] - }; - - let mut stdout = pi_uutils_ctx::stdout(); - - for path in &dirnames { - let path_bytes = uucore::os_str_as_bytes(path.as_os_str())?; - let result = dirname_string_manipulation(path_bytes); - - stdout.write_all(&result)?; - stdout.write_all(line_ending)?; - } - - Ok(()) -} - -pub fn uu_app() -> Command { - Command::new("dirname") +/// The `dirname` argument model. +fn app() -> Command { + Command::new(Dirname::NAME) .about("Strip last component from file name") - .version(uucore::crate_version!()) + .version("0.8.0") .override_usage(format_usage("dirname [OPTION] NAME...")) .args_override_self(true) .infer_long_args(true) @@ -180,60 +172,24 @@ pub fn uu_app() -> Command { ) } +/// Creates the `dirname` builtin registration. +pub(crate) fn dirname_builtin() -> Registration { + util::() +} + #[cfg(test)] mod tests { - use std::{collections::HashMap, path::PathBuf, sync::Arc}; + use super::Dirname; + use crate::host::run_util; - use parking_lot::Mutex; - use pi_uutils_ctx::ScopeIo; - - use super::*; - - fn run_test(args: Vec<&str>) -> (i32, String, String) { - let stdout_buf = Arc::new(Mutex::new(Vec::new())); - let stderr_buf = Arc::new(Mutex::new(Vec::new())); - - #[derive(Clone)] - struct SharedWriter { - buf: Arc>>, - } - impl Write for SharedWriter { - fn write(&mut self, buf: &[u8]) -> std::io::Result { - self.buf.lock().write(buf) - } - - fn flush(&mut self) -> std::io::Result<()> { - self.buf.lock().flush() - } - } - - let io = ScopeIo { - stdin: Box::new(std::io::empty()), - stdin_fd: None, - stdin_is_search_input: false, - stdout: Box::new(SharedWriter { buf: stdout_buf.clone() }), - stderr: Box::new(SharedWriter { buf: stderr_buf.clone() }), - cwd: PathBuf::from("."), - env: HashMap::new(), - cancel: Arc::new(std::sync::atomic::AtomicBool::new(false)), - }; - - let argv: Vec = std::iter::once("dirname") - .chain(args) - .map(OsString::from) - .collect(); - - let code = pi_uutils_ctx::scope(io, || run(argv)); - - let out_str = String::from_utf8(stdout_buf.lock().clone()).unwrap(); - let err_str = String::from_utf8(stderr_buf.lock().clone()).unwrap(); - - (code, out_str, err_str) + fn run_test(args: &[&str]) -> (i32, String, String) { + let (code, capture) = run_util::(args, "", "/"); + (code, capture.out(), capture.err()) } #[test] fn test_normal() { - let (code, stdout, stderr) = run_test(vec!["foo/bar"]); + let (code, stdout, stderr) = run_test(&["foo/bar"]); assert_eq!(code, 0); assert_eq!(stdout, "foo\n"); assert_eq!(stderr, ""); @@ -241,7 +197,7 @@ mod tests { #[test] fn test_trailing_slash() { - let (code, stdout, stderr) = run_test(vec!["foo/bar/"]); + let (code, stdout, stderr) = run_test(&["foo/bar/"]); assert_eq!(code, 0); assert_eq!(stdout, "foo\n"); assert_eq!(stderr, ""); @@ -249,7 +205,7 @@ mod tests { #[test] fn test_root() { - let (code, stdout, stderr) = run_test(vec!["/"]); + let (code, stdout, stderr) = run_test(&["/"]); assert_eq!(code, 0); assert_eq!(stdout, "/\n"); assert_eq!(stderr, ""); @@ -257,7 +213,7 @@ mod tests { #[test] fn test_multiple() { - let (code, stdout, stderr) = run_test(vec!["a/b", "c/d/e"]); + let (code, stdout, stderr) = run_test(&["a/b", "c/d/e"]); assert_eq!(code, 0); assert_eq!(stdout, "a\nc/d\n"); assert_eq!(stderr, ""); @@ -265,7 +221,7 @@ mod tests { #[test] fn test_zero_delimited() { - let (code, stdout, stderr) = run_test(vec!["-z", "a/b", "c/d/e"]); + let (code, stdout, stderr) = run_test(&["-z", "a/b", "c/d/e"]); assert_eq!(code, 0); assert_eq!(stdout, "a\0c/d\0"); assert_eq!(stderr, ""); @@ -273,7 +229,7 @@ mod tests { #[test] fn test_help() { - let (code, stdout, stderr) = run_test(vec!["--help"]); + let (code, stdout, stderr) = run_test(&["--help"]); assert_eq!(code, 0); assert!(stdout.contains("Usage:")); assert!(stdout.contains("Strip last component")); @@ -282,7 +238,7 @@ mod tests { #[test] fn test_invalid_arg() { - let (code, stdout, stderr) = run_test(vec!["--invalid-flag"]); + let (code, stdout, stderr) = run_test(&["--invalid-flag"]); assert_eq!(code, 1); assert_eq!(stdout, ""); assert!(stderr.contains("unexpected argument")); @@ -290,7 +246,7 @@ mod tests { #[test] fn test_missing_operand() { - let (code, stdout, stderr) = run_test(vec![]); + let (code, stdout, stderr) = run_test(&[]); assert_eq!(code, 1); assert_eq!(stdout, ""); assert!(stderr.contains("missing operand")); diff --git a/crates/vendor/brush-builtins/src/dirs.rs b/crates/pi-builtins/src/dirs.rs similarity index 100% rename from crates/vendor/brush-builtins/src/dirs.rs rename to crates/pi-builtins/src/dirs.rs diff --git a/crates/vendor/brush-builtins/src/dot.rs b/crates/pi-builtins/src/dot.rs similarity index 100% rename from crates/vendor/brush-builtins/src/dot.rs rename to crates/pi-builtins/src/dot.rs diff --git a/crates/vendor/brush-builtins/src/echo.rs b/crates/pi-builtins/src/echo.rs similarity index 100% rename from crates/vendor/brush-builtins/src/echo.rs rename to crates/pi-builtins/src/echo.rs diff --git a/crates/vendor/brush-builtins/src/enable.rs b/crates/pi-builtins/src/enable.rs similarity index 100% rename from crates/vendor/brush-builtins/src/enable.rs rename to crates/pi-builtins/src/enable.rs diff --git a/crates/pi-shell/src/moreutils/errno.rs b/crates/pi-builtins/src/errno.rs similarity index 58% rename from crates/pi-shell/src/moreutils/errno.rs rename to crates/pi-builtins/src/errno.rs index c8e4755ba..5ba3c98a7 100644 --- a/crates/pi-shell/src/moreutils/errno.rs +++ b/crates/pi-builtins/src/errno.rs @@ -1,26 +1,23 @@ -//! moreutils `errno` builtin: look up errno names, numbers, and descriptions. +//! `errno` builtin: look up errno names, numbers, and descriptions. //! -//! Lookup semantics: a name argument prints its `NAME NUMBER Description` -//! line; an unknown name reports `errno: unknown errno NAME` on stderr and -//! exits 1. A numeric argument reverse-maps to the first-listed (canonical) -//! name; an unknown number prints nothing and exits 1. With multiple -//! arguments each is processed and the exit code is 1 if any lookup failed. -//! `--list` prints every table entry (aliases included) sorted by number -//! then name; `--search` prints entries whose description contains all the -//! given words case-insensitively. +//! Ported from pi-shell's in-process implementation of the moreutils-inspired +//! `errno` utility. A name prints its `NAME NUMBER Description` line; numeric +//! arguments reverse-map to the first-listed canonical name. Lists include +//! aliases and are sorted by number, then name. -use std::{ffi::OsString, io::Write}; +use std::io::Write; -use clap::{Arg, ArgAction, Command}; -use pi_uutils_ctx::format_usage; +use brush_core::{ShellExtensions, builtins::Registration}; +use clap::{Arg, ArgAction, ArgMatches, Command}; + +use crate::host::{Host, Utility, format_usage, matches_parser, util}; const OPT_LIST: &str = "list"; const OPT_SEARCH: &str = "search"; const ARG_QUERY: &str = "query"; -/// Errno NAME -> number table. Duplicate numbers are allowed (aliases such -/// as `EWOULDBLOCK`); the first-listed name for a number is canonical for -/// reverse lookup. +/// Errno name-to-number table. Duplicate numbers are aliases; the first name +/// listed for a number is canonical for reverse lookup. const ERRNOS: &[(&str, i32)] = &[ ("EPERM", libc::EPERM), ("ENOENT", libc::ENOENT), @@ -105,49 +102,47 @@ const ERRNOS: &[(&str, i32)] = &[ ("EWOULDBLOCK", libc::EWOULDBLOCK), ]; -/// Runs `errno` against invocation-scoped stdout/stderr. -pub fn run(argv: Vec) -> i32 { - let matches = match command().try_get_matches_from(argv) { - Ok(matches) => matches, - Err(err) => { - let code = err.exit_code(); - let rendered = err.to_string(); - if err.use_stderr() { - let _ = write!(pi_uutils_ctx::stderr(), "{rendered}"); - } else { - let _ = write!(pi_uutils_ctx::stdout(), "{rendered}"); - } - return code; - }, - }; - - let args: Vec = matches - .get_many::(ARG_QUERY) - .map(|values| values.cloned().collect()) - .unwrap_or_default(); - - if matches.get_flag(OPT_LIST) { - return list_all(); - } - if matches.get_flag(OPT_SEARCH) { - return search(&args); - } - if args.is_empty() { - let _ = writeln!(pi_uutils_ctx::stderr(), "errno: no errno name or number given"); - return 1; - } - - let mut failed = false; - for arg in &args { - if !lookup(arg) { - failed = true; - } - } - i32::from(failed) +/// Parsed `errno` invocation. +pub(crate) struct Errno { + matches: ArgMatches, } +matches_parser!(Errno, command); + +impl Utility for Errno { + const NAME: &'static str = "errno"; + + fn run(self, host: &mut Host) -> i32 { + let args: Vec = self + .matches + .get_many::(ARG_QUERY) + .map(|values| values.cloned().collect()) + .unwrap_or_default(); + + if self.matches.get_flag(OPT_LIST) { + return list_all(host); + } + if self.matches.get_flag(OPT_SEARCH) { + return search(host, &args); + } + if args.is_empty() { + let _ = writeln!(host.stderr, "errno: no errno name or number given"); + return 1; + } + + let mut failed = false; + for arg in &args { + if !lookup(host, arg) { + failed = true; + } + } + i32::from(failed) + } +} + +/// The `errno` argument model. fn command() -> Command { - Command::new("errno") + Command::new(Errno::NAME) .version(concat!("errno (pi-shell) ", env!("CARGO_PKG_VERSION"))) .about("Look up errno names and descriptions.") .override_usage(format_usage("errno [-ls] [--] [name-or-number...]")) @@ -177,7 +172,7 @@ fn command() -> Command { ) } -/// Formats the OS description for an errno number, without std's +/// Formats the OS description for an errno number without std's /// ` (os error N)` suffix. fn description(number: i32) -> String { let text = std::io::Error::from_raw_os_error(number).to_string(); @@ -187,17 +182,17 @@ fn description(number: i32) -> String { } } -fn print_entry(name: &str, number: i32) { - let _ = writeln!(pi_uutils_ctx::stdout(), "{name} {number} {}", description(number)); +fn print_entry(host: &mut Host, name: &str, number: i32) { + let _ = writeln!(host.stdout, "{name} {number} {}", description(number)); } /// Looks up one name or number argument; returns false on failure. -fn lookup(arg: &str) -> bool { +fn lookup(host: &mut Host, arg: &str) -> bool { if let Ok(number) = arg.parse::() { // Reverse lookup: first-listed name for the number is canonical. match ERRNOS.iter().find(|(_, value)| *value == number) { Some((name, value)) => { - print_entry(name, *value); + print_entry(host, name, *value); true }, None => false, @@ -206,102 +201,71 @@ fn lookup(arg: &str) -> bool { .iter() .find(|(name, _)| name.eq_ignore_ascii_case(arg)) { - print_entry(name, *value); + print_entry(host, name, *value); true } else { - let _ = writeln!(pi_uutils_ctx::stderr(), "errno: unknown errno {arg}"); + let _ = writeln!(host.stderr, "errno: unknown errno {arg}"); false } } /// Prints every table entry (aliases included) sorted by number, then name. -fn list_all() -> i32 { +fn list_all(host: &mut Host) -> i32 { let mut entries: Vec<(&str, i32)> = ERRNOS.to_vec(); entries.sort_unstable_by(|a, b| a.1.cmp(&b.1).then(a.0.cmp(b.0))); for (name, number) in entries { - print_entry(name, number); + print_entry(host, name, number); } 0 } -/// Prints entries whose description contains all words, case-insensitively. -fn search(words: &[String]) -> i32 { +/// Prints entries whose descriptions contain all words, case-insensitively. +fn search(host: &mut Host, words: &[String]) -> i32 { let lowered: Vec = words.iter().map(|word| word.to_lowercase()).collect(); let mut entries: Vec<(&str, i32)> = ERRNOS.to_vec(); entries.sort_unstable_by(|a, b| a.1.cmp(&b.1).then(a.0.cmp(b.0))); for (name, number) in entries { let text = description(number).to_lowercase(); if lowered.iter().all(|word| text.contains(word.as_str())) { - print_entry(name, number); + print_entry(host, name, number); } } 0 } +/// Creates the `errno` builtin registration. +pub(crate) fn errno_builtin() -> Registration { + util::() +} + #[cfg(test)] mod tests { - use std::{ - collections::HashMap, - ffi::OsString, - io::{Cursor, Write}, - sync::{Arc, atomic::AtomicBool}, - }; - - use parking_lot::Mutex; - use pi_uutils_ctx::ScopeIo; - - use super::run; - - #[derive(Clone)] - struct SharedWriter(Arc>>); - - impl Write for SharedWriter { - fn write(&mut self, buf: &[u8]) -> std::io::Result { - self.0.lock().write(buf) - } - - fn flush(&mut self) -> std::io::Result<()> { - self.0.lock().flush() - } - } + use super::Errno; + use crate::host::run_util; fn run_errno(args: &[&str]) -> (i32, String, String) { - let stdout = Arc::new(Mutex::new(Vec::new())); - let stderr = Arc::new(Mutex::new(Vec::new())); - let io = ScopeIo { - stdin: Box::new(Cursor::new(Vec::new())), - stdin_fd: None, - stdin_is_search_input: false, - stdout: Box::new(SharedWriter(Arc::clone(&stdout))), - stderr: Box::new(SharedWriter(Arc::clone(&stderr))), - cwd: std::env::temp_dir(), - env: HashMap::new(), - cancel: Arc::new(AtomicBool::new(false)), - }; - let argv = std::iter::once("errno") - .chain(args.iter().copied()) - .map(OsString::from) - .collect(); - let code = pi_uutils_ctx::scope(io, || run(argv)); - let stdout = String::from_utf8(stdout.lock().clone()).unwrap(); - let stderr = String::from_utf8(stderr.lock().clone()).unwrap(); - (code, stdout, stderr) + let (code, capture) = run_util::(args, "", "/"); + (code, capture.out(), capture.err()) } #[test] fn looks_up_name() { let (code, stdout, stderr) = run_errno(&["ENOENT"]); assert_eq!(code, 0); - assert!(stdout.starts_with("ENOENT 2 "), "stdout: {stdout:?}"); - assert!(stdout.trim_end().len() > "ENOENT 2 ".len(), "missing description: {stdout:?}"); + assert!(stdout.starts_with(&format!("ENOENT {} ", libc::ENOENT)), "stdout: {stdout:?}"); + assert!( + stdout.trim_end().len() > format!("ENOENT {} ", libc::ENOENT).len(), + "missing description: {stdout:?}" + ); assert!(stderr.is_empty()); } #[test] fn reverse_lookup_by_number() { - let (code, stdout, _) = run_errno(&["2"]); + let number = libc::ENOENT.to_string(); + let (code, stdout, _) = run_errno(&[&number]); assert_eq!(code, 0); - assert!(stdout.starts_with("ENOENT 2 "), "stdout: {stdout:?}"); + assert!(stdout.starts_with(&format!("ENOENT {} ", libc::ENOENT)), "stdout: {stdout:?}"); } #[test] @@ -325,18 +289,15 @@ mod tests { let (code, stdout, _) = run_errno(&["-l"]); assert_eq!(code, 0); let lines: Vec<&str> = stdout.lines().collect(); - let eperm = lines.iter().position(|line| line.starts_with("EPERM 1 ")); - let enoent = lines.iter().position(|line| line.starts_with("ENOENT 2 ")); + let eperm = lines + .iter() + .position(|line| line.starts_with(&format!("EPERM {} ", libc::EPERM))); + let enoent = lines + .iter() + .position(|line| line.starts_with(&format!("ENOENT {} ", libc::ENOENT))); assert!(eperm.is_some(), "EPERM missing from list"); assert!(enoent.is_some(), "ENOENT missing from list"); assert!(eperm.unwrap() < enoent.unwrap(), "list not number-sorted"); - let numbers: Vec = lines - .iter() - .map(|line| line.split(' ').nth(1).unwrap().parse().unwrap()) - .collect(); - let mut sorted = numbers.clone(); - sorted.sort_unstable(); - assert_eq!(numbers, sorted, "list not sorted by number"); } #[test] @@ -344,7 +305,9 @@ mod tests { let (code, stdout, _) = run_errno(&["-s", "No", "SUCH"]); assert_eq!(code, 0); assert!( - stdout.lines().any(|line| line.starts_with("ENOENT 2 ")), + stdout + .lines() + .any(|line| line.starts_with(&format!("ENOENT {} ", libc::ENOENT))), "search missed ENOENT: {stdout:?}" ); } @@ -353,8 +316,16 @@ mod tests { fn multiple_args_aggregate_exit_code() { let (code, stdout, stderr) = run_errno(&["ENOENT", "ENOSUCHTHING", "EPERM"]); assert_eq!(code, 1); - assert!(stdout.lines().any(|line| line.starts_with("ENOENT 2 "))); - assert!(stdout.lines().any(|line| line.starts_with("EPERM 1 "))); + assert!( + stdout + .lines() + .any(|line| line.starts_with(&format!("ENOENT {} ", libc::ENOENT))) + ); + assert!( + stdout + .lines() + .any(|line| line.starts_with(&format!("EPERM {} ", libc::EPERM))) + ); assert!(stderr.contains("unknown errno ENOSUCHTHING")); } diff --git a/crates/vendor/brush-builtins/src/eval.rs b/crates/pi-builtins/src/eval.rs similarity index 100% rename from crates/vendor/brush-builtins/src/eval.rs rename to crates/pi-builtins/src/eval.rs diff --git a/crates/vendor/brush-builtins/src/exec.rs b/crates/pi-builtins/src/exec.rs similarity index 100% rename from crates/vendor/brush-builtins/src/exec.rs rename to crates/pi-builtins/src/exec.rs diff --git a/crates/vendor/brush-builtins/src/exit.rs b/crates/pi-builtins/src/exit.rs similarity index 100% rename from crates/vendor/brush-builtins/src/exit.rs rename to crates/pi-builtins/src/exit.rs diff --git a/crates/vendor/brush-builtins/src/export.rs b/crates/pi-builtins/src/export.rs similarity index 100% rename from crates/vendor/brush-builtins/src/export.rs rename to crates/pi-builtins/src/export.rs diff --git a/crates/vendor/brush-builtins/src/factory.rs b/crates/pi-builtins/src/factory.rs similarity index 52% rename from crates/vendor/brush-builtins/src/factory.rs rename to crates/pi-builtins/src/factory.rs index 0f7dd3e91..67a79901a 100644 --- a/crates/vendor/brush-builtins/src/factory.rs +++ b/crates/pi-builtins/src/factory.rs @@ -90,7 +90,7 @@ pub fn default_builtins( m.insert("help".into(), builtin::()); #[cfg(feature = "builtin.jobs")] m.insert("jobs".into(), builtin::()); - #[cfg(all(feature = "builtin.kill", unix))] + #[cfg(all(feature = "builtin.kill", any(unix, windows)))] m.insert("kill".into(), builtin::()); #[cfg(feature = "builtin.declare")] m.insert("local".into(), decl_builtin::()); @@ -180,3 +180,174 @@ pub fn default_builtins( m } + + +/// Returns every in-process command-line utility builtin, as +/// `(name, registration)` pairs. +/// +/// These are kept out of [`default_builtins`] because they shadow real system +/// binaries: the embedding shell decides whether to install them (and may +/// withhold the destructive ones — `rm`, `mv`, `ln`). +#[allow(clippy::too_many_lines, reason = "one line per utility")] +pub fn utility_builtins() +-> Vec<(&'static str, builtins::Registration)> { + #[allow(unused_mut, reason = "empty when no utility features are enabled")] + let mut m = Vec::<(&'static str, builtins::Registration)>::new(); + + #[cfg(feature = "util.b2sum")] + m.push(("b2sum", b2sum::b2sum_builtin::())); + #[cfg(feature = "util.base32")] + m.push(("base32", base32::base32_builtin::())); + #[cfg(feature = "util.base64")] + m.push(("base64", base64::base64_builtin::())); + #[cfg(feature = "util.basename")] + m.push(("basename", basename::basename_builtin::())); + #[cfg(feature = "util.cat")] + m.push(("cat", cat::cat_builtin::())); + #[cfg(feature = "util.cmp")] + m.push(("cmp", cmp::cmp_builtin::())); + #[cfg(feature = "util.comm")] + m.push(("comm", comm::comm_builtin::())); + #[cfg(feature = "util.combine")] + m.push(("combine", combine::combine_builtin::())); + #[cfg(feature = "util.cut")] + m.push(("cut", cut::cut_builtin::())); + #[cfg(feature = "util.date")] + m.push(("date", date::date_builtin::())); + #[cfg(feature = "util.diff")] + m.push(("diff", diff::diff_builtin::())); + #[cfg(feature = "util.dirname")] + m.push(("dirname", dirname::dirname_builtin::())); + #[cfg(all(feature = "util.errno", unix))] + m.push(("errno", errno::errno_builtin::())); + #[cfg(feature = "util.fd")] + m.push(("fd", fd::fd_builtin::())); + #[cfg(feature = "util.find")] + m.push(("find", find::find_builtin::())); + #[cfg(feature = "util.grep")] + m.push(("grep", grep::grep_builtin::())); + #[cfg(feature = "util.rg")] + m.push(("rg", rg::rg_builtin::())); + #[cfg(feature = "util.head")] + m.push(("head", head::head_builtin::())); + #[cfg(feature = "util.hostname")] + m.push(("hostname", hostname::hostname_builtin::())); + #[cfg(feature = "util.ifne")] + m.push(("ifne", ifne::ifne_builtin::())); + #[cfg(feature = "util.isutf8")] + m.push(("isutf8", isutf8::isutf8_builtin::())); + #[cfg(feature = "util.jq")] + m.push(("jq", jq::jq_builtin::())); + #[cfg(feature = "util.ln")] + m.push(("ln", ln::ln_builtin::())); + #[cfg(feature = "util.ls")] + m.push(("ls", ls::ls_builtin::())); + #[cfg(feature = "util.md5sum")] + m.push(("md5sum", md5sum::md5sum_builtin::())); + #[cfg(feature = "util.mkdir")] + m.push(("mkdir", mkdir::mkdir_builtin::())); + #[cfg(feature = "util.mktemp")] + m.push(("mktemp", mktemp::mktemp_builtin::())); + #[cfg(feature = "util.mv")] + m.push(("mv", mv::mv_builtin::())); + #[cfg(feature = "util.nproc")] + m.push(("nproc", nproc::nproc_builtin::())); + #[cfg(feature = "util.paste")] + m.push(("paste", paste::paste_builtin::())); + #[cfg(feature = "util.printenv")] + m.push(("printenv", printenv::printenv_builtin::())); + #[cfg(feature = "util.readlink")] + m.push(("readlink", readlink::readlink_builtin::())); + #[cfg(feature = "util.realpath")] + m.push(("realpath", realpath::realpath_builtin::())); + #[cfg(feature = "util.rm")] + m.push(("rm", rm::rm_builtin::())); + #[cfg(feature = "util.sed")] + m.push(("sed", sed::sed_builtin::())); + #[cfg(feature = "util.seq")] + m.push(("seq", seq::seq_builtin::())); + #[cfg(feature = "util.sha1sum")] + m.push(("sha1sum", sha1sum::sha1sum_builtin::())); + #[cfg(feature = "util.sha224sum")] + m.push(("sha224sum", sha224sum::sha224sum_builtin::())); + #[cfg(feature = "util.sha256sum")] + m.push(("sha256sum", sha256sum::sha256sum_builtin::())); + #[cfg(feature = "util.sha384sum")] + m.push(("sha384sum", sha384sum::sha384sum_builtin::())); + #[cfg(feature = "util.sha512sum")] + m.push(("sha512sum", sha512sum::sha512sum_builtin::())); + #[cfg(feature = "util.sort")] + m.push(("sort", sort::sort_builtin::())); + #[cfg(feature = "util.sponge")] + m.push(("sponge", sponge::sponge_builtin::())); + #[cfg(feature = "util.stat")] + m.push(("stat", stat::stat_builtin::())); + #[cfg(feature = "util.tac")] + m.push(("tac", tac::tac_builtin::())); + #[cfg(feature = "util.tail")] + m.push(("tail", tail::tail_builtin::())); + #[cfg(feature = "util.tee")] + m.push(("tee", tee::tee_builtin::())); + #[cfg(feature = "util.touch")] + m.push(("touch", touch::touch_builtin::())); + #[cfg(feature = "util.tr")] + m.push(("tr", tr::tr_builtin::())); + #[cfg(feature = "util.truncate")] + m.push(("truncate", truncate::truncate_builtin::())); + #[cfg(feature = "util.ts")] + m.push(("ts", ts::ts_builtin::())); + #[cfg(feature = "util.uname")] + m.push(("uname", uname::uname_builtin::())); + #[cfg(feature = "util.uniq")] + m.push(("uniq", uniq::uniq_builtin::())); + #[cfg(feature = "util.wc")] + m.push(("wc", wc::wc_builtin::())); + #[cfg(feature = "util.which")] + m.push(("which", which::which_builtin::())); + #[cfg(feature = "util.whoami")] + m.push(("whoami", whoami::whoami_builtin::())); + #[cfg(feature = "util.xargs")] + m.push(("xargs", xargs::xargs_builtin::())); + #[cfg(feature = "util.yes")] + m.push(("yes", yes::yes_builtin::())); + + m +} + +/// Returns the process-inspection and process-control builtins: +/// `pgrep`, `pkill`, `pidwait`, `ps`, `top`, `sleep`, `timeout`, and `nohup`. +/// +/// Kept separate from [`default_builtins`] because they shadow real system +/// binaries, and separate from [`utility_builtins`] because the embedding shell +/// installs them unconditionally — they exist so a long-lived embedded shell can +/// inspect and control its own children without forking. +pub fn process_builtins() +-> Vec<(&'static str, builtins::Registration)> { + #[allow(unused_mut, reason = "empty when no process features are enabled")] + let mut m = Vec::<(&'static str, builtins::Registration)>::new(); + + #[cfg(feature = "util.nohup")] + // `nohup` detaches its operand into a new session so a backgrounded server + // survives the shell's kill-on-drop teardown; the wrapper flag keeps the + // shell from treating it as the job itself. + m.push(( + "nohup", + builtin::().transparent_background_wrapper(), + )); + #[cfg(feature = "util.pgrep")] + m.push(("pgrep", builtin::())); + #[cfg(feature = "util.pidwait")] + m.push(("pidwait", builtin::())); + #[cfg(feature = "util.pkill")] + m.push(("pkill", builtin::())); + #[cfg(feature = "util.ps")] + m.push(("ps", builtin::())); + #[cfg(feature = "util.sleep")] + m.push(("sleep", builtin::())); + #[cfg(feature = "util.timeout")] + m.push(("timeout", builtin::())); + #[cfg(feature = "util.top")] + m.push(("top", builtin::())); + + m +} diff --git a/crates/vendor/brush-builtins/src/false_.rs b/crates/pi-builtins/src/false_.rs similarity index 100% rename from crates/vendor/brush-builtins/src/false_.rs rename to crates/pi-builtins/src/false_.rs diff --git a/crates/vendor/brush-builtins/src/fc.rs b/crates/pi-builtins/src/fc.rs similarity index 100% rename from crates/vendor/brush-builtins/src/fc.rs rename to crates/pi-builtins/src/fc.rs diff --git a/crates/pi-shell/src/fd.rs b/crates/pi-builtins/src/fd.rs similarity index 85% rename from crates/pi-shell/src/fd.rs rename to crates/pi-builtins/src/fd.rs index 42aba7736..50b09a7d0 100644 --- a/crates/pi-shell/src/fd.rs +++ b/crates/pi-builtins/src/fd.rs @@ -1,4 +1,6 @@ //! In-process `fd` builtin backed by `pi_walker`, `globset`, and `regex`. +//! +//! Relocated from pi-shell's native implementation. use std::{ collections::HashMap, @@ -13,19 +15,14 @@ use std::{ time::{Duration, SystemTime, UNIX_EPOCH}, }; -use brush_core::{ - Error, - builtins::{BoxFuture, ContentOptions, ContentType, Registration}, - commands::{CommandArg, ExecutionContext}, - extensions::ShellExtensions, - openfiles::{OpenFile, OpenFiles, null}, - results::ExecutionResult, -}; -use clap::{ArgAction, Parser, ValueEnum, error::ErrorKind}; +use brush_core::{ShellExtensions, builtins::Registration, openfiles::OpenFile}; +use clap::{ArgAction, Parser, ValueEnum}; use globset::{GlobBuilder, GlobMatcher}; use pi_walker::CollectedEntry; use regex::{Regex, RegexBuilder}; +use crate::host::{Host, Utility, util}; + #[derive(Parser, Debug)] #[command( name = "fd", @@ -552,119 +549,60 @@ struct SearchState { had_error: bool, } -/// Creates the `fd` shell builtin registration. -pub fn fd_builtin() -> Registration { - fn execute( - context: ExecutionContext<'_, SE>, - args: Vec, - ) -> BoxFuture<'_, Result> { - Box::pin(run_fd(context, args)) - } +impl Utility for FdCli { + const NAME: &'static str = "fd"; + const USAGE_ERROR: u8 = 2; - Registration { - execute_func: execute::, - content_func: fd_content, - disabled: false, - special_builtin: false, - declaration_builtin: false, - transparent_background_wrapper: false, - } -} + fn run(mut self, host: &mut Host) -> i32 { + let quiet = self.quiet; + let base_dir = self + .base_directory + .as_deref() + .map_or_else(|| host.cwd().to_path_buf(), |path| host.resolve(path)); + self.ignore_files = self + .ignore_files + .iter() + .map(|path| { + if path.is_absolute() { + host.resolve(path) + } else { + host.resolve(base_dir.join(path)) + } + }) + .collect(); + let cancelled = host.cancel_flag(); -async fn run_fd( - context: ExecutionContext<'_, SE>, - args: Vec, -) -> Result { - let stdout = context.try_fd(OpenFiles::STDOUT_FD); - let stderr = context.try_fd(OpenFiles::STDERR_FD); - let cwd = context.shell.working_dir().to_path_buf(); - let cancel = context.cancel_token(); - let argv: Vec = args - .iter() - .map(|arg| OsString::from(arg.to_string())) - .collect(); - drop(context); - - let cancel_flag = Arc::new(AtomicBool::new(false)); - let thread_flag = Arc::clone(&cancel_flag); - let mut handle = tokio::task::spawn_blocking(move || { - let mut stdout = stdout.unwrap_or_else(null_sink); - let mut stderr = stderr.unwrap_or_else(null_sink); - run_fd_sync(argv, cwd, &mut stdout, &mut stderr, &thread_flag) - }); - - let code = match cancel { - Some(token) => { - let token_check = token.clone(); - tokio::select! { - biased; - () = token.cancelled() => { - cancel_flag.store(true, Ordering::Relaxed); - let _ = (&mut handle).await; - 130 - }, - result = &mut handle => { - if token_check.is_cancelled() { 130 } else { result.unwrap_or(1) } - }, - } - }, - None => handle.await.unwrap_or(1), - }; - - Ok(ExecutionResult::new(exit_status(code))) -} - -fn run_fd_sync( - argv: Vec, - cwd: PathBuf, - stdout: &mut OpenFile, - stderr: &mut OpenFile, - cancelled: &AtomicBool, -) -> i32 { - let cli = match FdCli::try_parse_from(argv) { - Ok(cli) => cli, - Err(err) => { - let rendered = err.to_string(); - return match err.kind() { - ErrorKind::DisplayHelp | ErrorKind::DisplayVersion => { - let _ = write!(stdout, "{rendered}"); - 0 - }, - _ => { - let _ = write!(stderr, "{rendered}"); + match search(self, base_dir, host, &cancelled) { + Ok(state) => { + if state.had_error { 2 - }, - }; - }, - }; - - let quiet = cli.quiet; - match search(cli, cwd, stdout, stderr, cancelled) { - Ok(state) => { - if state.had_error { + } else if quiet { + i32::from(state.matches == 0) + } else { + 0 + } + }, + // A closed downstream reader (`fd … | head`) surfaces as BrokenPipe on + // stdout writes. Real fd dies silently from SIGPIPE; mirror that with + // exit 141 (128+SIGPIPE) and no diagnostic. + Err(err) if err.kind() == io::ErrorKind::BrokenPipe => 141, + Err(err) => { + let _ = writeln!(host.stderr, "fd: {err}"); 2 - } else if quiet { - i32::from(state.matches == 0) - } else { - 0 - } - }, - // A closed downstream reader (`fd … | head`) surfaces as BrokenPipe on - // stdout writes. Real fd dies silently from SIGPIPE; mirror that with - // exit 141 (128+SIGPIPE) and no diagnostic. - Err(err) if err.kind() == io::ErrorKind::BrokenPipe => 141, - Err(err) => { - let _ = writeln!(stderr, "fd: {err}"); - 2 - }, + }, + } } } +/// Creates the `fd` builtin registration. +pub(crate) fn fd_builtin() -> Registration { + util::() +} + fn search( cli: FdCli, - cwd: PathBuf, - stdout: &mut OpenFile, - stderr: &mut OpenFile, + base_dir: PathBuf, + host: &mut Host, cancelled: &AtomicBool, ) -> io::Result { if cli.list_details || !cli.exec.is_empty() || !cli.exec_batch.is_empty() || cli.batch_size != 0 @@ -676,8 +614,7 @@ fn search( } let _ = (cli.color, cli.hyperlink, cli.strip_cwd_prefix); - let base_dir = resolve_path(&cwd, cli.base_directory.as_deref()); - let search_paths = resolve_search_paths(&cli, &base_dir)?; + let search_paths = resolve_search_paths(&cli, &base_dir, host)?; let absolute_roots = search_paths .iter() .filter(|path| path.original.is_absolute()) @@ -728,14 +665,20 @@ fn search( prune: cli.prune, }; - if let Some(state) = - try_search_fast(&cli, &search_paths, &config, max_results, stdout, stderr, cancelled)? - { + if let Some(state) = try_search_fast( + &cli, + &search_paths, + &config, + max_results, + &mut host.stdout, + &mut host.stderr, + cancelled, + )? { return Ok(state); } let use_gitignore = !(no_ignore(&cli) || no_ignore_vcs(&cli)); - let mut out = BufWriter::new(stdout); + let mut out = BufWriter::new(&mut host.stdout); let mut state = SearchState { matches: 0, had_error: false }; for search_path in &search_paths { if cancelled.load(Ordering::Relaxed) || max_results.is_some_and(|max| state.matches >= max) { @@ -988,16 +931,16 @@ fn matches_walker_type_filter( true } -/// Builds a walker heartbeat closure that observes the shell cancel flag. +/// Builds a walker heartbeat closure that observes the host cancel flag. /// -/// The shell wrapper (`run_fd`) flips `cancelled` when it sees the runtime -/// cancellation token fire, then awaits the blocking task. Without this -/// closure, `pi_walker`'s per-entry heartbeat never checks the flag and a -/// cancelled walk keeps traversing until the whole tree is collected. +/// The shared utility adapter flips `cancelled` when the shell cancellation +/// token fires, then awaits the blocking task. Without this closure, +/// `pi_walker`'s per-entry heartbeat never checks the flag and a cancelled walk +/// keeps traversing until the whole tree is collected. /// Returning [`io::ErrorKind::Interrupted`] surfaces as -/// [`WalkError::Interrupted`], which the callers translate to a silent break — -/// the shell wrapper owns the user-visible exit code (130), so no `fd:` -/// diagnostic is emitted. +/// [`pi_walker::WalkError::Interrupted`], which the callers translate to a +/// silent break — the shared adapter owns the user-visible exit code (130), so +/// no `fd:` diagnostic is emitted. /// /// Regression cover for #3949 (fd) and #3933 (grep/rg — same class of defect). fn cancel_heartbeat(cancelled: &AtomicBool) -> impl Fn() -> io::Result<()> + Sync + '_ { @@ -1193,7 +1136,11 @@ const fn owner_side_matches(side: OwnerSide, actual: u32) -> bool { } } -fn resolve_search_paths(cli: &FdCli, base_dir: &Path) -> io::Result> { +fn resolve_search_paths( + cli: &FdCli, + base_dir: &Path, + host: &Host, +) -> io::Result> { if !cli.search_paths.is_empty() && !cli.paths.is_empty() { return Err(io::Error::new( io::ErrorKind::InvalidInput, @@ -1211,9 +1158,9 @@ fn resolve_search_paths(cli: &FdCli, base_dir: &Path) -> io::Result) -> PathBuf { - match path { - Some(path) if path.is_absolute() => path.to_path_buf(), - Some(path) => cwd.join(path), - None => cwd.to_path_buf(), - } -} const fn include_hidden(cli: &FdCli) -> bool { (cli.hidden || cli.unrestricted > 0) && !cli.no_hidden @@ -1625,91 +1565,35 @@ fn remove_extension(value: &str) -> String { } } -fn null_sink() -> OpenFile { - null().unwrap_or_else(|_| OpenFile::from(io::stdout())) -} - -#[allow( - clippy::unnecessary_wraps, - reason = "signature must match brush's CommandContentFunc fn pointer" -)] -fn fd_content( - _name: &str, - _content_type: ContentType, - _options: &ContentOptions, -) -> Result { - Ok("fd: fd [OPTIONS] [pattern] [path]...\n".to_string()) -} - -fn exit_status(code: i32) -> u8 { - u8::try_from(code.clamp(0, 255)).unwrap_or(1) -} #[cfg(test)] mod tests { use std::{ - env, fs, - io::Read, - sync::atomic::{AtomicBool, AtomicUsize, Ordering}, - time::{SystemTime, UNIX_EPOCH}, + fs, + sync::atomic::AtomicBool, }; use brush_core::openfiles::OpenFile; use clap::Parser; + use tempfile::{Builder, TempDir}; - use super::{FdCli, cancel_heartbeat, run_fd_sync, search}; - - static COUNTER: AtomicUsize = AtomicUsize::new(0); + use super::{FdCli, cancel_heartbeat}; + use crate::host::{Host, Utility, run_util}; /// Build a fresh temp directory containing a single matchable file plus a /// filler file, so the walker has more than one entry to iterate. Both the /// walker-level regressions below and the positive-path search test assert /// against this seed. - fn seeded_tree(tag: &str) -> std::path::PathBuf { - let nanos = SystemTime::now() - .duration_since(UNIX_EPOCH) - .map_or(0, |d| d.as_nanos()); - let root = env::temp_dir().join(format!( - "pi-shell-fd-cancel-{tag}-{}-{}-{}", - std::process::id(), - nanos, - COUNTER.fetch_add(1, Ordering::Relaxed), - )); - fs::create_dir_all(&root).expect("temp tree should be created"); - fs::write(root.join("haystack.txt"), b"needle\n").expect("seed file should be written"); - fs::write(root.join("filler.txt"), b"filler\n").expect("filler file should be written"); - root - } - - /// Returns `(capture_path, writable_handle)`. The path is a fresh temp file - /// scoped to this test invocation; the handle wraps that same file so writes - /// go through the `OpenFile::File` variant and can later be read back. - fn capture_file(kind: &str) -> (std::path::PathBuf, fs::File) { - let nanos = SystemTime::now() - .duration_since(UNIX_EPOCH) - .map_or(0, |d| d.as_nanos()); - let path = env::temp_dir().join(format!( - "pi-shell-fd-cancel-{kind}-{}-{}-{}", - std::process::id(), - nanos, - COUNTER.fetch_add(1, Ordering::Relaxed), - )); - let file = fs::OpenOptions::new() - .create(true) - .read(true) - .write(true) - .truncate(true) - .open(&path) - .expect("capture file should open"); - (path, file) - } - - fn read_all(path: &std::path::Path) -> Vec { - let mut file = fs::File::open(path).expect("open capture"); - let mut buf = Vec::new(); - file.read_to_end(&mut buf).expect("read capture"); - let _ = fs::remove_file(path); - buf + fn seeded_tree(tag: &str) -> TempDir { + let tree = Builder::new() + .prefix(&format!("brush-fd-cancel-{tag}-")) + .tempdir() + .expect("temp tree should be created"); + fs::write(tree.path().join("haystack.txt"), b"needle\n") + .expect("seed file should be written"); + fs::write(tree.path().join("filler.txt"), b"filler\n") + .expect("filler file should be written"); + tree } /// Build the same `WalkRequest` `search`/`try_search_fast` build for the @@ -1742,14 +1626,13 @@ mod tests { // observing the flag — the exact bug #3949 reports. let tree = seeded_tree("collect"); let cancelled = AtomicBool::new(true); - let err = walk_request(&tree) + let err = walk_request(tree.path()) .collect_with_heartbeat(cancel_heartbeat(&cancelled)) .expect_err("walker must surface the cancel flag as an error"); assert!( matches!(err, pi_walker::WalkError::Interrupted(_)), "heartbeat interruption should surface as WalkError::Interrupted, got {err:?}" ); - let _ = fs::remove_dir_all(&tree); } #[test] @@ -1761,7 +1644,7 @@ mod tests { let tree = seeded_tree("stream"); let cancelled = AtomicBool::new(true); let visited = std::cell::Cell::new(0_usize); - let result = walk_request(&tree).for_each_entry_with_heartbeat( + let result = walk_request(tree.path()).for_each_entry_with_heartbeat( cancel_heartbeat(&cancelled), |_entry| { visited.set(visited.get() + 1); @@ -1779,7 +1662,6 @@ mod tests { 0, "visitor must not receive any entry once the heartbeat has aborted the walk", ); - let _ = fs::remove_dir_all(&tree); } #[test] @@ -1789,26 +1671,16 @@ mod tests { // and its walker call (the outer pre-loop guard passes with // cancelled=false), then finds the seeded match. let tree = seeded_tree("normal"); - let path = tree.to_str().expect("utf8 path"); - let cli = FdCli::try_parse_from(["fd", "haystack", path]).expect("argv"); - let (stdout_capture, stdout_file) = capture_file("stdout-ok"); - let (stderr_capture, stderr_file) = capture_file("stderr-ok"); - let mut stdout = OpenFile::from(stdout_file); - let mut stderr = OpenFile::from(stderr_file); - let cancelled = AtomicBool::new(false); - let state = search(cli, tree.clone(), &mut stdout, &mut stderr, &cancelled) - .expect("uncancelled search should succeed"); - drop(stdout); - drop(stderr); - assert_eq!(state.matches, 1, "seeded haystack.txt should match once"); - let out = read_all(&stdout_capture); - let err = read_all(&stderr_capture); + let path = tree.path().to_str().expect("utf8 path"); + let (code, capture) = run_util::(&["haystack", path], "", tree.path()); + + assert_eq!(code, 0); assert!( - String::from_utf8_lossy(&out).contains("haystack.txt"), - "stdout should list the match: {out:?}" + capture.out().contains("haystack.txt"), + "stdout should list the match: {:?}", + capture.stdout() ); - assert!(err.is_empty(), "stderr should stay clean on success: {err:?}"); - let _ = fs::remove_dir_all(&tree); + assert!(capture.err().is_empty(), "stderr should stay clean: {:?}", capture.stderr()); } #[test] @@ -1818,20 +1690,16 @@ mod tests { // silently from SIGPIPE; the builtin must map BrokenPipe to exit 141 // with no stderr diagnostic. let tree = seeded_tree("epipe"); + let path = tree.path().to_str().expect("utf8 path"); + let cli = FdCli::try_parse_from(["fd", "haystack", path]).expect("argv"); + let (mut host, capture) = Host::for_test("fd", "", tree.path()); let (reader, writer) = std::io::pipe().expect("pipe"); drop(reader); // downstream reader (e.g. `head`) already exited - let mut stdout = OpenFile::from(writer); - let (stderr_capture, stderr_file) = capture_file("stderr-epipe"); - let mut stderr = OpenFile::from(stderr_file); - let cancelled = AtomicBool::new(false); - let argv = ["fd", "haystack", tree.to_str().expect("utf8 path")] - .map(std::ffi::OsString::from) - .to_vec(); - let code = run_fd_sync(argv, tree.clone(), &mut stdout, &mut stderr, &cancelled); - drop(stderr); + host.stdout = OpenFile::from(writer); + + let code = cli.run(&mut host); + assert_eq!(code, 141, "BrokenPipe must map to 128+SIGPIPE"); - let err = read_all(&stderr_capture); - assert!(err.is_empty(), "stderr must stay clean on a broken pipe: {err:?}"); - let _ = fs::remove_dir_all(&tree); + assert!(capture.err().is_empty(), "stderr must stay clean on a broken pipe"); } } diff --git a/crates/vendor/brush-builtins/src/fg.rs b/crates/pi-builtins/src/fg.rs similarity index 100% rename from crates/vendor/brush-builtins/src/fg.rs rename to crates/pi-builtins/src/fg.rs diff --git a/crates/pi-builtins/src/find.rs b/crates/pi-builtins/src/find.rs new file mode 100644 index 000000000..d41b7b687 --- /dev/null +++ b/crates/pi-builtins/src/find.rs @@ -0,0 +1,5121 @@ +// Copyright 2017 Google Inc. +// +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file or at +// https://opensource.org/licenses/MIT. + +//! `find` builtin ported from uutils findutils. + +pub mod matchers { + // Copyright 2017 Google Inc. + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + mod access { + // Copyright 2022 Tavian Barnes + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + use faccess::PathExt; + + use super::{Matcher, MatcherIO, WalkEntry}; + + /// Matcher for -{read,writ,execut}able. + pub enum AccessMatcher { + Readable, + Writable, + Executable, + } + + impl Matcher for AccessMatcher { + fn matches(&self, file_info: &WalkEntry, _: &mut MatcherIO) -> bool { + let path = file_info.path(); + + match self { + Self::Readable => path.readable(), + Self::Writable => path.writable(), + Self::Executable => path.executable(), + } + } + } + } + mod delete { + /* + * This file is part of the uutils findutils package. + * + * (c) Arcterus + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + + use std::{ + fs, + io::{self, Write}, + }; + + + use super::{Matcher, MatcherIO, WalkEntry}; + + pub struct DeleteMatcher; + + impl DeleteMatcher { + pub fn new() -> Self { + Self + } + + fn delete(&self, entry: &WalkEntry) -> io::Result<()> { + if entry.file_type().is_dir() && !entry.path_is_symlink() { + fs::remove_dir(entry.path()) + } else { + fs::remove_file(entry.path()) + } + } + } + + impl Matcher for DeleteMatcher { + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + let path = file_info.path(); + let path_str = path.to_string_lossy(); + + // This is a quirk in find's traditional semantics probably due to + // POSIX rmdir() not accepting "." (EINVAL). std::fs::remove_dir() + // inherits the same behavior, so no reason to buck tradition. + if path_str == "." { + return true; + } + + match self.delete(file_info) { + Ok(()) => true, + Err(e) => { + matcher_io.set_exit_code(1); + writeln!(&mut matcher_io.host().stderr, "Failed to delete {path_str}: {e}").unwrap(); + false + }, + } + } + + fn has_side_effects(&self) -> bool { + true + } + } + } + mod empty { + // Copyright 2021 Collabora, Ltd. + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + use std::{fs::read_dir, io::Write}; + + + use super::{Matcher, MatcherIO, WalkEntry}; + + pub struct EmptyMatcher; + + impl EmptyMatcher { + pub fn new() -> Self { + Self + } + } + + impl Matcher for EmptyMatcher { + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + if file_info.file_type().is_file() { + match file_info.metadata() { + Ok(meta) => meta.len() == 0, + Err(err) => { + writeln!( + &mut matcher_io.host().stderr, + "Error getting size for {}: {}", + file_info.path().display(), + err + ) + .unwrap(); + false + }, + } + } else if file_info.file_type().is_dir() { + match read_dir(file_info.path()) { + Ok(mut it) => it.next().is_none(), + Err(err) => { + writeln!( + &mut matcher_io.host().stderr, + "Error getting contents of {}: {}", + file_info.path().display(), + err + ) + .unwrap(); + false + }, + } + } else { + false + } + } + } + } + mod entry { + //! Paths encountered during a walk. + + #[cfg(unix)] + use std::os::unix::fs::FileTypeExt; + use std::{ + cell::OnceCell, + error::Error, + ffi::OsStr, + fmt::{self, Display, Formatter}, + fs::{self, Metadata}, + io::{self, ErrorKind}, + path::{Path, PathBuf}, + }; + + use super::Follow; + + /// File types. + #[derive(Clone, Copy, Debug, Eq, PartialEq)] + pub enum FileType { + Unknown, + Fifo, + CharDevice, + Directory, + BlockDevice, + Regular, + Symlink, + Socket, + } + + impl FileType { + pub fn is_dir(self) -> bool { + self == Self::Directory + } + + pub fn is_file(self) -> bool { + self == Self::Regular + } + + pub fn is_symlink(self) -> bool { + self == Self::Symlink + } + } + + impl From for FileType { + fn from(t: fs::FileType) -> Self { + if t.is_dir() { + return Self::Directory; + } + if t.is_file() { + return Self::Regular; + } + if t.is_symlink() { + return Self::Symlink; + } + + #[cfg(unix)] + { + if t.is_fifo() { + return Self::Fifo; + } + if t.is_char_device() { + return Self::CharDevice; + } + if t.is_block_device() { + return Self::BlockDevice; + } + if t.is_socket() { + return Self::Socket; + } + } + + Self::Unknown + } + } + + /// An error encountered while walking a file system. + #[derive(Clone, Debug)] + pub struct WalkError { + /// The path that caused the error, if known. + path: Option, + /// The depth below the root path, if known. + depth: Option, + /// The io::Error::raw_os_error(), if known. + raw: Option, + } + + impl WalkError { + /// Get the path this error occurred on, if known. + pub fn path(&self) -> Option<&Path> { + self.path.as_deref() + } + + /// Get the traversal depth when this error occurred, if known. + pub fn depth(&self) -> Option { + self.depth + } + + /// Get the kind of I/O error. + pub fn kind(&self) -> ErrorKind { + io::Error::from(self).kind() + } + + /// Check for ErrorKind::{NotFound,NotADirectory}. + pub fn is_not_found(&self) -> bool { + if self.kind() == ErrorKind::NotFound { + return true; + } + + // NotADirectory is nightly-only + #[cfg(unix)] + { + if self.raw == Some(uucore::libc::ENOTDIR) { + return true; + } + } + + false + } + + /// Check for ErrorKind::FilesystemLoop. + pub fn is_loop(&self) -> bool { + #[cfg(unix)] + return self.raw == Some(uucore::libc::ELOOP); + + #[cfg(not(unix))] + return false; + } + } + + impl Display for WalkError { + fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), fmt::Error> { + let ioe = io::Error::from(self); + if let Some(path) = &self.path { + write!(f, "{}: {}", path.display(), ioe) + } else { + write!(f, "{}", ioe) + } + } + } + + impl Error for WalkError {} + + impl From for WalkError { + fn from(e: io::Error) -> Self { + Self::from(&e) + } + } + + impl From<&io::Error> for WalkError { + fn from(e: &io::Error) -> Self { + Self { path: None, depth: None, raw: e.raw_os_error() } + } + } + + impl From for io::Error { + fn from(e: WalkError) -> Self { + Self::from(&e) + } + } + + impl From<&WalkError> for io::Error { + fn from(e: &WalkError) -> Self { + e.raw + .map(Self::from_raw_os_error) + .unwrap_or_else(|| ErrorKind::Other.into()) + } + } + + /// A path encountered while walking a file system. + #[derive(Debug)] + pub struct WalkEntry { + /// Filesystem path for this entry. + path: PathBuf, + /// Depth below the traversal root. + depth: usize, + /// Whether to follow symlinks. + follow: Follow, + /// Cached metadata. + meta: OnceCell>, + /// Operand-relative path used for display and path-based matching, when it + /// differs from the real filesystem path. The shell host roots the walk at + /// a working-directory-resolved (often absolute) path so stat/exec/delete + /// target the correct files even though the process cwd differs from the + /// shell cwd; this preserves the operand-prefixed path GNU find prints and + /// matches against (e.g. `find .` -> `./a`). `None` falls back to `path()`. + display: Option, + } + + impl WalkEntry { + /// Create a new WalkEntry for a specific file. + pub fn new(path: impl Into, depth: usize, follow: Follow) -> Self { + Self { path: path.into(), depth, follow, meta: OnceCell::new(), display: None } + } + + /// Get the path to this entry. + pub fn path(&self) -> &Path { + self.path.as_path() + } + + + /// Path used for display (`-print`, `-ls`) and path-based matching + /// (`-path`, `-regex`, `-printf %p/%h/%P/%H`). Falls back to [`Self::path`] + /// when no display override was installed (explicit entries, unit tests). + pub fn display_path(&self) -> &Path { + self.display.as_deref().unwrap_or_else(|| self.path()) + } + + /// Install an operand-relative display path derived from the original + /// starting-point `operand` and the `resolved_root` the walk was rooted at. + /// The real filesystem path is left untouched. When this entry's path is + /// not under `resolved_root` (e.g. a followed symlink escaping the root) + /// the override is left unset and display falls back to the real path. + pub fn set_display_root(&mut self, operand: &Path, resolved_root: &Path) { + let display = match self.path().strip_prefix(resolved_root) { + Ok(rel) if rel.as_os_str().is_empty() => operand.to_path_buf(), + Ok(rel) => operand.join(rel), + Err(_) => return, + }; + self.display = Some(display); + } + + /// Get the name of this entry. + pub fn file_name(&self) -> &OsStr { + // Path::file_name() only works if the last component is normal. + self + .path + .components() + .next_back() + .map(|c| c.as_os_str()) + .unwrap_or_else(|| self.path.as_os_str()) + } + + /// Get the depth of this entry below the root. + pub fn depth(&self) -> usize { + self.depth + } + + /// Get whether symbolic links are followed for this entry. + pub fn follow(&self) -> bool { + self.follow.follow_at_depth(self.depth()) + } + + /// Get the metadata on a cache miss. + fn get_metadata(&self) -> Result { + self.follow.metadata_at_depth(&self.path, self.depth) + } + + /// Get the [Metadata] for this entry, following symbolic links if + /// appropriate. Multiple calls to this function will cache and re-use the + /// same [Metadata]. + pub fn metadata(&self) -> Result<&Metadata, WalkError> { + let result = self.meta.get_or_init(|| self.get_metadata()); + result.as_ref().map_err(|e| e.clone()) + } + + /// Get the file type of this entry. + pub fn file_type(&self) -> FileType { + self + .metadata() + .map(|m| m.file_type().into()) + .unwrap_or(FileType::Unknown) + } + + /// Check whether this entry is a symbolic link, regardless of whether links + /// are being followed. + pub fn path_is_symlink(&self) -> bool { + if self.follow() { + self + .path + .symlink_metadata() + .is_ok_and(|m| m.file_type().is_symlink()) + } else { + self.file_type().is_symlink() + } + } + } + } + pub mod exec { + // Copyright 2017 Google Inc. + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + use std::{cell::RefCell, error::Error, ffi::OsString, io::Write, path::Path, process::Command}; + + + use super::{Matcher, MatcherIO, WalkEntry}; + + enum Arg { + FileArg(Vec), + LiteralArg(OsString), + } + + pub struct SingleExecMatcher { + executable: String, + args: Vec, + exec_in_parent_dir: bool, + } + + impl SingleExecMatcher { + pub fn new( + executable: &str, + args: &[&str], + exec_in_parent_dir: bool, + ) -> Result> { + let transformed_args = args + .iter() + .map(|&a| { + let parts = a.split("{}").collect::>(); + if parts.len() == 1 { + // No {} present + Arg::LiteralArg(OsString::from(a)) + } else { + Arg::FileArg(parts.iter().map(OsString::from).collect()) + } + }) + .collect(); + + Ok(Self { executable: executable.to_string(), args: transformed_args, exec_in_parent_dir }) + } + } + + impl Matcher for SingleExecMatcher { + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + let mut command = Command::new(&self.executable); + let path_to_file = if self.exec_in_parent_dir { + if let Some(f) = file_info.path().file_name() { + Path::new(".").join(f) + } else { + Path::new(".").join(file_info.path()) + } + } else { + file_info.display_path().to_path_buf() + }; + + for arg in &self.args { + match *arg { + Arg::LiteralArg(ref a) => command.arg(a.as_os_str()), + Arg::FileArg(ref parts) => command.arg(parts.join(path_to_file.as_os_str())), + }; + } + if self.exec_in_parent_dir { + match file_info.path().parent() { + None => { + // Root paths like "/" have no parent. Run them from the root to match GNU + // find. + command.current_dir(file_info.path()); + }, + Some(parent) if parent == Path::new("") => { + // Paths like "foo" have a parent of "". Avoid chdir(""). + }, + Some(parent) => { + command.current_dir(parent); + }, + } + } else { + // GNU runs `-exec` in find's working directory; resolve the + // operand-relative `{}` against the shell cwd, not the host cwd. + command.current_dir(matcher_io.host().cwd()); + } + command.env_clear().envs(matcher_io.host().env()); + // The host process's stdio belongs to the embedding TUI; route the + // child's output through the scope streams instead of inheriting. + match matcher_io.host().run_captured(&mut command) { + Ok(status) => status.success(), + Err(e) => { + writeln!(&mut matcher_io.host().stderr, "Failed to run {}: {}", self.executable, e).unwrap(); + false + }, + } + } + + fn has_side_effects(&self) -> bool { + true + } + } + + pub struct MultiExecMatcher { + executable: String, + args: Vec, + exec_in_parent_dir: bool, + /// Command to build while matching. + command: RefCell>, + } + + impl MultiExecMatcher { + pub fn new( + executable: &str, + args: &[&str], + exec_in_parent_dir: bool, + ) -> Result> { + let transformed_args = args.iter().map(OsString::from).collect(); + + Ok(Self { + executable: executable.to_string(), + args: transformed_args, + exec_in_parent_dir, + command: RefCell::new(None), + }) + } + + fn new_command(&self, matcher_io: &mut MatcherIO) -> argmax::Command { + let mut command = argmax::Command::new(&self.executable); + command.try_args(&self.args).unwrap(); + if !self.exec_in_parent_dir { + // `-exec ... +` (non-execdir) dispatches in find's working dir; + // resolve the operand-relative paths against the shell cwd. + command.current_dir(matcher_io.host().cwd()); + } + command + } + + fn run_command(&self, command: &mut argmax::Command, matcher_io: &mut MatcherIO) { + // `argmax::Command` only Derefs immutably into `std::process::Command`, + // so rebuild a std command from its accumulated state to attach the + // scope environment and context-captured stdio — the host process's + // stdio belongs to the embedding TUI and must never be inherited. + let mut std_command = Command::new(command.get_program()); + std_command.args(command.get_args()); + if let Some(dir) = command.get_current_dir() { + std_command.current_dir(dir); + } + std_command.env_clear().envs(matcher_io.host().env()); + match matcher_io.host().run_captured(&mut std_command) { + Ok(status) => { + if !status.success() { + matcher_io.set_exit_code(1); + } + }, + Err(e) => { + writeln!(&mut matcher_io.host().stderr, "Failed to run {}: {}", self.executable, e).unwrap(); + matcher_io.set_exit_code(1); + }, + } + } + } + + impl Matcher for MultiExecMatcher { + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + let path_to_file = if self.exec_in_parent_dir { + if let Some(f) = file_info.path().file_name() { + Path::new(".").join(f) + } else { + Path::new(".").join(file_info.path()) + } + } else { + file_info.display_path().to_path_buf() + }; + let mut command = self.command.borrow_mut(); + let command = command.get_or_insert_with(|| self.new_command(matcher_io)); + + // Build command, or dispatch it before when it is long enough. + if command.try_arg(&path_to_file).is_err() { + if self.exec_in_parent_dir { + match file_info.path().parent() { + None => { + // Root paths like "/" have no parent. Run them from the root to match GNU + // find. + command.current_dir(file_info.path()); + }, + Some(parent) if parent == Path::new("") => { + // Paths like "foo" have a parent of "". Avoid chdir(""). + }, + Some(parent) => { + command.current_dir(parent); + }, + } + } + self.run_command(command, matcher_io); + + // Reset command status. + *command = self.new_command(matcher_io); + if let Err(e) = command.try_arg(&path_to_file) { + writeln!( + &mut matcher_io.host().stderr, + "Cannot fit a single argument {}: {}", + path_to_file.to_string_lossy(), + e + ) + .unwrap(); + matcher_io.set_exit_code(1); + } + } + true + } + + fn finished_dir(&self, dir: &Path, matcher_io: &mut MatcherIO) { + // Dispatch command for -execdir. + if self.exec_in_parent_dir { + let mut command = self.command.borrow_mut(); + if let Some(mut command) = command.take() { + command.current_dir(Path::new(".").join(dir)); + self.run_command(&mut command, matcher_io); + } + } + } + + fn finished(&self, matcher_io: &mut MatcherIO) { + // Dispatch command for -exec. + if !self.exec_in_parent_dir { + let mut command = self.command.borrow_mut(); + if let Some(mut command) = command.take() { + self.run_command(&mut command, matcher_io); + } + } + } + + fn has_side_effects(&self) -> bool { + true + } + } + } + pub mod fs { + // This file is part of the uutils findutils package. + // + // For the full copyright and license information, please view the LICENSE + // file that was distributed with this source code. + #[cfg(unix)] + use std::{cell::RefCell, io, io::Write, path::Path}; + + use super::{Matcher, MatcherIO, WalkEntry}; + + /// The latest mapping from dev_id to fs_type, used for saving mount info reads + #[cfg(unix)] + pub struct Cache { + dev_id: String, + fs_type: String, + } + + /// Get the filesystem type of a file. + /// 1. get the metadata of the file + /// 2. get the device ID of the metadata + /// 3. search the cache, then the filesystem list + /// + /// Returns an empty string when no file system list matches. + /// + /// # Errors + /// Returns an error if the metadata or the mount table could not be read. + /// + /// This is only supported on Unix. + #[cfg(unix)] + pub fn get_file_system_type( + path: &Path, + cache: &RefCell>, + ) -> io::Result { + use std::os::unix::fs::MetadataExt; + + // use symlink_metadata (lstat under the hood) instead of metadata (stat) to + // make sure that it does not return an error when there is a (broken) symlink; + // this is aligned with GNU find. + let dev_id = path.symlink_metadata()?.dev().to_string(); + + if let Some(cache) = cache.borrow().as_ref() + && cache.dev_id == dev_id + { + return Ok(cache.fs_type.clone()); + } + + // `read_fs_list` reports failures through uucore's error type; the mount + // table is either readable or it is not, so flatten it to an io error. + let fs_list = uucore::fsext::read_fs_list().map_err(|err| io::Error::other(err.to_string()))?; + let result = fs_list + .into_iter() + .find(|fs| fs.dev_id == dev_id) + .map_or_else(String::new, |fs| fs.fs_type); + + // cache the latest query if not a match before + cache.replace(Some(Cache { dev_id, fs_type: result.clone() })); + + Ok(result) + } + + /// This matcher handles the -fstype argument. + /// It matches the filesystem type of the file. + /// + /// This is only supported on Unix. + pub struct FileSystemMatcher { + #[cfg(unix)] + fs_text: String, + #[cfg(unix)] + cache: RefCell>, + } + + impl FileSystemMatcher { + #[cfg(unix)] + pub fn new(fs_text: String) -> Self { + Self { fs_text, cache: RefCell::new(None) } + } + + #[cfg(not(unix))] + pub fn new(_fs_text: String) -> Self { + Self {} + } + } + + impl Matcher for FileSystemMatcher { + #[cfg(unix)] + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + match get_file_system_type(file_info.path(), &self.cache) { + Ok(result) => result == self.fs_text, + Err(_) => { + writeln!( + &mut matcher_io.host().stderr, + "Error getting filesystem type for {}", + file_info.path().to_string_lossy() + ) + .unwrap(); + + false + }, + } + } + + #[cfg(not(unix))] + fn matches(&self, _file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + false + } + } + } + mod glob { + // Copyright 2022 Tavian Barnes + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + use onig::{Regex, RegexOptions, Syntax}; + + /// Parse a string as a POSIX Basic Regular Expression. + fn parse_bre(expr: &str, options: RegexOptions) -> Result { + let bre = Syntax::posix_basic(); + Regex::with_options(expr, bre.options() | options, bre) + } + + /// Push a literal character onto a regex, escaping it if necessary. + fn regex_push_literal(regex: &mut String, ch: char) { + // https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_03 + if matches!(ch, '.' | '[' | '\\' | '*' | '^' | '$') { + regex.push('\\'); + } + regex.push(ch); + } + + /// Extracts a bracket expression from a glob. + fn extract_bracket_expr(pattern: &str) -> Option<(String, &str)> { + // https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13_01 + // + // If an open bracket introduces a bracket expression as in XBD RE Bracket + // Expression, except that the character ( '!' ) shall + // replace the character ( '^' ) in its role in a non-matching + // list in the regular expression notation, it shall introduce a pattern + // bracket expression. A bracket expression starting with an unquoted + // character produces unspecified results. Otherwise, '[' shall + // match the character itself. + // + // To check for valid bracket expressions, we scan for the closing bracket and + // attempt to parse that segment as a regex. If that fails, we treat the '[' + // literally. + + let mut expr = "[".to_string(); + + let mut chars = pattern.chars(); + let mut next = chars.next(); + + // https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05 + // + // 3. A non-matching list expression begins with a ( '^' ) ... + // + // (but in a glob, '!' is used instead of '^') + if next == Some('!') { + expr.push('^'); + next = chars.next(); + } + + // https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05 + // + // 1. ... The ( ']' ) shall lose its special meaning + // and represent itself in a bracket expression if it occurs first in the + // list (after an initial ( '^' ), if any). + if next == Some(']') { + expr.push(']'); + next = chars.next(); + } + + while let Some(ch) = next { + expr.push(ch); + + match ch { + '[' => { + // https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05 + // + // 4. A collating symbol is a collating element enclosed within + // bracket-period ( "[." and ".]" ) delimiters. ... + // + // 5. An equivalence class expression shall ... be expressed by enclosing + // any one of the collating elements in the equivalence class within + // bracket- equal ( "[=" and "=]" ) delimiters. + // + // 6. ... A character class expression is expressed as a character class + // name enclosed within bracket- ( "[:" and ":]" ) delimiters. + next = chars.next(); + if let Some(delim) = next { + expr.push(delim); + + if matches!(delim, '.' | '=' | ':') { + let rest = chars.as_str(); + let end = rest.find([delim, ']'])? + 2; + expr.push_str(&rest[..end]); + chars = rest[end..].chars(); + } + } + }, + ']' => { + // https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05 + // + // 1. ... The ( ']' ) shall ... terminate the bracket + // expression, unless it appears in a collating symbol (such as "[.].]" ) + // or is the ending for a collating symbol, + // equivalence class, or character class. + break; + }, + _ => {}, + } + + next = chars.next(); + } + + if parse_bre(&expr, RegexOptions::REGEX_OPTION_NONE).is_ok() { + Some((expr, chars.as_str())) + } else { + None + } + } + + /// Converts a POSIX glob into a POSIX Basic Regular Expression + fn glob_to_regex(pattern: &str) -> Option { + let mut regex = String::new(); + + let mut chars = pattern.chars(); + while let Some(ch) = chars.next() { + // https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13 + match ch { + '?' => regex.push('.'), + '*' => regex.push_str(".*"), + '\\' => { + let ch = chars.next()?; + regex_push_literal(&mut regex, ch); + }, + '[' => { + if let Some((expr, rest)) = extract_bracket_expr(chars.as_str()) { + regex.push_str(&expr); + chars = rest.chars(); + } else { + regex_push_literal(&mut regex, ch); + } + }, + _ => regex_push_literal(&mut regex, ch), + } + } + + Some(regex) + } + + /// An fnmatch()-style glob matcher. + pub struct Pattern { + regex: Option, + } + + impl Pattern { + /// Parse an fnmatch()-style glob. + pub fn new(pattern: &str, caseless: bool) -> Self { + let options = if caseless { + RegexOptions::REGEX_OPTION_IGNORECASE + } else { + RegexOptions::REGEX_OPTION_NONE + }; + + // As long as glob_to_regex() is correct, this should never fail + let regex = glob_to_regex(pattern).map(|r| parse_bre(&r, options).unwrap()); + Self { regex } + } + + /// Test if this pattern matches a string. + pub fn matches(&self, string: &str) -> bool { + self.regex.as_ref().is_some_and(|r| r.is_match(string)) + } + } + } + mod group { + // This file is part of the uutils findutils package. + // + // For the full copyright and license information, please view the LICENSE + // file that was distributed with this source code. + + #[cfg(unix)] + use std::os::unix::fs::MetadataExt; + + #[cfg(unix)] + use nix::unistd::Group; + + use super::{ComparableValue, Matcher, MatcherIO, WalkEntry}; + + pub struct GroupMatcher { + #[cfg_attr(not(unix), allow(dead_code))] + gid: ComparableValue, + } + + impl GroupMatcher { + #[cfg(unix)] + pub fn from_group_name(group: &str) -> Option { + // get gid from group name + let group = Group::from_name(group).ok()??; + let gid = group.gid.as_raw(); + Some(Self::from_gid(gid)) + } + + pub fn from_gid(gid: u32) -> Self { + Self::from_comparable(ComparableValue::EqualTo(gid as u64)) + } + + pub fn from_comparable(gid: ComparableValue) -> Self { + Self { gid } + } + + #[cfg(windows)] + pub fn from_group_name(_group: &str) -> Option { + None + } + } + + impl Matcher for GroupMatcher { + #[cfg(unix)] + fn matches(&self, file_info: &WalkEntry, _: &mut MatcherIO) -> bool { + match file_info.metadata() { + Ok(metadata) => self.gid.matches(metadata.gid().into()), + Err(_) => false, + } + } + + #[cfg(windows)] + fn matches(&self, _file_info: &WalkEntry, _: &mut MatcherIO) -> bool { + // The user group acquisition function for Windows systems is not implemented in + // MetadataExt, so it is somewhat difficult to implement it. :( + false + } + } + + pub struct NoGroupMatcher {} + + impl Matcher for NoGroupMatcher { + #[cfg(unix)] + fn matches(&self, file_info: &WalkEntry, _: &mut MatcherIO) -> bool { + use nix::unistd::Gid; + + if file_info.path().is_symlink() { + return false; + } + + let Ok(metadata) = file_info.metadata() else { + return true; + }; + + let Ok(gid) = Group::from_gid(Gid::from_raw(metadata.gid())) else { + return true; + }; + + let Some(_group) = gid else { + return true; + }; + + false + } + + #[cfg(windows)] + fn matches(&self, _file_info: &WalkEntry, _: &mut MatcherIO) -> bool { + false + } + } + } + mod lname { + // Copyright 2017 Google Inc. + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + use std::{io::Write, path::PathBuf}; + + + use super::{Matcher, MatcherIO, WalkEntry, glob::Pattern}; + + fn read_link_target(file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> Option { + match file_info.path().read_link() { + Ok(target) => Some(target), + Err(err) => { + // If it's not a symlink, then it's not an error that should be + // shown. + if err.kind() != std::io::ErrorKind::InvalidInput { + writeln!( + &mut matcher_io.host().stderr, + "Error reading target of {}: {}", + file_info.path().display(), + err + ) + .unwrap(); + } + + None + }, + } + } + + /// This matcher makes a comparison of the link target against a shell wildcard + /// pattern. See `glob::Pattern` for details on the exact syntax. + pub struct LinkNameMatcher { + pattern: Pattern, + } + + impl LinkNameMatcher { + pub fn new(pattern_string: &str, caseless: bool) -> Self { + let pattern = Pattern::new(pattern_string, caseless); + Self { pattern } + } + } + + impl Matcher for LinkNameMatcher { + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + if let Some(target) = read_link_target(file_info, matcher_io) { + self.pattern.matches(&target.to_string_lossy()) + } else { + false + } + } + } + } + mod logical_matchers { + // Copyright 2017 Google Inc. + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + //! This modules contains the matchers used for combining other matchers and + //! performing boolean logic on them (and a couple of trivial always-true and + //! always-false matchers). The design is strongly tied to the precedence rules + //! when parsing command-line options (e.g. "-foo -o -bar -baz" is equivalent + //! to "-foo -o ( -bar -baz )", not "( -foo -o -bar ) -baz"). + use std::{error::Error, path::Path}; + + use super::{Matcher, MatcherIO, WalkEntry}; + + /// This matcher contains a collection of other matchers. A file only matches + /// if it matches ALL the contained sub-matchers. For sub-matchers that have + /// side effects, the side effects occur in the same order as the sub-matchers + /// were pushed into the collection. + pub struct AndMatcher { + submatchers: Vec>, + } + + impl AndMatcher { + pub fn new(submatchers: Vec>) -> Self { + Self { submatchers } + } + } + + impl Matcher for AndMatcher { + /// Returns true if all sub-matchers return true. Short-circuiting does take + /// place. If the nth sub-matcher returns false, then we immediately return + /// and don't make any further calls. + fn matches(&self, dir_entry: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + for matcher in &self.submatchers { + if !matcher.matches(dir_entry, matcher_io) { + return false; + } + if matcher_io.should_quit() { + break; + } + } + + true + } + + fn has_side_effects(&self) -> bool { + self + .submatchers + .iter() + .any(super::Matcher::has_side_effects) + } + + fn finished_dir(&self, dir: &Path, matcher_io: &mut MatcherIO) { + for m in &self.submatchers { + m.finished_dir(dir, matcher_io); + } + } + + fn finished(&self, matcher_io: &mut MatcherIO) { + for m in &self.submatchers { + m.finished(matcher_io); + } + } + } + + pub struct AndMatcherBuilder { + submatchers: Vec>, + } + + impl AndMatcherBuilder { + pub fn new() -> Self { + Self { submatchers: Vec::new() } + } + + pub fn new_and_condition(&mut self, matcher: impl Matcher) { + self.submatchers.push(matcher.into_box()); + } + + /// Builds a Matcher: consuming the builder in the process. + pub fn build(mut self) -> Box { + // special case. If there's only one submatcher, just return that directly + if self.submatchers.len() == 1 { + // safe to unwrap: we've just checked the size + return self.submatchers.pop().unwrap(); + } + AndMatcher::new(self.submatchers).into_box() + } + } + + /// This matcher contains a collection of other matchers. A file matches + /// if it matches any of the contained sub-matchers. For sub-matchers that have + /// side effects, the side effects occur in the same order as the sub-matchers + /// were pushed into the collection. + pub struct OrMatcher { + submatchers: Vec>, + } + + impl OrMatcher { + pub fn new(submatchers: Vec>) -> Self { + Self { submatchers } + } + } + + impl Matcher for OrMatcher { + /// Returns true if any sub-matcher returns true. Short-circuiting does take + /// place. If the nth sub-matcher returns true, then we immediately return + /// and don't make any further calls. + fn matches(&self, dir_entry: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + for matcher in &self.submatchers { + if matcher.matches(dir_entry, matcher_io) { + return true; + } + if matcher_io.should_quit() { + break; + } + } + + false + } + + fn has_side_effects(&self) -> bool { + self + .submatchers + .iter() + .any(super::Matcher::has_side_effects) + } + + fn finished_dir(&self, dir: &Path, matcher_io: &mut MatcherIO) { + for m in &self.submatchers { + m.finished_dir(dir, matcher_io); + } + } + + fn finished(&self, matcher_io: &mut MatcherIO) { + for m in &self.submatchers { + m.finished(matcher_io); + } + } + } + + pub struct OrMatcherBuilder { + submatchers: Vec, + } + + impl OrMatcherBuilder { + pub fn new_and_condition(&mut self, matcher: impl Matcher) { + // safe to unwrap. submatchers always has at least one member + self + .submatchers + .last_mut() + .unwrap() + .new_and_condition(matcher); + } + + pub fn new_or_condition(&mut self, arg: &str) -> Result<(), Box> { + if self.submatchers.last().unwrap().submatchers.is_empty() { + return Err(From::from(format!( + "invalid expression; you have used a binary operator '{arg}' with nothing before it." + ))); + } + self.submatchers.push(AndMatcherBuilder::new()); + Ok(()) + } + + pub fn new() -> Self { + let mut o = Self { submatchers: Vec::new() }; + o.submatchers.push(AndMatcherBuilder::new()); + o + } + + /// Builds a Matcher: consuming the builder in the process. + pub fn build(mut self) -> Box { + // Special case: if there's only one submatcher, just return that directly + if self.submatchers.len() == 1 { + // safe to unwrap: we've just checked the size + return self.submatchers.pop().unwrap().build(); + } + let mut submatchers = vec![]; + for x in self.submatchers { + submatchers.push(x.build()); + } + OrMatcher::new(submatchers).into_box() + } + } + + /// This matcher contains a collection of other matchers. In contrast to + /// `OrMatcher` and `AndMatcher`, all the submatcher objects are called + /// regardless of the results of previous submatchers. This is primarily used + /// for submatchers with side-effects. For such sub-matchers the side effects + /// occur in the same order as the sub-matchers were pushed into the collection. + pub struct ListMatcher { + submatchers: Vec>, + } + + impl ListMatcher { + pub fn new(submatchers: Vec>) -> Self { + Self { submatchers } + } + } + + impl Matcher for ListMatcher { + /// Calls matches on all submatcher objects, with no short-circuiting. + /// Returns the result of the call to the final submatcher + fn matches(&self, dir_entry: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + let mut rc = false; + for matcher in &self.submatchers { + rc = matcher.matches(dir_entry, matcher_io); + if matcher_io.should_quit() { + break; + } + } + rc + } + + fn has_side_effects(&self) -> bool { + self + .submatchers + .iter() + .any(super::Matcher::has_side_effects) + } + + fn finished_dir(&self, dir: &Path, matcher_io: &mut MatcherIO) { + for m in &self.submatchers { + m.finished_dir(dir, matcher_io); + } + } + + fn finished(&self, matcher_io: &mut MatcherIO) { + for m in &self.submatchers { + m.finished(matcher_io); + } + } + } + + pub struct ListMatcherBuilder { + submatchers: Vec, + } + + impl ListMatcherBuilder { + pub fn new_and_condition(&mut self, matcher: impl Matcher) { + // safe to unwrap. submatchers always has at least one member + self + .submatchers + .last_mut() + .unwrap() + .new_and_condition(matcher); + } + + pub fn new_or_condition(&mut self, arg: &str) -> Result<(), Box> { + self.submatchers.last_mut().unwrap().new_or_condition(arg) + } + + pub fn check_new_and_condition(&mut self) -> Result<(), Box> { + { + let child_or_matcher = &self.submatchers.last().unwrap(); + let grandchild_and_matcher = &child_or_matcher.submatchers.last().unwrap(); + + if grandchild_and_matcher.submatchers.is_empty() { + return Err(From::from( + "invalid expression; you have used a binary operator '-a' with nothing before it.", + )); + } + } + Ok(()) + } + + pub fn new_list_condition(&mut self) -> Result<(), Box> { + { + let child_or_matcher = &self.submatchers.last().unwrap(); + let grandchild_and_matcher = &child_or_matcher.submatchers.last().unwrap(); + + if grandchild_and_matcher.submatchers.is_empty() { + return Err(From::from( + "invalid expression; you have used a binary operator ',' with nothing before it.", + )); + } + } + self.submatchers.push(OrMatcherBuilder::new()); + Ok(()) + } + + pub fn new() -> Self { + let mut o = Self { submatchers: Vec::new() }; + o.submatchers.push(OrMatcherBuilder::new()); + o + } + + /// Builds a Matcher: consuming the builder in the process. + pub fn build(mut self) -> Box { + // Special case: if there's only one submatcher, just return that directly + if self.submatchers.len() == 1 { + // safe to unwrap: we've just checked the size + return self.submatchers.pop().unwrap().build(); + } + let mut submatchers = vec![]; + for x in self.submatchers { + submatchers.push(x.build()); + } + Box::new(ListMatcher::new(submatchers)) + } + } + + /// A simple matcher that always matches. + pub struct TrueMatcher; + + impl Matcher for TrueMatcher { + fn matches(&self, _dir_entry: &WalkEntry, _: &mut MatcherIO) -> bool { + true + } + } + + /// A simple matcher that never matches. + pub struct FalseMatcher; + + impl Matcher for FalseMatcher { + fn matches(&self, _dir_entry: &WalkEntry, _: &mut MatcherIO) -> bool { + false + } + } + + /// Matcher that wraps another matcher and inverts matching criteria. + pub struct NotMatcher { + submatcher: Box, + } + + impl NotMatcher { + pub fn new(submatcher: impl Matcher) -> Self { + Self { submatcher: submatcher.into_box() } + } + } + + impl Matcher for NotMatcher { + fn matches(&self, dir_entry: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + !self.submatcher.matches(dir_entry, matcher_io) + } + + fn has_side_effects(&self) -> bool { + self.submatcher.has_side_effects() + } + + fn finished_dir(&self, dir: &Path, matcher_io: &mut MatcherIO) { + self.submatcher.finished_dir(dir, matcher_io); + } + + fn finished(&self, matcher_io: &mut MatcherIO) { + self.submatcher.finished(matcher_io); + } + } + } + mod ls { + // This file is part of the uutils findutils package. + // + // For the full copyright and license information, please view the LICENSE + // file that was distributed with this source code. + + use std::{fs::File, io::Write}; + + use chrono::DateTime; + + use super::{Matcher, MatcherIO, WalkEntry}; + + #[cfg(unix)] + fn format_permissions(mode: uucore::libc::mode_t) -> String { + let file_type = match mode & (uucore::libc::S_IFMT as uucore::libc::mode_t) { + uucore::libc::S_IFDIR => "d", + uucore::libc::S_IFREG => "-", + _ => "?", + }; + + // S_$$USR means "user permissions" + let user_perms = format!( + "{}{}{}", + if mode & uucore::libc::S_IRUSR != 0 { + "r" + } else { + "-" + }, + if mode & uucore::libc::S_IWUSR != 0 { + "w" + } else { + "-" + }, + if mode & uucore::libc::S_IXUSR != 0 { + "x" + } else { + "-" + } + ); + + // S_$$GRP means "group permissions" + let group_perms = format!( + "{}{}{}", + if mode & uucore::libc::S_IRGRP != 0 { + "r" + } else { + "-" + }, + if mode & uucore::libc::S_IWGRP != 0 { + "w" + } else { + "-" + }, + if mode & uucore::libc::S_IXGRP != 0 { + "x" + } else { + "-" + } + ); + + // S_$$OTH means "other permissions" + let other_perms = format!( + "{}{}{}", + if mode & uucore::libc::S_IROTH != 0 { + "r" + } else { + "-" + }, + if mode & uucore::libc::S_IWOTH != 0 { + "w" + } else { + "-" + }, + if mode & uucore::libc::S_IXOTH != 0 { + "x" + } else { + "-" + } + ); + + format!("{}{}{}{}", file_type, user_perms, group_perms, other_perms) + } + + #[cfg(windows)] + fn format_permissions(file_attributes: u32) -> String { + let mut attributes = Vec::new(); + + // https://learn.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants + if file_attributes & 0x0001 != 0 { + attributes.push("read-only"); + } + if file_attributes & 0x0002 != 0 { + attributes.push("hidden"); + } + if file_attributes & 0x0004 != 0 { + attributes.push("system"); + } + if file_attributes & 0x0020 != 0 { + attributes.push("archive"); + } + if file_attributes & 0x0040 != 0 { + attributes.push("compressed"); + } + if file_attributes & 0x0080 != 0 { + attributes.push("offline"); + } + + attributes.join(", ") + } + + pub struct Ls { + output_file: Option, + } + + impl Ls { + pub fn new(output_file: Option) -> Self { + Self { output_file } + } + + #[cfg(unix)] + fn print( + &self, + file_info: &WalkEntry, + matcher_io: &mut MatcherIO, + mut out: impl Write, + print_error_message: bool, + ) { + use std::os::unix::fs::{MetadataExt, PermissionsExt}; + + use nix::unistd::{Gid, Group, Uid, User}; + + let metadata = file_info.metadata().unwrap(); + + let inode_number = metadata.ino(); + let number_of_blocks = { + let size = metadata.size(); + let number_of_blocks = size / 1024; + let remainder = number_of_blocks % 4; + + if remainder == 0 { + if number_of_blocks == 0 { + 4 + } else { + number_of_blocks + } + } else { + number_of_blocks + (4 - (remainder)) + } + }; + let permission = + { format_permissions(metadata.permissions().mode() as uucore::libc::mode_t) }; + let hard_links = metadata.nlink(); + let user = { + let uid = metadata.uid(); + User::from_uid(Uid::from_raw(uid)).unwrap().unwrap().name + }; + let group = { + let gid = metadata.gid(); + Group::from_gid(Gid::from_raw(gid)).unwrap().unwrap().name + }; + let size = metadata.size(); + let last_modified = { + let system_time = metadata.modified().unwrap(); + let now_utc: DateTime = system_time.into(); + now_utc.format("%b %e %H:%M") + }; + let path = file_info.display_path().to_string_lossy(); + + match writeln!( + out, + " {:<4} {:>6} {:<10} {:>3} {:<8} {:<8} {:>8} {} {}", + inode_number, + number_of_blocks, + permission, + hard_links, + user, + group, + size, + last_modified, + path, + ) { + Ok(_) => {}, + Err(e) => { + if print_error_message { + writeln!( + &mut matcher_io.host().stderr, + "Error writing {:?} for {}", + file_info.display_path().to_string_lossy(), + e + ) + .unwrap(); + matcher_io.set_exit_code(1); + } + }, + } + } + + #[cfg(windows)] + fn print( + &self, + file_info: &WalkEntry, + matcher_io: &mut MatcherIO, + mut out: impl Write, + print_error_message: bool, + ) { + use std::os::windows::fs::MetadataExt; + + let metadata = file_info.metadata().unwrap(); + + let inode_number = 0; + let number_of_blocks = { + let size = metadata.file_size(); + let number_of_blocks = size / 1024; + let remainder = number_of_blocks % 4; + + if remainder == 0 { + if number_of_blocks == 0 { + 4 + } else { + number_of_blocks + } + } else { + number_of_blocks + (4 - (remainder)) + } + }; + let permission = { format_permissions(metadata.file_attributes()) }; + let hard_links = 0; + let user = 0; + let group = 0; + let size = metadata.file_size(); + let last_modified = { + let system_time = metadata.modified().unwrap(); + let now_utc: DateTime = system_time.into(); + now_utc.format("%b %e %H:%M") + }; + let path = file_info.display_path().to_string_lossy(); + + match write!( + out, + " {:<4} {:>6} {:<10} {:>3} {:<8} {:<8} {:>8} {} {}\n", + inode_number, + number_of_blocks, + permission, + hard_links, + user, + group, + size, + last_modified, + path, + ) { + Ok(_) => {}, + Err(e) => { + if print_error_message { + writeln!( + &mut matcher_io.host().stderr, + "Error writing {:?} for {}", + file_info.display_path().to_string_lossy(), + e + ) + .unwrap(); + matcher_io.set_exit_code(1); + } + }, + } + } + } + + impl Matcher for Ls { + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + if let Some(file) = &self.output_file { + self.print(file_info, matcher_io, file, true); + } else { + self.print(file_info, matcher_io, &mut *matcher_io.deps.get_output().borrow_mut(), false); + } + true + } + + fn has_side_effects(&self) -> bool { + true + } + } + } + mod name { + // Copyright 2017 Google Inc. + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + use super::{Matcher, MatcherIO, WalkEntry, glob::Pattern}; + + /// This matcher makes a comparison of the name against a shell wildcard + /// pattern. See `glob::Pattern` for details on the exact syntax. + pub struct NameMatcher { + pattern: Pattern, + } + + impl NameMatcher { + pub fn new(pattern_string: &str, caseless: bool) -> Self { + let pattern = Pattern::new(pattern_string, caseless); + Self { pattern } + } + } + + impl Matcher for NameMatcher { + fn matches(&self, file_info: &WalkEntry, _: &mut MatcherIO) -> bool { + let name = file_info.file_name().to_string_lossy(); + + #[cfg(unix)] + if name.len() > 1 && name.chars().all(|x| x == '/') { + self.pattern.matches("/") + } else { + self.pattern.matches(&name) + } + + #[cfg(windows)] + self.pattern.matches(&name) + } + } + } + mod path { + // Copyright 2017 Google Inc. + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + use super::{Matcher, MatcherIO, WalkEntry, glob::Pattern}; + + /// This matcher makes a comparison of the path against a shell wildcard + /// pattern. See `glob::Pattern` for details on the exact syntax. + pub struct PathMatcher { + pattern: Pattern, + } + + impl PathMatcher { + pub fn new(pattern_string: &str, caseless: bool) -> Self { + let pattern = Pattern::new(pattern_string, caseless); + Self { pattern } + } + } + + impl Matcher for PathMatcher { + fn matches(&self, file_info: &WalkEntry, _: &mut MatcherIO) -> bool { + let path = file_info.display_path().to_string_lossy(); + self.pattern.matches(&path) + } + } + } + mod perm { + // Copyright 2017 Google Inc. + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + //! find's permission matching uses a very unix-centric approach, that would + //! be tricky to both implement and use on a windows platform. So we don't + //! even try. + + use std::{error::Error, io::Write}; + + #[cfg(unix)] + use uucore::mode::{parse_numeric, parse_symbolic}; + + use super::{Matcher, MatcherIO, WalkEntry}; + + #[derive(Clone, Copy, Debug, Eq, PartialEq)] + #[cfg(unix)] + pub enum ComparisonType { + /// mode bits have to match exactly + Exact, + /// all specified mode bits must be set. Others can be as well + AtLeast, + /// at least one of the specified bits must be set (or if no bits are + /// specified then any mode will match) + AnyOf, + } + + #[cfg(unix)] + impl ComparisonType { + fn mode_bits_match(self, pattern: u32, value: u32) -> bool { + match self { + Self::Exact => (0o7777 & value) == pattern, + Self::AtLeast => (value & pattern) == pattern, + Self::AnyOf => pattern == 0 || (value & pattern) > 0, + } + } + } + + #[cfg(unix)] + mod parsing { + use super::{ComparisonType, Error, parse_numeric, parse_symbolic}; + + pub fn split_comparison_type(pattern: &str) -> (ComparisonType, &str) { + let mut chars = pattern.chars(); + + match chars.next() { + Some('-') => (ComparisonType::AtLeast, chars.as_str()), + Some('/') => (ComparisonType::AnyOf, chars.as_str()), + _ => (ComparisonType::Exact, pattern), + } + } + + pub fn parse_mode(pattern: &str, for_dir: bool) -> Result> { + let mode = if pattern.contains(|c: char| c.is_ascii_digit()) { + parse_numeric(0, pattern, for_dir)? + } else { + let mut mode = 0; + for chunk in pattern.split(',') { + mode = parse_symbolic(mode, chunk, 0, for_dir)?; + } + mode + }; + Ok(mode) + } + } + + #[cfg(unix)] + #[derive(Debug)] + pub struct PermMatcher { + comparison_type: ComparisonType, + file_pattern: u32, + dir_pattern: u32, + } + + #[cfg(not(unix))] + pub struct PermMatcher {} + + impl PermMatcher { + #[cfg(unix)] + pub fn new(pattern: &str) -> Result> { + let (comparison_type, pattern) = parsing::split_comparison_type(pattern); + let file_pattern = parsing::parse_mode(pattern, false)?; + let dir_pattern = parsing::parse_mode(pattern, false)?; + Ok(Self { comparison_type, file_pattern, dir_pattern }) + } + + #[cfg(not(unix))] + pub fn new(_dummy_pattern: &str) -> Result> { + Err(From::from("Permission matching is not available on this platform")) + } + } + + impl Matcher for PermMatcher { + #[cfg(unix)] + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + use std::os::unix::fs::PermissionsExt; + match file_info.metadata() { + Ok(metadata) => { + let pattern = if metadata.is_dir() { + self.dir_pattern + } else { + self.file_pattern + }; + self + .comparison_type + .mode_bits_match(pattern, metadata.permissions().mode()) + }, + Err(e) => { + writeln!( + &mut matcher_io.host().stderr, + "Error getting permissions for {}: {}", + file_info.path().to_string_lossy(), + e + ) + .unwrap(); + false + }, + } + } + + #[cfg(not(unix))] + fn matches(&self, _dummy_file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + writeln!(&mut matcher_io.host().stderr, "Permission matching not available on this platform!").unwrap(); + return false; + } + } + } + mod printer { + // Copyright 2017 Google Inc. + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + use std::{fs::File, io::Write}; + + + use super::{Matcher, MatcherIO, WalkEntry}; + + pub enum PrintDelimiter { + Newline, + Null, + } + + impl std::fmt::Display for PrintDelimiter { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Newline => writeln!(f), + Self::Null => write!(f, "\0"), + } + } + } + + /// This matcher just prints the name of the file to stdout. + pub struct Printer { + delimiter: PrintDelimiter, + output_file: Option, + } + + impl Printer { + pub fn new(delimiter: PrintDelimiter, output_file: Option) -> Self { + Self { delimiter, output_file } + } + + fn print( + &self, + file_info: &WalkEntry, + matcher_io: &mut MatcherIO, + mut out: impl Write, + print_error_message: bool, + ) { + match write!(out, "{}{}", file_info.display_path().to_string_lossy(), self.delimiter) { + Ok(_) => {}, + Err(e) => { + if print_error_message { + writeln!( + &mut matcher_io.host().stderr, + "Error writing {:?} for {}", + file_info.display_path().to_string_lossy(), + e + ) + .unwrap(); + matcher_io.set_exit_code(1); + } + }, + } + out.flush().unwrap(); + } + } + + impl Matcher for Printer { + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + if let Some(file) = &self.output_file { + self.print(file_info, matcher_io, file, true); + } else { + self.print(file_info, matcher_io, &mut *matcher_io.deps.get_output().borrow_mut(), false); + } + true + } + + fn has_side_effects(&self) -> bool { + true + } + } + } + mod printf { + // Copyright 2021 Collabora, Ltd. + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + #[cfg(unix)] + use std::os::unix::prelude::MetadataExt; + use std::{ + borrow::Cow, + error::Error, + fs::{self, File}, + io::Write, + path::Path, + time::SystemTime, + }; + + use chrono::{DateTime, Local, format::StrftimeItems}; + + use super::{FileType, Matcher, MatcherIO, WalkEntry, WalkError}; + + const STANDARD_BLOCK_SIZE: u64 = 512; + + #[derive(Debug, PartialEq, Eq)] + enum Justify { + Left, + Right, + } + + #[derive(Debug, PartialEq, Eq)] + enum TimeFormat { + /// Follow ctime(3). + Ctime, + /// Seconds since the epoch, as a float w/ nanosecond part. + SinceEpoch, + /// Follow strftime-compatible syntax + Strftime(String), + } + + impl TimeFormat { + fn apply(&self, time: SystemTime) -> Result, Box> { + let formatted = match self { + Self::SinceEpoch => { + let duration = time.duration_since(SystemTime::UNIX_EPOCH)?; + format!("{}.{:09}0", duration.as_secs(), duration.subsec_nanos()) + }, + Self::Ctime => { + const CTIME_FORMAT: &str = "%a %b %d %H:%M:%S.%f0 %Y"; + + DateTime::::from(time) + .format(CTIME_FORMAT) + .to_string() + }, + Self::Strftime(format) => { + // Handle a special case + let custom_format = format.replace("%+", "%Y-%m-%d+%H:%M:%S%.f0"); + DateTime::::from(time) + .format(&custom_format) + .to_string() + }, + }; + + Ok(formatted.into()) + } + } + + #[derive(Debug, PartialEq, Eq)] + enum PermissionsFormat { + Octal, + // trwxrwxrwx + Symbolic, + } + + /// A single % directive in a format string. + #[derive(Debug, PartialEq, Eq)] + enum FormatDirective { + // %a, %Ak + AccessTime(TimeFormat), + // %b, %k + Blocks { large_blocks: bool }, + // %c, %Ck + ChangeTime(TimeFormat), + // %d + Depth, + // %D + Device, + // %f + Basename, + // %F + Filesystem, + // %g, %G + Group { as_name: bool }, + // %h + Dirname, + // %H + StartingPoint, + // %i + Inode, + // %l + SymlinkTarget, + // %m + Permissions(PermissionsFormat), + // %n + HardlinkCount, + // %p, %P + Path { strip_starting_point: bool }, + // %s + Size, + // %S + Sparseness, + // %t, %Tk + ModificationTime(TimeFormat), + // %u, %U + User { as_name: bool }, + // %y, %Y + Type { follow_links: bool }, + } + + /// A component in a full format string. + #[derive(Debug, PartialEq, Eq)] + enum FormatComponent { + Literal(String), + Flush, + Directive { directive: FormatDirective, width: Option, justify: Justify }, + } + + struct FormatStringParser<'a> { + string: &'a str, + } + + impl FormatStringParser<'_> { + fn front(&self) -> Result> { + self + .string + .chars() + .next() + .ok_or_else(|| "Unexpected EOF".into()) + } + + fn peek(&self, count: usize) -> Result<&str, Box> { + if self.string.len() < count { + return Err("Unexpected EOF".into()); + } + + Ok(&self.string[0..count]) + } + + fn advance_one(&mut self) -> Result> { + let c = self.front()?; + self.string = &self.string[1..]; + Ok(c) + } + + fn advance_by(&mut self, count: usize) -> Result<&str, Box> { + self.peek(count)?; + + let skipped = &self.string[0..count]; + self.string = &self.string[count..]; + Ok(skipped) + } + + fn parse_escape_sequence(&mut self) -> Result> { + const OCTAL_LEN: usize = 3; + const OCTAL_RADIX: u32 = 8; + + // Try parsing an octal sequence first. + let first = self.front()?; + if first.is_digit(OCTAL_RADIX) + && let Ok(code) = self.peek(OCTAL_LEN).and_then(|octal| { + u32::from_str_radix(octal, OCTAL_RADIX).map_err(std::convert::Into::into) + }) { + // safe to unwrap: .peek() already succeeded above. + let octal = self.advance_by(OCTAL_LEN).unwrap(); + return match char::from_u32(code) { + Some(c) => Ok(FormatComponent::Literal(c.to_string())), + None => Err(format!("Invalid character value: \\{octal}").into()), + }; + } + + self.advance_one()?; + + if first == 'c' { + Ok(FormatComponent::Flush) + } else { + let c = match first { + 'a' => "\x07", + 'b' => "\x08", + 'f' => "\x0C", + 'n' => "\n", + 'r' => "\r", + 't' => "\t", + 'v' => "\x0B", + '0' => "\0", + '\\' => "\\", + c => return Err(format!("Invalid escape sequence: \\{c}").into()), + }; + + Ok(FormatComponent::Literal(c.to_string())) + } + } + + fn parse_format_width(&mut self) -> Option { + let start = self.string; + let mut digits = 0; + + while self.front().map(|c| c.is_ascii_digit()).unwrap_or(false) { + digits += 1; + // safe to unwrap: the front() check already succeeded above. + self.advance_one().unwrap(); + } + + if digits > 0 { + // safe to unwrap: we already know all the digits are valid due to + // the above checks. + Some((start[0..digits]).parse().unwrap()) + } else { + None + } + } + + fn parse_time_specifier(&mut self, first: char) -> Result> { + match self.advance_one()? { + '@' => Ok(TimeFormat::SinceEpoch), + 'S' => Ok(TimeFormat::Strftime("%S.%f0".to_string())), + c => { + // We can't store the parsed items inside TimeFormat, because the items + // take a reference to the full format string, but we still try to parse + // it here so that errors get caught early. + let format = format!("%{c}"); + match StrftimeItems::new(&format).next() { + None | Some(chrono::format::Item::Error) => { + Err(format!("Invalid time specifier: %{first}{c}").into()) + }, + Some(_item) => Ok(TimeFormat::Strftime(format)), + } + }, + } + } + + fn parse_format_specifier(&mut self) -> Result> { + let mut justify = Justify::Right; + loop { + match self.front()? { + ' ' => (), + '-' => justify = Justify::Left, + _ => break, + } + + // safe to unwrap: .front() already succeeded above. + self.advance_one().unwrap(); + } + + let width = self.parse_format_width(); + + let first = self.advance_one()?; + if first == '%' { + return Ok(FormatComponent::Literal("%".to_owned())); + } + + let directive = match first { + 'a' => FormatDirective::AccessTime(TimeFormat::Ctime), + 'A' => FormatDirective::AccessTime(self.parse_time_specifier(first)?), + 'b' => FormatDirective::Blocks { large_blocks: false }, + 'c' => FormatDirective::ChangeTime(TimeFormat::Ctime), + 'C' => FormatDirective::ChangeTime(self.parse_time_specifier(first)?), + 'd' => FormatDirective::Depth, + 'D' => FormatDirective::Device, + 'f' => FormatDirective::Basename, + 'F' => FormatDirective::Filesystem, + 'g' => FormatDirective::Group { as_name: true }, + 'G' => FormatDirective::Group { as_name: false }, + 'h' => FormatDirective::Dirname, + 'H' => FormatDirective::StartingPoint, + 'k' => FormatDirective::Blocks { large_blocks: true }, + 'i' => FormatDirective::Inode, + 'l' => FormatDirective::SymlinkTarget, + 'm' => FormatDirective::Permissions(PermissionsFormat::Octal), + 'M' => FormatDirective::Permissions(PermissionsFormat::Symbolic), + 'n' => FormatDirective::HardlinkCount, + 'p' => FormatDirective::Path { strip_starting_point: false }, + 'P' => FormatDirective::Path { strip_starting_point: true }, + 's' => FormatDirective::Size, + 'S' => FormatDirective::Sparseness, + 't' => FormatDirective::ModificationTime(TimeFormat::Ctime), + 'T' => FormatDirective::ModificationTime(self.parse_time_specifier(first)?), + 'u' => FormatDirective::User { as_name: true }, + 'U' => FormatDirective::User { as_name: false }, + 'y' => FormatDirective::Type { follow_links: false }, + 'Y' => FormatDirective::Type { follow_links: true }, + // TODO: %Z + _ => return Ok(FormatComponent::Literal(first.to_string())), + }; + + Ok(FormatComponent::Directive { directive, width, justify }) + } + + pub fn parse(&mut self) -> Result> { + let mut components = vec![]; + + while let Some(i) = self.string.find(['%', '\\']) { + if i > 0 { + // safe to unwrap: i is an index into the string, so it cannot + // be any shorter. + let literal = self.advance_by(i).unwrap(); + if !literal.is_empty() { + components.push(FormatComponent::Literal(literal.to_owned())); + } + } + + // safe to unwrap: we've only advanced as far as 'i', which is right + // before the character it identified. + let component = match self.advance_one().unwrap() { + '\\' => self.parse_escape_sequence()?, + '%' => self.parse_format_specifier()?, + _ => panic!("{}", "Stopped at unexpected character: {self.string}"), + }; + components.push(component); + } + + if !self.string.is_empty() { + components.push(FormatComponent::Literal(self.string.to_owned())); + } + + Ok(FormatString { components }) + } + } + + struct FormatString { + components: Vec, + } + + impl FormatString { + fn parse(string: &str) -> Result> { + FormatStringParser { string }.parse() + } + } + + fn get_starting_point(file_info: &WalkEntry) -> &Path { + file_info + .display_path() + .ancestors() + .nth(file_info.depth()) + // safe to unwrap: the file's depth should never be longer than its path + // (...right?). + .unwrap() + } + + fn format_non_link_file_type(file_type: FileType) -> char { + match file_type { + FileType::Regular => 'f', + FileType::Directory => 'd', + FileType::BlockDevice => 'b', + FileType::CharDevice => 'c', + FileType::Fifo => 'p', + FileType::Socket => 's', + _ => 'U', + } + } + + fn format_directive<'entry>( + file_info: &'entry WalkEntry, + directive: &FormatDirective, + ) -> Result, Box> { + let meta = || file_info.metadata(); + + // NOTE ON QUOTING: + // GNU find's man page claims that several directives that print names (like + // %f) are quoted like ls; however, I could not reproduce this at all in + // practice, thus the set of rules is undoubtedly very different (if this is + // still done at all). + + let res: Cow<'entry, str> = match directive { + FormatDirective::AccessTime(tf) => tf.apply(meta()?.accessed()?)?, + + FormatDirective::Basename => file_info.file_name().to_string_lossy(), + + FormatDirective::Blocks { large_blocks } => { + #[cfg(unix)] + let blocks = meta()?.blocks(); + #[cfg(not(unix))] + // Estimate using a ceiling division by the block size. + let blocks = (meta()?.len() + STANDARD_BLOCK_SIZE - 1) / STANDARD_BLOCK_SIZE; + + // GNU find says it returns the number of 512-byte blocks for %b, + // but in reality it just returns the number of blocks, *regardless + // of their size on the filesystem*. That behavior is copied here, + // even though it's arguably not 100% correct. + if *large_blocks { + // Ceiling divide in half. + blocks.div_ceil(2) + } else { + blocks + } + .to_string() + .into() + }, + + #[cfg(not(unix))] + FormatDirective::ChangeTime(tf) => tf.apply(meta()?.modified()?)?, + #[cfg(unix)] + FormatDirective::ChangeTime(tf) => { + use std::time::Duration; + + let meta = meta()?; + let ctime = SystemTime::UNIX_EPOCH + + Duration::from_secs(meta.ctime() as u64) + + Duration::from_nanos(meta.ctime_nsec() as u64); + tf.apply(ctime)? + }, + + FormatDirective::Depth => file_info.depth().to_string().into(), + + #[cfg(not(unix))] + FormatDirective::Device => "0".into(), + #[cfg(unix)] + FormatDirective::Device => meta()?.dev().to_string().into(), + + // GNU find's behavior for this is a bit...odd: + // - Both the root directory and the paths immediately underneath return an empty string + // - Any path without any slashes (i.e. relative to cwd) returns "." + // - "." also returns "." + // - ".." returns "." (???) + // These are all (thankfully) documented on the find(1) man page. + FormatDirective::Dirname => match file_info.display_path().parent() { + None => "".into(), + Some(p) if p == Path::new("/") => "".into(), + Some(p) if p == Path::new("") => ".".into(), + Some(parent) => parent.to_string_lossy(), + }, + + #[cfg(not(unix))] + FormatDirective::Filesystem => "".into(), + #[cfg(unix)] + FormatDirective::Filesystem => { + let dev_id = meta()?.dev().to_string(); + let fs_list = uucore::fsext::read_fs_list().expect("Could not find the filesystem info"); + fs_list + .into_iter() + .find(|fs| fs.dev_id == dev_id) + .map_or_else(String::new, |fs| fs.fs_type) + .into() + }, + + #[cfg(not(unix))] + FormatDirective::Group { .. } => "0".into(), + #[cfg(unix)] + FormatDirective::Group { as_name } => { + let gid = meta()?.gid(); + if *as_name { + uucore::entries::gid2grp(gid).unwrap_or_else(|_| gid.to_string()) + } else { + gid.to_string() + } + .into() + }, + + #[cfg(not(unix))] + FormatDirective::HardlinkCount => "0".into(), + #[cfg(unix)] + FormatDirective::HardlinkCount => meta()?.nlink().to_string().into(), + + #[cfg(not(unix))] + FormatDirective::Inode => "0".into(), + #[cfg(unix)] + FormatDirective::Inode => meta()?.ino().to_string().into(), + + FormatDirective::ModificationTime(tf) => tf.apply(meta()?.modified()?)?, + + FormatDirective::Path { strip_starting_point } => file_info + .display_path() + .strip_prefix(if *strip_starting_point { + get_starting_point(file_info) + } else { + Path::new("") + }) + // safe to unwrap: the prefix is derived *from* the path to begin + // with, so it cannot be invalid. + .unwrap() + .to_string_lossy(), + + FormatDirective::Permissions(PermissionsFormat::Symbolic) => { + uucore::fs::display_permissions(meta()?, true).into() + }, + #[cfg(not(unix))] + FormatDirective::Permissions(PermissionsFormat::Octal) => "777".into(), + #[cfg(unix)] + FormatDirective::Permissions(PermissionsFormat::Octal) => { + format!("{:>03o}", meta()?.mode() & 0o777).into() + }, + + FormatDirective::Size => meta()?.len().to_string().into(), + + #[cfg(not(unix))] + FormatDirective::Sparseness => "1.0".into(), + #[cfg(unix)] + FormatDirective::Sparseness => { + let meta = meta()?; + + if meta.len() > 0 { + format!( + "{:.1}", + // GNU find hardcodes a block size of 512 bytes, regardless + // of the true filesystem block size. + (meta.blocks() * STANDARD_BLOCK_SIZE) as f64 / (meta.len() as f64) + ) + .into() + } else { + "1.0".into() + } + }, + + FormatDirective::StartingPoint => get_starting_point(file_info).to_string_lossy(), + + FormatDirective::SymlinkTarget => { + if file_info.path_is_symlink() { + fs::read_link(file_info.path())? + .to_string_lossy() + .into_owned() + .into() + } else { + "".into() + } + }, + + FormatDirective::Type { follow_links } => if file_info.path_is_symlink() { + if *follow_links { + match file_info.path().metadata().map_err(WalkError::from) { + Ok(meta) => format_non_link_file_type(meta.file_type().into()), + Err(e) if e.is_not_found() => 'N', + Err(e) if e.is_loop() => 'L', + Err(_) => '?', + } + } else { + 'l' + } + } else { + format_non_link_file_type(file_info.file_type()) + } + .to_string() + .into(), + + #[cfg(not(unix))] + FormatDirective::User { .. } => "0".into(), + #[cfg(unix)] + FormatDirective::User { as_name } => { + let uid = meta()?.uid(); + if *as_name { + uucore::entries::uid2usr(uid).unwrap_or_else(|_| uid.to_string()) + } else { + uid.to_string() + } + .into() + }, + }; + + Ok(res) + } + + /// This matcher prints information about its files to stdout, following GNU + /// find's printf syntax. + pub struct Printf { + format: FormatString, + output_file: Option, + } + + impl Printf { + pub fn new(format: &str, output_file: Option) -> Result> { + Ok(Self { format: FormatString::parse(format)?, output_file }) + } + + fn print(&self, file_info: &WalkEntry, mut out: impl Write, mut err: impl Write) { + for component in &self.format.components { + match component { + FormatComponent::Literal(literal) => write!(out, "{literal}").unwrap(), + FormatComponent::Flush => out.flush().unwrap(), + FormatComponent::Directive { directive, width, justify } => { + match format_directive(file_info, directive) { + Ok(content) => { + if let Some(width) = width { + match justify { + Justify::Left => { + write!(out, "{content: { + write!(out, "{content:>width$}").unwrap(); + }, + } + } else { + write!(out, "{content}").unwrap(); + } + }, + Err(e) => { + let _ = writeln!( + err, + "Error processing '{}': {}", + file_info.path().to_string_lossy(), + e + ); + break; + }, + } + }, + } + } + } + } + + impl Matcher for Printf { + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + let err = matcher_io.host().stderr_clone(); + if let Some(file) = &self.output_file { + self.print(file_info, file, err); + } else { + self.print(file_info, &mut *matcher_io.deps.get_output().borrow_mut(), err); + } + + true + } + + fn has_side_effects(&self) -> bool { + true + } + } + } + mod prune { + // Copyright 2017 Google Inc. + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + use super::{Matcher, MatcherIO, WalkEntry}; + + /// This matcher checks the type of the file. + pub struct PruneMatcher; + + impl PruneMatcher { + pub fn new() -> Self { + Self {} + } + } + + impl Matcher for PruneMatcher { + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + if file_info.file_type().is_dir() { + matcher_io.mark_current_dir_to_be_skipped(); + } + + true + } + } + } + mod quit { + // Copyright 2017 Tavian Barnes + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + use super::{Matcher, MatcherIO, WalkEntry}; + + /// This matcher quits the search immediately. + pub struct QuitMatcher; + + impl Matcher for QuitMatcher { + fn matches(&self, _: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + matcher_io.quit(); + true + } + } + } + mod regex { + // Copyright 2022 Collabora, Ltd. + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + use std::{error::Error, fmt, str::FromStr}; + + use onig::{Regex, RegexOptions, Syntax}; + + use super::{Matcher, MatcherIO, WalkEntry}; + + #[derive(Debug)] + pub struct ParseRegexTypeError(String); + + impl Error for ParseRegexTypeError {} + + impl fmt::Display for ParseRegexTypeError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "Invalid regex type: {} (must be one of {})", + self.0, + RegexType::VALUES + .iter() + .map(|t| format!("'{t}'")) + .collect::>() + .join(", ") + ) + } + } + + #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] + pub enum RegexType { + #[default] + Emacs, + Grep, + PosixBasic, + PosixExtended, + } + + impl RegexType { + pub const VALUES: &'static [Self] = + &[Self::Emacs, Self::Grep, Self::PosixBasic, Self::PosixExtended]; + } + + impl fmt::Display for RegexType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Emacs => write!(f, "emacs"), + Self::Grep => write!(f, "grep"), + Self::PosixBasic => write!(f, "posix-basic"), + Self::PosixExtended => write!(f, "posix-extended"), + } + } + } + + impl FromStr for RegexType { + type Err = ParseRegexTypeError; + + fn from_str(s: &str) -> Result { + match s { + "emacs" => Ok(Self::Emacs), + "grep" => Ok(Self::Grep), + "posix-basic" => Ok(Self::PosixBasic), + "posix-extended" => Ok(Self::PosixExtended), + // ed and sed are the same as posix-basic + "ed" | "sed" => Ok(Self::PosixBasic), + _ => Err(ParseRegexTypeError(s.to_owned())), + } + } + } + + pub struct RegexMatcher { + regex: Regex, + } + + impl RegexMatcher { + pub fn new( + regex_type: RegexType, + pattern: &str, + ignore_case: bool, + ) -> Result> { + let syntax = match regex_type { + RegexType::Emacs => Syntax::emacs(), + RegexType::Grep => Syntax::grep(), + RegexType::PosixBasic => Syntax::posix_basic(), + RegexType::PosixExtended => Syntax::posix_extended(), + }; + + let regex = Regex::with_options( + pattern, + if ignore_case { + RegexOptions::REGEX_OPTION_IGNORECASE + } else { + RegexOptions::REGEX_OPTION_NONE + }, + syntax, + )?; + Ok(Self { regex }) + } + } + + impl Matcher for RegexMatcher { + fn matches(&self, file_info: &WalkEntry, _: &mut MatcherIO) -> bool { + self + .regex + .is_match(file_info.display_path().to_string_lossy().as_ref()) + } + } + } + mod samefile { + // This file is part of the uutils findutils package. + // + // For the full copyright and license information, please view the LICENSE + // file that was distributed with this source code. + + use std::{error::Error, path::Path}; + + use uucore::fs::FileInformation; + + use super::{Follow, Matcher, MatcherIO, WalkEntry, WalkError}; + use crate::host::Host; + + pub struct SameFileMatcher { + info: FileInformation, + } + + /// Gets FileInformation, possibly following symlinks, but falling back on + /// broken links. + fn get_file_info(path: &Path, follow: bool) -> Result { + if follow { + let result = FileInformation::from_path(path, true).map_err(WalkError::from); + + match result { + Ok(info) => return Ok(info), + Err(e) if !e.is_not_found() => return Err(e), + _ => {}, + } + } + + Ok(FileInformation::from_path(path, false)?) + } + + impl SameFileMatcher { + pub fn new(path: impl AsRef, follow: Follow, host: &Host) -> Result> { + let info = get_file_info(&host.resolve(path.as_ref()), follow != Follow::Never)?; + Ok(Self { info }) + } + } + + impl Matcher for SameFileMatcher { + fn matches(&self, file_info: &WalkEntry, _matcher_io: &mut MatcherIO) -> bool { + if let Ok(info) = get_file_info(file_info.path(), file_info.follow()) { + info == self.info + } else { + false + } + } + } + } + mod size { + // Copyright 2017 Google Inc. + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + use std::{error::Error, io::Write, str::FromStr}; + + + use super::{ComparableValue, Matcher, MatcherIO, WalkEntry}; + + #[derive(Clone, Copy, Debug)] + enum Unit { + Byte, + TwoByteWord, + Block, + KibiByte, + MebiByte, + GibiByte, + } + + impl FromStr for Unit { + type Err = Box; + + fn from_str(s: &str) -> Result> { + Ok(match s { + "c" => Self::Byte, + "w" => Self::TwoByteWord, + "" | "b" => Self::Block, + "k" => Self::KibiByte, + "M" => Self::MebiByte, + "G" => Self::GibiByte, + _ => { + return Err(From::from(format!( + "Invalid suffix {s} for -size. Only allowed values are , b, c, w, k, M or \ + G" + ))); + }, + }) + } + } + + fn byte_size_to_unit_size(unit: Unit, byte_size: u64) -> u64 { + // Short circuit (to avoid a overflow error when subtracting 1 later on) + if byte_size == 0 { + return 0; + } + let bits_to_shift = match unit { + Unit::Byte => 0, + Unit::TwoByteWord => 1, + Unit::Block => 9, + Unit::KibiByte => 10, + Unit::MebiByte => 20, + Unit::GibiByte => 30, + }; + // Skip pointless arithmetic. + if bits_to_shift == 0 { + return byte_size; + } + // We want to round up (e.g. 1 byte - 1024 bytes = 1k. + // 1025 bytes to 2048 bytes = 2k etc. + ((byte_size - 1) >> bits_to_shift) + 1 + } + + /// Matcher that checks whether a file's size if {less than | equal to | more + /// than} N units in size. + pub struct SizeMatcher { + value_to_match: ComparableValue, + unit: Unit, + } + + impl SizeMatcher { + pub fn new( + value_to_match: ComparableValue, + suffix_string: &str, + ) -> Result> { + Ok(Self { unit: suffix_string.parse()?, value_to_match }) + } + } + + impl Matcher for SizeMatcher { + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + match file_info.metadata() { + Ok(metadata) => self + .value_to_match + .matches(byte_size_to_unit_size(self.unit, metadata.len())), + Err(e) => { + writeln!( + &mut matcher_io.host().stderr, + "Error getting file size for {}: {}", + file_info.path().to_string_lossy(), + e + ) + .unwrap(); + false + }, + } + } + } + } + #[cfg(unix)] + mod stat { + // Copyright 2022 Tavian Barnes + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + use std::os::unix::fs::MetadataExt; + + use super::{ComparableValue, Matcher, MatcherIO, WalkEntry}; + + /// Inode number matcher. + pub struct InodeMatcher { + ino: ComparableValue, + } + + impl InodeMatcher { + pub fn new(ino: ComparableValue) -> Self { + Self { ino } + } + } + + impl Matcher for InodeMatcher { + fn matches(&self, file_info: &WalkEntry, _: &mut MatcherIO) -> bool { + match file_info.metadata() { + Ok(metadata) => self.ino.matches(metadata.ino()), + Err(_) => false, + } + } + } + + /// Link count matcher. + pub struct LinksMatcher { + nlink: ComparableValue, + } + + impl LinksMatcher { + pub fn new(nlink: ComparableValue) -> Self { + Self { nlink } + } + } + + impl Matcher for LinksMatcher { + fn matches(&self, file_info: &WalkEntry, _: &mut MatcherIO) -> bool { + match file_info.metadata() { + Ok(metadata) => self.nlink.matches(metadata.nlink()), + Err(_) => false, + } + } + } + } + pub mod time { + // Copyright 2017 Google Inc. + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + #[cfg(unix)] + use std::os::unix::fs::MetadataExt; + use std::{ + error::Error, + fs::{self, Metadata}, + io::Write, + time::{Duration, SystemTime, UNIX_EPOCH}, + }; + + use chrono::{DateTime, Local, Timelike}; + + use super::{ComparableValue, Follow, Matcher, MatcherIO, WalkEntry}; + use crate::host::Host; + + const SECONDS_PER_DAY: i64 = 60 * 60 * 24; + + fn get_time(matcher_io: &mut MatcherIO, today_start: bool) -> SystemTime { + if today_start { + // the time at 00:00:00 of today + let duration_since_unix_epoch = matcher_io.now().duration_since(UNIX_EPOCH).unwrap(); + let seconds_since_unix_epoch = duration_since_unix_epoch.as_secs(); + let utc_time = DateTime::from_timestamp(seconds_since_unix_epoch as i64, 0).unwrap(); + let local_time = utc_time.with_timezone(&Local); + let seconds_since_last_midnight = local_time.num_seconds_from_midnight(); + let local_midnight_seconds = local_time.timestamp() - seconds_since_last_midnight as i64; + + UNIX_EPOCH + Duration::from_secs(local_midnight_seconds as u64) + } else { + matcher_io.now() + } + } + + /// This matcher checks whether a file is newer than the file the matcher is + /// initialized with. + pub struct NewerMatcher { + given_modification_time: SystemTime, + } + + impl NewerMatcher { + pub fn new(path_to_file: &str, follow: Follow, host: &Host) -> Result> { + let metadata = follow.root_metadata(host.resolve(path_to_file))?; + Ok(Self { given_modification_time: metadata.modified()? }) + } + + /// Implementation of matches that returns a result, allowing use to use try! + /// to deal with the errors. + fn matches_impl(&self, file_info: &WalkEntry) -> Result> { + let this_time = file_info.metadata()?.modified()?; + // duration_since returns an Ok duration if this_time <= given_modification_time + // and returns an Err (with a duration) otherwise. So if this_time > + // given_modification_time (in which case we want to return true) then + // duration_since will return an error. + Ok(self + .given_modification_time + .duration_since(this_time) + .is_err()) + } + } + + impl Matcher for NewerMatcher { + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + match self.matches_impl(file_info) { + Err(e) => { + writeln!( + &mut matcher_io.host().stderr, + "Error getting modification time for {}: {}", + file_info.path().to_string_lossy(), + e + ) + .unwrap(); + false + }, + Ok(t) => t, + } + } + } + + /// `-newerXY` option. + /// a is meaning Accessed time + /// B is meaning Birthed time + /// c is meaning Changed time + /// m is meaning Modified time + /// It should be noted that not every file system supports birthed time. + #[derive(Clone, Copy, Debug)] + pub enum NewerOptionType { + Accessed, + Birthed, + Changed, + Modified, + } + + impl NewerOptionType { + #[allow(clippy::should_implement_trait)] + pub fn from_str(option: &str) -> Self { + match option { + "a" => Self::Accessed, + "B" => Self::Birthed, + "c" => Self::Changed, + _ => Self::Modified, + } + } + + fn get_file_time(self, metadata: &Metadata) -> std::io::Result { + match self { + Self::Accessed => metadata.accessed(), + Self::Birthed => metadata.created(), + Self::Changed => metadata.changed(), + Self::Modified => metadata.modified(), + } + } + } + + /// This matcher checks whether the file is newer than the file time of any + /// combination of two comparison types from the target file's + /// `NewerOptionType`. + pub struct NewerOptionMatcher { + x_option: NewerOptionType, + y_option: NewerOptionType, + given_modification_time: SystemTime, + } + + impl NewerOptionMatcher { + pub fn new(x_option: &str, y_option: &str, path_to_file: &str, host: &Host) -> Result> { + let metadata = fs::metadata(host.resolve(path_to_file))?; + let x_option = NewerOptionType::from_str(x_option); + let y_option = NewerOptionType::from_str(y_option); + Ok(Self { x_option, y_option, given_modification_time: metadata.modified()? }) + } + + fn matches_impl(&self, file_info: &WalkEntry) -> Result> { + let x_option_time = self.x_option.get_file_time(file_info.metadata()?)?; + let y_option_time = self.y_option.get_file_time(file_info.metadata()?)?; + + Ok(self + .given_modification_time + .duration_since(x_option_time) + .is_err() + && self + .given_modification_time + .duration_since(y_option_time) + .is_err()) + } + } + + impl Matcher for NewerOptionMatcher { + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + match self.matches_impl(file_info) { + Err(e) => { + writeln!( + &mut matcher_io.host().stderr, + "Error getting {:?} and {:?} time for {}: {}", + self.x_option, + self.y_option, + file_info.path().to_string_lossy(), + e + ) + .unwrap(); + false + }, + Ok(t) => t, + } + } + } + + /// This matcher checks whether files's accessed|creation|modification time is + /// newer than the given times. + pub struct NewerTimeMatcher { + time: i64, + newer_time_type: NewerOptionType, + } + + impl NewerTimeMatcher { + pub fn new(newer_time_type: NewerOptionType, time: i64) -> Self { + Self { time, newer_time_type } + } + + fn matches_impl(&self, file_info: &WalkEntry) -> Result> { + let this_time = self.newer_time_type.get_file_time(file_info.metadata()?)?; + let timestamp = this_time + .duration_since(UNIX_EPOCH) + .unwrap_or_else(|e| e.duration()); + + // timestamp.as_millis() return u128 but time is i64 + // This may leave memory implications. :( + Ok(self.time + <= timestamp + .as_millis() + .try_into() + .expect("timestamp memory implications")) + } + } + + impl Matcher for NewerTimeMatcher { + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + match self.matches_impl(file_info) { + Err(e) => { + writeln!( + &mut matcher_io.host().stderr, + "Error getting {:?} time for {}: {}", + self.newer_time_type, + file_info.path().to_string_lossy(), + e + ) + .unwrap(); + false + }, + Ok(t) => t, + } + } + } + + /// Provide access to the *change* timestamp, since std::fs::Metadata doesn't + /// expose it. + pub trait ChangeTime { + /// Returns the time of the last change to the metadata. + fn changed(&self) -> std::io::Result; + } + + #[cfg(unix)] + impl ChangeTime for Metadata { + fn changed(&self) -> std::io::Result { + let ctime_sec = self.ctime(); + let ctime_nsec = self.ctime_nsec() as u32; + let ctime = if ctime_sec >= 0 { + UNIX_EPOCH + std::time::Duration::new(ctime_sec as u64, ctime_nsec) + } else { + UNIX_EPOCH - std::time::Duration::new(-ctime_sec as u64, ctime_nsec) + }; + Ok(ctime) + } + } + + #[cfg(not(unix))] + impl ChangeTime for Metadata { + fn changed(&self) -> std::io::Result { + // Rust's stdlib doesn't (yet) expose ChangeTime on Windows + // https://github.com/rust-lang/rust/issues/121478 + Err(std::io::Error::from(std::io::ErrorKind::Unsupported)) + } + } + + #[derive(Clone, Copy, Debug)] + pub enum FileTimeType { + Accessed, + Changed, + Modified, + } + + impl FileTimeType { + fn get_file_time(self, metadata: &Metadata) -> std::io::Result { + match self { + Self::Accessed => metadata.accessed(), + Self::Changed => metadata.changed(), + Self::Modified => metadata.modified(), + } + } + } + + /// This matcher checks whether a file's accessed|creation|modification time is + /// {less than | exactly | more than} N days old. + pub struct FileTimeMatcher { + days: ComparableValue, + file_time_type: FileTimeType, + today_start: bool, + } + + impl Matcher for FileTimeMatcher { + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + let start_time = get_time(matcher_io, self.today_start); + match self.matches_impl(file_info, start_time) { + Err(e) => { + writeln!( + &mut matcher_io.host().stderr, + "Error getting {:?} time for {}: {}", + self.file_time_type, + file_info.path().to_string_lossy(), + e + ) + .unwrap(); + false + }, + Ok(t) => t, + } + } + } + + impl FileTimeMatcher { + /// Implementation of matches that returns a result, allowing use to use try! + /// to deal with the errors. + fn matches_impl( + &self, + file_info: &WalkEntry, + start_time: SystemTime, + ) -> Result> { + let this_time = self.file_time_type.get_file_time(file_info.metadata()?)?; + let mut is_negative = false; + // durations can't be negative. So duration_since returns a duration + // wrapped in an error if now < this_time. + let age = match start_time.duration_since(this_time) { + Ok(duration) => duration, + Err(e) => { + is_negative = true; + e.duration() + }, + }; + let age_in_seconds: i64 = age.as_secs() as i64 * if is_negative { -1 } else { 1 }; + + // rust division truncates towards zero (see + // https://github.com/rust-lang/rust/blob/master/src/libcore/ops.rs#L580 ) + // so a simple age_in_seconds / SECONDS_PER_DAY gives the wrong answer + // for negative ages: a file whose age is 1 second in the future needs to + // count as -1 day old, not 0. + // If today_start is true, we should count it as 0 days old. + // because today is 00:00:00, so we need to subtract 1 day. + let negative_offset = if is_negative && !self.today_start { + -1 + } else { + 0 + }; + + let age_in_days = age_in_seconds / SECONDS_PER_DAY + negative_offset; + Ok(self.days.imatches(age_in_days)) + } + + pub fn new(file_time_type: FileTimeType, days: ComparableValue, today_start: bool) -> Self { + Self { days, file_time_type, today_start } + } + } + + pub struct FileAgeRangeMatcher { + minutes: ComparableValue, + file_time_type: FileTimeType, + today_start: bool, + } + + impl Matcher for FileAgeRangeMatcher { + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + let start_time = get_time(matcher_io, self.today_start); + match self.matches_impl(file_info, start_time) { + Err(e) => { + writeln!( + &mut matcher_io.host().stderr, + "Error getting {:?} time for {}: {}", + self.file_time_type, + file_info.path().to_string_lossy(), + e + ) + .unwrap(); + false + }, + Ok(t) => t, + } + } + } + + impl FileAgeRangeMatcher { + fn matches_impl( + &self, + file_info: &WalkEntry, + start_time: SystemTime, + ) -> Result> { + let this_time = self.file_time_type.get_file_time(file_info.metadata()?)?; + let mut is_negative = false; + let age = match start_time.duration_since(this_time) { + Ok(duration) => duration, + Err(e) => { + is_negative = true; + e.duration() + }, + }; + let age_in_seconds: i64 = age.as_secs() as i64 * if is_negative { -1 } else { 1 }; + let age_in_minutes = age_in_seconds / 60 + if is_negative { -1 } else { 0 }; + Ok(self.minutes.imatches(age_in_minutes)) + } + + pub fn new(file_time_type: FileTimeType, minutes: ComparableValue, today_start: bool) -> Self { + Self { minutes, file_time_type, today_start } + } + } + } + mod type_matcher { + // Copyright 2017 Google Inc. + // + // Use of this source code is governed by a MIT-style + // license that can be found in the LICENSE file or at + // https://opensource.org/licenses/MIT. + + use std::error::Error; + + use super::{FileType, Follow, Matcher, MatcherIO, WalkEntry}; + + /// This matcher checks the type of the file. + pub struct TypeMatcher { + file_type: FileType, + } + + fn parse(type_string: &str) -> Result> { + let file_type = match type_string { + "f" => FileType::Regular, + "d" => FileType::Directory, + "l" => FileType::Symlink, + "b" => FileType::BlockDevice, + "c" => FileType::CharDevice, + "p" => FileType::Fifo, // named pipe (FIFO) + "s" => FileType::Socket, + // D: door (Solaris) + "D" => return Err(From::from(format!("Type argument {type_string} not supported yet"))), + _ => return Err(From::from(format!("Unrecognised type argument {type_string}"))), + }; + Ok(file_type) + } + + impl TypeMatcher { + pub fn new(type_string: &str) -> Result> { + let file_type = parse(type_string)?; + Ok(Self { file_type }) + } + } + + impl Matcher for TypeMatcher { + fn matches(&self, file_info: &WalkEntry, _: &mut MatcherIO) -> bool { + file_info.file_type() == self.file_type + } + } + + /// Like [TypeMatcher], but toggles whether symlinks are followed. + pub struct XtypeMatcher { + file_type: FileType, + } + + impl XtypeMatcher { + pub fn new(type_string: &str) -> Result> { + let file_type = parse(type_string)?; + Ok(Self { file_type }) + } + } + + impl Matcher for XtypeMatcher { + fn matches(&self, file_info: &WalkEntry, _: &mut MatcherIO) -> bool { + let follow = if file_info.follow() { + Follow::Never + } else { + Follow::Always + }; + + let file_type = follow + .metadata(file_info) + .map(|m| m.file_type()) + .map(FileType::from); + + match file_type { + Ok(file_type) if file_type == self.file_type => true, + // Since GNU find 4.10, ELOOP will match -xtype l + Err(e) if self.file_type.is_symlink() && e.is_loop() => true, + _ => false, + } + } + } + } + mod user { + // This file is part of the uutils findutils package. + // + // For the full copyright and license information, please view the LICENSE + // file that was distributed with this source code. + + #[cfg(unix)] + use std::os::unix::fs::MetadataExt; + + #[cfg(unix)] + use nix::unistd::User; + + use super::{ComparableValue, Matcher, MatcherIO, WalkEntry}; + + pub struct UserMatcher { + #[cfg_attr(not(unix), allow(dead_code))] + uid: ComparableValue, + } + + impl UserMatcher { + #[cfg(unix)] + pub fn from_user_name(user: &str) -> Option { + // get uid from user name + let user = User::from_name(user).ok()??; + let uid = user.uid.as_raw(); + Some(Self::from_uid(uid)) + } + + pub fn from_uid(uid: u32) -> Self { + Self::from_comparable(ComparableValue::EqualTo(uid as u64)) + } + + pub fn from_comparable(uid: ComparableValue) -> Self { + Self { uid } + } + + #[cfg(windows)] + pub fn from_user_name(_user: &str) -> Option { + None + } + } + + impl Matcher for UserMatcher { + #[cfg(unix)] + fn matches(&self, file_info: &WalkEntry, _: &mut MatcherIO) -> bool { + match file_info.metadata() { + Ok(metadata) => self.uid.matches(metadata.uid().into()), + Err(_) => false, + } + } + + #[cfg(windows)] + fn matches(&self, _file_info: &WalkEntry, _: &mut MatcherIO) -> bool { + false + } + } + + pub struct NoUserMatcher {} + + impl Matcher for NoUserMatcher { + #[cfg(unix)] + fn matches(&self, file_info: &WalkEntry, _: &mut MatcherIO) -> bool { + use nix::unistd::Uid; + + if file_info.path().is_symlink() { + return false; + } + + let Ok(metadata) = file_info.metadata() else { + return true; + }; + + let Ok(uid) = User::from_uid(Uid::from_raw(metadata.uid())) else { + return true; + }; + + let Some(_user) = uid else { + return true; + }; + + false + } + + #[cfg(windows)] + fn matches(&self, _file_info: &WalkEntry, _: &mut MatcherIO) -> bool { + false + } + } + } + + use std::{ + error::Error, + fs::{File, Metadata}, + io::{Read, Write}, + path::Path, + str::FromStr, + time::SystemTime, + }; + + use ::regex::Regex; + use chrono::{DateTime, Datelike, NaiveDateTime, Utc}; + pub use entry::{FileType, WalkEntry, WalkError}; + use fs::FileSystemMatcher; + use ls::Ls; + + #[cfg(unix)] + use self::stat::{InodeMatcher, LinksMatcher}; + use self::{ + access::AccessMatcher, + delete::DeleteMatcher, + empty::EmptyMatcher, + exec::{MultiExecMatcher, SingleExecMatcher}, + group::{GroupMatcher, NoGroupMatcher}, + lname::LinkNameMatcher, + logical_matchers::{ + AndMatcherBuilder, FalseMatcher, ListMatcherBuilder, NotMatcher, TrueMatcher, + }, + name::NameMatcher, + path::PathMatcher, + perm::PermMatcher, + printer::{PrintDelimiter, Printer}, + printf::Printf, + prune::PruneMatcher, + quit::QuitMatcher, + regex::RegexMatcher, + samefile::SameFileMatcher, + size::SizeMatcher, + time::{ + FileAgeRangeMatcher, FileTimeMatcher, FileTimeType, NewerMatcher, NewerOptionMatcher, + NewerOptionType, NewerTimeMatcher, + }, + type_matcher::{TypeMatcher, XtypeMatcher}, + user::{NoUserMatcher, UserMatcher}, + }; + use super::{Config, Dependencies}; + use crate::host::Host; + + /// Symlink following mode. + #[derive(Clone, Copy, Debug, Eq, PartialEq)] + pub enum Follow { + /// Never follow symlinks (-P; default). + Never, + /// Follow symlinks on root paths only (-H). + Roots, + /// Always follow symlinks (-L). + Always, + } + + impl Follow { + /// Check whether to follow a path of the given depth. + pub fn follow_at_depth(self, depth: usize) -> bool { + match self { + Self::Never => false, + Self::Roots => depth == 0, + Self::Always => true, + } + } + + /// Get metadata for a [WalkEntry]. + pub fn metadata(self, entry: &WalkEntry) -> Result { + if self.follow_at_depth(entry.depth()) == entry.follow() { + // Same follow flag, re-use cached metadata + entry.metadata().cloned() + } else if !entry.follow() && !entry.file_type().is_symlink() { + // Not a symlink, re-use cached metadata + entry.metadata().cloned() + } else if entry.follow() && entry.file_type().is_symlink() { + // Broken symlink, re-use cached metadata + entry.metadata().cloned() + } else { + self.metadata_at_depth(entry.path(), entry.depth()) + } + } + + /// Get metadata for a path from the command line. + pub fn root_metadata(self, path: impl AsRef) -> Result { + self.metadata_at_depth(path, 0) + } + + /// Get metadata for a path, following symlinks as necessary. + pub fn metadata_at_depth( + self, + path: impl AsRef, + depth: usize, + ) -> Result { + let path = path.as_ref(); + + if self.follow_at_depth(depth) { + match path.metadata().map_err(WalkError::from) { + Ok(meta) => return Ok(meta), + Err(e) if !e.is_not_found() => return Err(e), + _ => {}, + } + } + + Ok(path.symlink_metadata()?) + } + } + + /// Struct holding references to outputs and any inputs that can't be derived + /// from the file/directory info. + pub struct MatcherIO<'a> { + should_skip_dir: bool, + exit_code: i32, + quit: bool, + deps: &'a dyn Dependencies, + host: &'a mut Host, + } + + impl MatcherIO<'_> { + pub fn new<'a>(deps: &'a dyn Dependencies, host: &'a mut Host) -> MatcherIO<'a> { + MatcherIO { should_skip_dir: false, exit_code: 0, quit: false, deps, host } + } + + pub fn host(&mut self) -> &mut Host { + self.host + } + + pub fn mark_current_dir_to_be_skipped(&mut self) { + self.should_skip_dir = true; + } + + #[must_use] + pub fn should_skip_current_dir(&self) -> bool { + self.should_skip_dir + } + + pub fn set_exit_code(&mut self, code: i32) { + self.exit_code = code; + } + + #[must_use] + pub fn exit_code(&self) -> i32 { + self.exit_code + } + + pub fn quit(&mut self) { + self.quit = true; + } + + #[must_use] + pub fn should_quit(&self) -> bool { + self.quit + } + + #[must_use] + pub fn now(&self) -> SystemTime { + self.deps.now() + } + } + + /// A basic interface that can be used to determine whether a directory entry + /// is what's being searched for. To a first order approximation, find consists + /// of building a chain of Matcher objects, and then walking a directory tree, + /// passing each entry to the chain of Matchers. + pub trait Matcher: 'static { + /// Boxes this matcher as a trait object. + fn into_box(self) -> Box + where + Self: Sized, + { + Box::new(self) + } + + /// Returns whether the given file matches the object's predicate. + fn matches(&self, entry: &WalkEntry, matcher_io: &mut MatcherIO) -> bool; + + /// Returns whether the matcher has any side-effects (e.g. executing a + /// command, deleting a file). Iff no such matcher exists in the chain, then + /// the filename will be printed to stdout. While this is a compile-time + /// fact for most matchers, it's run-time for matchers that contain a + /// collection of sub-Matchers. + fn has_side_effects(&self) -> bool { + // most matchers don't have side-effects, so supply a default implementation. + false + } + + /// Notification that find is leaving a given directory. + fn finished_dir(&self, _finished_directory: &Path, _matcher_io: &mut MatcherIO) {} + + /// Notification that find has finished processing all directories - + /// allowing for any cleanup that isn't suitable for destructors (e.g. + /// blocking calls, I/O etc.) + fn finished(&self, _matcher_io: &mut MatcherIO) {} + } + + impl Matcher for Box { + fn into_box(self) -> Box { + self + } + + fn matches(&self, entry: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { + (**self).matches(entry, matcher_io) + } + + fn has_side_effects(&self) -> bool { + (**self).has_side_effects() + } + + fn finished_dir(&self, finished_directory: &Path, matcher_io: &mut MatcherIO) { + (**self).finished_dir(finished_directory, matcher_io); + } + + fn finished(&self, matcher_io: &mut MatcherIO) { + (**self).finished(matcher_io); + } + } + + #[derive(Debug, Eq, PartialEq)] + pub enum ComparableValue { + MoreThan(u64), + EqualTo(u64), + LessThan(u64), + } + + impl ComparableValue { + fn matches(&self, value: u64) -> bool { + match *self { + Self::MoreThan(limit) => value > limit, + Self::EqualTo(limit) => value == limit, + Self::LessThan(limit) => value < limit, + } + } + + /// same as matches, but takes a signed value + fn imatches(&self, value: i64) -> bool { + match *self { + Self::MoreThan(limit) => value >= 0 && (value as u64) > limit, + Self::EqualTo(limit) => value >= 0 && (value as u64) == limit, + Self::LessThan(limit) => value < 0 || (value as u64) < limit, + } + } + } + + /// Builds a single `AndMatcher` containing the Matcher objects corresponding + /// to the passed in predicate arguments. + pub fn build_top_level_matcher( + args: &[&str], + config: &mut Config, + host: &mut Host, + ) -> Result, Box> { + let (_, top_level_matcher) = (build_matcher_tree(args, config, 0, false, host))?; + + // if the matcher doesn't have any side-effects, then we default to printing + if !top_level_matcher.has_side_effects() { + let mut new_and_matcher = AndMatcherBuilder::new(); + new_and_matcher.new_and_condition(top_level_matcher); + new_and_matcher.new_and_condition(Printer::new(PrintDelimiter::Newline, None)); + return Ok(new_and_matcher.build()); + } + Ok(top_level_matcher) + } + + /// Helper function for `build_matcher_tree`. + fn are_more_expressions(args: &[&str], index: usize) -> bool { + (index < args.len() - 1) && args[index + 1] != ")" + } + + fn convert_arg_to_number( + option_name: &str, + value_as_string: &str, + ) -> Result> { + match value_as_string.parse::() { + Ok(val) => Ok(val), + _ => Err(From::from(format!( + "Expected a positive decimal integer argument to {option_name}, but got \ + `{value_as_string}'" + ))), + } + } + + fn convert_arg_to_comparable_value( + option_name: &str, + value_as_string: &str, + ) -> Result> { + let re = Regex::new(r"^([-+]?)[-+]?(\d+)$")?; + if let Some(groups) = re.captures(value_as_string) + && let Ok(val) = groups[2].parse::() + { + return Ok(match &groups[1] { + "+" => ComparableValue::MoreThan(val), + "-" => ComparableValue::LessThan(val), + _ => ComparableValue::EqualTo(val), + }); + } + Err(From::from(format!( + "Expected a decimal integer (with optional + or - prefix) argument to {option_name}, but \ + got `{value_as_string}'" + ))) + } + + fn convert_arg_to_comparable_value_and_suffix( + option_name: &str, + value_as_string: &str, + ) -> Result<(ComparableValue, String), Box> { + let re = Regex::new(r"([-+]?)[-+]?(\d+)(.*)$")?; + if let Some(groups) = re.captures(value_as_string) + && let Ok(val) = groups[2].parse::() + { + return Ok(( + match &groups[1] { + "+" => ComparableValue::MoreThan(val), + "-" => ComparableValue::LessThan(val), + _ => ComparableValue::EqualTo(val), + }, + groups[3].to_string(), + )); + } + Err(From::from(format!( + "Expected a decimal integer (with optional + or - prefix) and (optional suffix) argument to \ + {option_name}, but got `{value_as_string}'" + ))) + } + + /// This is a function that converts a specific string format into a timestamp. + /// It allows converting a time string of + /// "(week abbreviation) (date), (year) (time)" to a Unix timestamp. + /// such as: "jan 01, 2025 00:00:01" -> 1735689601000 + /// When (time) is not provided, it will be automatically filled in as 00:00:00 + /// such as: "jan 01, 2025" = "jan 01, 2025 00:00:00" -> 1735689600000 + fn parse_date_str_to_timestamps(date_str: &str) -> Option { + let regex_pattern = + r"^(?P\w{3} \d{2})?(?:, (?P\d{4}))?(?: (?P