You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maka.apache.org by wy...@apache.org on 2026/10/23 03:59:39 UTC

(maka) 04/07: build: vendor the NSH terminal backend source tree

This is an automated email from the ASF dual-hosted git repository.

M4n5ter pushed a commit to branch rust-preview
in repository https://gitbox.apache.org/repos/asf/maka.git

commit fdec359bbb01925f64f07c38469a448bc0466505
Author: M4n5ter <m4...@gmail.com>
AuthorDate: Fri Oct 23 11:50:18 2026 +0800

    build: vendor the NSH terminal backend source tree
---
 .gitattributes                                     |    12 +
 Cargo.lock                                         |    13 +-
 Cargo.toml                                         |    20 +-
 products/maka/cli/THIRD_PARTY_NOTICES.txt          |    12 +-
 products/maka/cli/notices.json                     |  1640 +-
 third-party/nsh/.cargo/config.toml                 |    13 +
 third-party/nsh/.gitattributes                     |     4 +
 third-party/nsh/.github/ISSUE_TEMPLATE/01_bug.md   |    36 +
 third-party/nsh/.github/ci/layerfs.py              |   201 +
 third-party/nsh/.github/ci/layerfs/Dockerfile      |     5 +
 .../nsh/.github/ci/layerfs/prepare.Dockerfile      |     6 +
 third-party/nsh/.github/ci/layerfs/smoke.mjs       |    71 +
 third-party/nsh/.github/ci/paths.py                |   168 +
 third-party/nsh/.github/ci/test_layerfs.py         |    76 +
 third-party/nsh/.github/packages/homebrew.py       |    67 +
 third-party/nsh/.github/packages/nsh.json          |    15 +
 third-party/nsh/.github/packages/nsh.rb            |    36 +
 third-party/nsh/.github/packages/test_homebrew.py  |    91 +
 third-party/nsh/.github/pull_request_template.md   |    44 +
 third-party/nsh/.github/workflows/ci-paths.yml     |    42 +
 third-party/nsh/.github/workflows/compat.yml       |   118 +
 third-party/nsh/.github/workflows/core.yml         |   100 +
 third-party/nsh/.github/workflows/examples.yml     |    86 +
 third-party/nsh/.github/workflows/gpui.yml         |   170 +
 third-party/nsh/.github/workflows/layerfs.yml      |    59 +
 third-party/nsh/.github/workflows/linux.yml        |   132 +
 third-party/nsh/.github/workflows/packages.yml     |   150 +
 .../nsh/.github/workflows/release-crate.yml        |   143 +
 third-party/nsh/.github/workflows/release.yml      |   296 +
 third-party/nsh/.github/workflows/rust-app.yml     |   202 +
 third-party/nsh/.github/workflows/tui.yml          |    98 +
 third-party/nsh/.github/workflows/website.yml      |   113 +
 third-party/nsh/.github/workflows/windows.yml      |   124 +
 third-party/nsh/.gitignore                         |     9 +
 third-party/nsh/.rustfmt.toml                      |    12 +
 third-party/nsh/AGENTS.md                          |   522 +
 third-party/nsh/CLAUDE.md                          |     1 +
 third-party/nsh/CONTRIBUTING.md                    |   189 +
 third-party/nsh/Cargo.lock                         |  8183 +++++++++
 third-party/nsh/Cargo.toml                         |   484 +
 third-party/nsh/LICENSE-APACHE                     |   190 +
 third-party/nsh/README.md                          |   217 +
 third-party/nsh/SOURCE.md                          |    38 +
 third-party/nsh/crates/gpui/.cargo/config.toml     |     4 +
 .../nsh/crates/gpui/Cargo.lock                     | 18179 +++++--------------
 third-party/nsh/crates/gpui/Cargo.toml             |   118 +
 .../nsh/crates/gpui/nsh-gpui-host/Cargo.toml       |    32 +
 .../nsh/crates/gpui/nsh-gpui-host/src/lib.rs       |    87 +
 .../nsh/crates/gpui/nsh-gpui-host/src/main.rs      |     5 +
 .../nsh/crates/gpui/nsh-gpui-terminal/Cargo.toml   |    28 +
 .../nsh/crates/gpui/nsh-gpui-terminal/README.md    |    74 +
 .../gpui/nsh-gpui-terminal/src/dispatcher.rs       |   198 +
 .../crates/gpui/nsh-gpui-terminal/src/inline.rs    |   321 +
 .../nsh/crates/gpui/nsh-gpui-terminal/src/kitty.rs |   267 +
 .../nsh/crates/gpui/nsh-gpui-terminal/src/lib.rs   |   139 +
 .../crates/gpui/nsh-gpui-terminal/src/platform.rs  |   767 +
 .../crates/gpui/nsh-gpui-terminal/src/window.rs    |   646 +
 .../nsh/crates/gpui/nsh-gpui-terminal/src/wire.rs  |    65 +
 .../nsh/crates/gpui/nsh-platform-gpui/Cargo.toml   |    90 +
 .../gpui/nsh-platform-gpui/examples/embed.rs       |   197 +
 .../crates/gpui/nsh-platform-gpui/src/access.rs    |  1752 ++
 .../nsh/crates/gpui/nsh-platform-gpui/src/agent.rs |   383 +
 .../crates/gpui/nsh-platform-gpui/src/animation.rs |    67 +
 .../nsh/crates/gpui/nsh-platform-gpui/src/app.rs   |   873 +
 .../crates/gpui/nsh-platform-gpui/src/canvas.rs    |  3790 ++++
 .../crates/gpui/nsh-platform-gpui/src/chrome.rs    |  1581 ++
 .../gpui/nsh-platform-gpui/src/chrome/menus.rs     |  1309 ++
 .../nsh/crates/gpui/nsh-platform-gpui/src/decor.rs |   772 +
 .../gpui/nsh-platform-gpui/src/decor/gradient.rs   |   671 +
 .../gpui/nsh-platform-gpui/src/decor/shape.rs      |   545 +
 .../nsh/crates/gpui/nsh-platform-gpui/src/dev.rs   |   830 +
 .../crates/gpui/nsh-platform-gpui/src/events.rs    |   391 +
 .../gpui/nsh-platform-gpui/src/focus_return.rs     |   518 +
 .../nsh/crates/gpui/nsh-platform-gpui/src/geom.rs  |   335 +
 .../nsh/crates/gpui/nsh-platform-gpui/src/image.rs |  2607 +++
 .../nsh/crates/gpui/nsh-platform-gpui/src/input.rs |  3530 ++++
 .../crates/gpui/nsh-platform-gpui/src/keymap.rs    |   181 +
 .../nsh/crates/gpui/nsh-platform-gpui/src/keys.rs  |   125 +
 .../nsh/crates/gpui/nsh-platform-gpui/src/lib.rs   |    85 +
 .../nsh/crates/gpui/nsh-platform-gpui/src/mount.rs |   460 +
 .../crates/gpui/nsh-platform-gpui/src/native.rs    |  1013 ++
 .../gpui/nsh-platform-gpui/src/native/video.rs     |  1044 ++
 .../gpui/nsh-platform-gpui/src/native/web.rs       |  1015 ++
 .../gpui/nsh-platform-gpui/src/navigation.rs       |  1646 ++
 .../crates/gpui/nsh-platform-gpui/src/render.rs    |   921 +
 .../nsh/crates/gpui/nsh-platform-gpui/src/rt.rs    |   121 +
 .../crates/gpui/nsh-platform-gpui/src/scroll.rs    |   960 +
 .../gpui/nsh-platform-gpui/src/selection_area.rs   |   686 +
 .../nsh/crates/gpui/nsh-platform-gpui/src/stats.rs |   135 +
 .../crates/gpui/nsh-platform-gpui/src/surface.rs   |  1973 ++
 .../nsh/crates/gpui/nsh-platform-gpui/src/synth.rs |   381 +
 .../crates/gpui/nsh-platform-gpui/src/system.rs    |  2569 +++
 .../nsh/crates/gpui/nsh-platform-gpui/src/tests.rs |  1965 ++
 .../nsh/crates/gpui/nsh-platform-gpui/src/text.rs  |  3995 ++++
 .../gpui/nsh-platform-gpui/src/text_input.rs       |  2255 +++
 .../nsh-platform-gpui/src/text_input/layout.rs     |   540 +
 .../gpui/nsh-platform-gpui/src/transition.rs       |   281 +
 .../nsh/crates/gpui/nsh-platform-gpui/src/view.rs  |   488 +
 third-party/nsh/crates/nsh-base/Cargo.toml         |    34 +
 .../nsh/crates/nsh-base/src/alert_dialog.rs        |   249 +
 third-party/nsh/crates/nsh-base/src/button.rs      |    64 +
 third-party/nsh/crates/nsh-base/src/checkbox.rs    |   108 +
 third-party/nsh/crates/nsh-base/src/collapsible.rs |    40 +
 .../nsh/crates/nsh-base/src/default-theme.json     |    74 +
 third-party/nsh/crates/nsh-base/src/dock/area.rs   |   615 +
 .../nsh/crates/nsh-base/src/dock/compact.rs        |   243 +
 .../nsh/crates/nsh-base/src/dock/dock_area.rs      |  1292 ++
 .../nsh/crates/nsh-base/src/dock/dock_placement.rs |   270 +
 third-party/nsh/crates/nsh-base/src/dock/drag.rs   |   177 +
 .../src/dock/fixtures/bare_tab_panel_root.json     |    19 +
 .../crates/nsh-base/src/dock/fixtures/layout.json  |   261 +
 .../src/dock/fixtures/legacy_empty_tab_group.json  |     9 +
 .../nsh-base/src/dock/fixtures/nested_splits.json  |    24 +
 .../src/dock/fixtures/unregistered_panel.json      |    15 +
 .../src/dock/fixtures/zero_size_sentinel.json      |    10 +
 .../nsh/crates/nsh-base/src/dock/layout/builder.rs |   253 +
 .../nsh/crates/nsh-base/src/dock/layout/edit.rs    |   653 +
 .../nsh/crates/nsh-base/src/dock/layout/mod.rs     |    18 +
 .../nsh/crates/nsh-base/src/dock/layout/node.rs    |   204 +
 .../crates/nsh-base/src/dock/layout/normalize.rs   |   517 +
 .../nsh/crates/nsh-base/src/dock/layout/tree.rs    |   319 +
 third-party/nsh/crates/nsh-base/src/dock/mod.rs    |   159 +
 third-party/nsh/crates/nsh-base/src/dock/state.rs  |   365 +
 .../nsh/crates/nsh-base/src/dock/state_convert.rs  |   669 +
 .../nsh/crates/nsh-base/src/dock/tab_group.rs      |   570 +
 third-party/nsh/crates/nsh-base/src/dock/value.rs  |   541 +
 .../nsh/crates/nsh-base/src/dock/value/tests.rs    |   556 +
 third-party/nsh/crates/nsh-base/src/keyboard.rs    |   100 +
 third-party/nsh/crates/nsh-base/src/lib.rs         |   187 +
 third-party/nsh/crates/nsh-base/src/menu.rs        |   611 +
 third-party/nsh/crates/nsh-base/src/navigation.rs  |    39 +
 third-party/nsh/crates/nsh-base/src/popover.rs     |   178 +
 third-party/nsh/crates/nsh-base/src/popup.rs       |   292 +
 third-party/nsh/crates/nsh-base/src/progress.rs    |    90 +
 third-party/nsh/crates/nsh-base/src/radio.rs       |    98 +
 .../nsh/crates/nsh-base/src/resizable/mod.rs       |   143 +
 .../nsh/crates/nsh-base/src/resizable/panel.rs     |   827 +
 .../crates/nsh-base/src/resizable/resize_handle.rs |   371 +
 .../nsh/crates/nsh-base/src/resizable/state.rs     |   662 +
 third-party/nsh/crates/nsh-base/src/safe_area.rs   |    49 +
 .../nsh/crates/nsh-base/src/selection_area.rs      |    24 +
 third-party/nsh/crates/nsh-base/src/sheet.rs       |   118 +
 third-party/nsh/crates/nsh-base/src/switch.rs      |    93 +
 third-party/nsh/crates/nsh-base/src/tabs.rs        |    82 +
 .../nsh/crates/nsh-base/src/text_view/common.rs    |   292 +
 .../nsh/crates/nsh-base/src/text_view/document.rs  |   967 +
 .../nsh/crates/nsh-base/src/text_view/extension.rs |   300 +
 .../nsh/crates/nsh-base/src/text_view/highlight.rs |   742 +
 .../nsh/crates/nsh-base/src/text_view/html/mod.rs  |  1128 ++
 .../crates/nsh-base/src/text_view/html/tests.rs    |   713 +
 .../nsh-base/src/text_view/markdown/container.rs   |   388 +
 .../nsh-base/src/text_view/markdown/latex.rs       |   234 +
 .../crates/nsh-base/src/text_view/markdown/mod.rs  |  1101 ++
 .../nsh-base/src/text_view/markdown/streaming.rs   |   623 +
 .../nsh-base/src/text_view/markdown/tests.rs       |  1036 ++
 .../nsh/crates/nsh-base/src/text_view/mod.rs       |    28 +
 .../nsh/crates/nsh-base/src/text_view/parts.rs     |   270 +
 .../nsh/crates/nsh-base/src/text_view/view.rs      |  1859 ++
 third-party/nsh/crates/nsh-base/src/theme.rs       |   582 +
 third-party/nsh/crates/nsh-base/src/tooltip.rs     |   106 +
 third-party/nsh/crates/nsh-base/tests/base/dock.rs |   623 +
 third-party/nsh/crates/nsh-base/tests/base/main.rs |     6 +
 .../nsh/crates/nsh-base/tests/base/resizable.rs    |   476 +
 .../nsh/crates/nsh-base/tests/base/sheet.rs        |    46 +
 third-party/nsh/crates/nsh-bundler/Cargo.toml      |    55 +
 third-party/nsh/crates/nsh-bundler/src/bundle.rs   |  1207 ++
 third-party/nsh/crates/nsh-bundler/src/classes.rs  |   184 +
 third-party/nsh/crates/nsh-bundler/src/compile.rs  |   318 +
 third-party/nsh/crates/nsh-bundler/src/hot.rs      |   403 +
 third-party/nsh/crates/nsh-bundler/src/jsx.rs      |  1857 ++
 third-party/nsh/crates/nsh-bundler/src/lib.rs      |    85 +
 third-party/nsh/crates/nsh-bundler/src/minify.rs   |    56 +
 third-party/nsh/crates/nsh-bundler/src/plugin.rs   |   815 +
 third-party/nsh/crates/nsh-bundler/src/props.rs    |   215 +
 third-party/nsh/crates/nsh-bundler/src/split.rs    |    92 +
 .../nsh/crates/nsh-bundler/src/standard_tests.rs   |   107 +
 third-party/nsh/crates/nsh-bundler/src/types.rs    |   141 +
 third-party/nsh/crates/nsh-cli/Cargo.toml          |    61 +
 third-party/nsh/crates/nsh-cli/build.rs            |    59 +
 third-party/nsh/crates/nsh-cli/src/android.rs      |   495 +
 third-party/nsh/crates/nsh-cli/src/bindgen.rs      |   904 +
 .../nsh-cli/src/bindgen/wasm-bindgen-0.2.129.js    |   253 +
 third-party/nsh/crates/nsh-cli/src/build.rs        |   376 +
 third-party/nsh/crates/nsh-cli/src/cdp.rs          |   395 +
 third-party/nsh/crates/nsh-cli/src/check.rs        |   211 +
 third-party/nsh/crates/nsh-cli/src/dev.rs          |   550 +
 third-party/nsh/crates/nsh-cli/src/entry.rs        |    79 +
 third-party/nsh/crates/nsh-cli/src/init.rs         |   728 +
 third-party/nsh/crates/nsh-cli/src/logger.rs       |   124 +
 third-party/nsh/crates/nsh-cli/src/main.rs         |   841 +
 third-party/nsh/crates/nsh-cli/src/package.rs      |  1099 ++
 third-party/nsh/crates/nsh-cli/src/run.rs          |  1089 ++
 third-party/nsh/crates/nsh-cli/src/runtime.rs      |   599 +
 third-party/nsh/crates/nsh-cli/src/rust_app.rs     |  3092 ++++
 third-party/nsh/crates/nsh-cli/src/sign.rs         |   346 +
 .../nsh-cli/src/templates/mixed/App.test.tsx       |    11 +
 .../nsh/crates/nsh-cli/src/templates/mixed/App.tsx |    18 +
 .../crates/nsh-cli/src/templates/mixed/README.md   |    28 +
 .../nsh/crates/nsh-cli/src/templates/mixed/lib.rs  |    89 +
 .../crates/nsh-cli/src/templates/rust/App.test.tsx |    12 +
 .../crates/nsh-cli/src/templates/rust/README.md    |    43 +
 .../nsh/crates/nsh-cli/src/templates/rust/lib.rs   |    48 +
 .../nsh/crates/nsh-cli/src/templates/rust/main.rs  |    30 +
 .../crates/nsh-cli/src/templates/tsconfig/1.json   |    22 +
 .../crates/nsh-cli/src/templates/tsconfig/2.json   |    22 +
 .../crates/nsh-cli/src/templates/tsconfig/3.json   |    20 +
 .../crates/nsh-cli/src/templates/tsconfig/4.json   |    21 +
 .../crates/nsh-cli/src/templates/tsconfig/5.json   |    21 +
 third-party/nsh/crates/nsh-cli/src/test.rs         |   696 +
 third-party/nsh/crates/nsh-cli/src/test_android.rs |   160 +
 third-party/nsh/crates/nsh-cli/src/test_host.rs    |   252 +
 third-party/nsh/crates/nsh-cli/src/test_ios.rs     |   132 +
 third-party/nsh/crates/nsh-cli/src/test_web.rs     |   506 +
 third-party/nsh/crates/nsh-cli/src/tui.rs          |   416 +
 third-party/nsh/crates/nsh-cli/src/ui.rs           |   990 +
 third-party/nsh/crates/nsh-cli/src/web.rs          |  1064 ++
 third-party/nsh/crates/nsh-cli/src/web/dev.html    |   222 +
 third-party/nsh/crates/nsh-cli/src/web/index.html  |   106 +
 third-party/nsh/crates/nsh-cli/src/windows.rs      |   370 +
 third-party/nsh/crates/nsh-core/Cargo.toml         |    57 +
 third-party/nsh/crates/nsh-core/src/access.rs      |  1765 ++
 .../nsh/crates/nsh-core/src/animation/animator.rs  |   236 +
 .../nsh/crates/nsh-core/src/animation/driver.rs    |   540 +
 .../nsh/crates/nsh-core/src/animation/graph.rs     |  1507 ++
 .../nsh/crates/nsh-core/src/animation/mod.rs       |    25 +
 .../nsh/crates/nsh-core/src/animation/ops.rs       |   391 +
 third-party/nsh/crates/nsh-core/src/canvas.rs      |  1352 ++
 .../nsh/crates/nsh-core/src/canvas/damage.rs       |   907 +
 third-party/nsh/crates/nsh-core/src/canvas/hit.rs  |   660 +
 third-party/nsh/crates/nsh-core/src/clipboard.rs   |    42 +
 third-party/nsh/crates/nsh-core/src/color.rs       |   979 +
 .../nsh/crates/nsh-core/src/core/classes.rs        |  1345 ++
 .../nsh/crates/nsh-core/src/core/components.rs     |  4845 +++++
 third-party/nsh/crates/nsh-core/src/core/list.rs   |  2097 +++
 .../nsh/crates/nsh-core/src/core/measure.rs        |   170 +
 third-party/nsh/crates/nsh-core/src/core/mod.rs    |  6448 +++++++
 .../nsh/crates/nsh-core/src/core/overlay.rs        |  1406 ++
 .../crates/nsh-core/src/core/parent_viewport.rs    |   675 +
 .../nsh/crates/nsh-core/src/core/reading.rs        |   137 +
 .../nsh/crates/nsh-core/src/core/renders.rs        |   244 +
 .../nsh/crates/nsh-core/src/core/services.rs       |    83 +
 third-party/nsh/crates/nsh-core/src/core/sticky.rs |   201 +
 third-party/nsh/crates/nsh-core/src/core/tests.rs  | 17958 ++++++++++++++++++
 third-party/nsh/crates/nsh-core/src/core/touch.rs  |   371 +
 third-party/nsh/crates/nsh-core/src/core/views.rs  |   769 +
 third-party/nsh/crates/nsh-core/src/css.rs         |  1583 ++
 third-party/nsh/crates/nsh-core/src/css_named.rs   |   153 +
 third-party/nsh/crates/nsh-core/src/default-env    |    44 +
 third-party/nsh/crates/nsh-core/src/desktop.rs     |   938 +
 third-party/nsh/crates/nsh-core/src/effects.rs     |  1011 ++
 third-party/nsh/crates/nsh-core/src/fenwick.rs     |   105 +
 third-party/nsh/crates/nsh-core/src/filesystem.rs  |   103 +
 .../nsh/crates/nsh-core/src/geometry/length.rs     |   301 +
 .../nsh/crates/nsh-core/src/geometry/mod.rs        |    55 +
 .../nsh/crates/nsh-core/src/geometry/shapes.rs     |   985 +
 .../nsh/crates/nsh-core/src/geometry/taffy.rs      |   153 +
 .../nsh/crates/nsh-core/src/geometry/tests.rs      |    78 +
 .../nsh/crates/nsh-core/src/geometry/unit_scan.rs  |   267 +
 .../nsh/crates/nsh-core/src/geometry/unit_types.rs |    56 +
 .../nsh/crates/nsh-core/src/geometry/units.rs      |   543 +
 third-party/nsh/crates/nsh-core/src/grid.rs        |   336 +
 third-party/nsh/crates/nsh-core/src/image.rs       |   316 +
 third-party/nsh/crates/nsh-core/src/input.rs       |   922 +
 .../nsh/crates/nsh-core/src/js/animation.rs        |   365 +
 third-party/nsh/crates/nsh-core/src/js/canvas.rs   |   406 +
 third-party/nsh/crates/nsh-core/src/js/host.rs     |   913 +
 .../nsh/crates/nsh-core/src/js/host_values.rs      |   630 +
 third-party/nsh/crates/nsh-core/src/js/limits.rs   |   278 +
 third-party/nsh/crates/nsh-core/src/js/mod.rs      |   230 +
 third-party/nsh/crates/nsh-core/src/js/ops.rs      |   254 +
 third-party/nsh/crates/nsh-core/src/js/protocol.rs |    39 +
 third-party/nsh/crates/nsh-core/src/js/style.rs    |    87 +
 third-party/nsh/crates/nsh-core/src/keymap.rs      |   874 +
 third-party/nsh/crates/nsh-core/src/lib.rs         |   105 +
 third-party/nsh/crates/nsh-core/src/mount.rs       |   924 +
 third-party/nsh/crates/nsh-core/src/navigation.rs  |   488 +
 third-party/nsh/crates/nsh-core/src/ops.rs         |  2274 +++
 third-party/nsh/crates/nsh-core/src/overlay.rs     |   397 +
 third-party/nsh/crates/nsh-core/src/platform.rs    |   587 +
 .../nsh/crates/nsh-core/src/platform/clipboard.rs  |   358 +
 third-party/nsh/crates/nsh-core/src/props.rs       |   466 +
 third-party/nsh/crates/nsh-core/src/reactive.rs    |  1098 ++
 .../nsh/crates/nsh-core/src/reactive/tests.rs      |   306 +
 third-party/nsh/crates/nsh-core/src/resource.rs    |   215 +
 .../crates/nsh-core/src/runtime/accessibility.rs   |    23 +
 .../nsh/crates/nsh-core/src/runtime/android.rs     |    31 +
 .../nsh/crates/nsh-core/src/runtime/clipboard.rs   |    57 +
 .../nsh/crates/nsh-core/src/runtime/desktop.rs     |   112 +
 third-party/nsh/crates/nsh-core/src/runtime/fs.rs  |  1619 ++
 .../nsh/crates/nsh-core/src/runtime/image.rs       |   123 +
 third-party/nsh/crates/nsh-core/src/runtime/mod.rs |    97 +
 third-party/nsh/crates/nsh-core/src/runtime/net.rs |   289 +
 third-party/nsh/crates/nsh-core/src/runtime/os.rs  |    98 +
 .../nsh/crates/nsh-core/src/runtime/process.rs     |  1655 ++
 .../nsh/crates/nsh-core/src/runtime/storage.rs     |    45 +
 .../nsh/crates/nsh-core/src/runtime/websocket.rs   |   698 +
 .../nsh-core/src/runtime/websocket/native.rs       |   380 +
 third-party/nsh/crates/nsh-core/src/scroll.rs      |  2084 +++
 third-party/nsh/crates/nsh-core/src/selection.rs   |  1036 ++
 third-party/nsh/crates/nsh-core/src/shape.rs       |   355 +
 third-party/nsh/crates/nsh-core/src/storage.rs     |   432 +
 third-party/nsh/crates/nsh-core/src/style.rs       |  3272 ++++
 third-party/nsh/crates/nsh-core/src/svg/layers.rs  |   201 +
 third-party/nsh/crates/nsh-core/src/svg/mod.rs     |   505 +
 .../nsh-core/src/svg/testdata/half-alpha.svg       |     1 +
 .../nsh/crates/nsh-core/src/svg/testdata/icon.svg  |     1 +
 .../nsh/crates/nsh-core/src/svg/testdata/logo.svg  |     7 +
 .../nsh/crates/nsh-core/src/svg/testdata/text.svg  |     1 +
 third-party/nsh/crates/nsh-core/src/svg/tests.rs   |   538 +
 .../nsh/crates/nsh-core/src/tailwind/mod.rs        |  1225 ++
 .../nsh/crates/nsh-core/src/tailwind/palette.rs    |   191 +
 .../nsh/crates/nsh-core/src/tailwind/tests.rs      |  1669 ++
 .../nsh/crates/nsh-core/src/tailwind/theme.rs      |   710 +
 .../nsh/crates/nsh-core/src/tailwind/utilities.rs  |  2955 +++
 third-party/nsh/crates/nsh-core/src/text.rs        |  1026 ++
 third-party/nsh/crates/nsh-core/src/text_edit.rs   |   899 +
 third-party/nsh/crates/nsh-core/src/text_source.rs |   586 +
 third-party/nsh/crates/nsh-core/src/time.rs        |   381 +
 third-party/nsh/crates/nsh-core/src/transform.rs   |   578 +
 third-party/nsh/crates/nsh-core/src/transition.rs  |  1084 ++
 third-party/nsh/crates/nsh-core/src/ui/ambient.rs  |   806 +
 third-party/nsh/crates/nsh-core/src/ui/animated.rs |  1462 ++
 third-party/nsh/crates/nsh-core/src/ui/asset.rs    |   125 +
 third-party/nsh/crates/nsh-core/src/ui/back.rs     |    72 +
 third-party/nsh/crates/nsh-core/src/ui/call.rs     |   428 +
 third-party/nsh/crates/nsh-core/src/ui/callback.rs |   563 +
 third-party/nsh/crates/nsh-core/src/ui/class.rs    |  1213 ++
 .../nsh/crates/nsh-core/src/ui/component.rs        |  2047 +++
 .../nsh/crates/nsh-core/src/ui/description.rs      |   470 +
 third-party/nsh/crates/nsh-core/src/ui/desktop.rs  |    43 +
 third-party/nsh/crates/nsh-core/src/ui/element.rs  |  2397 +++
 .../nsh/crates/nsh-core/src/ui/element_ref.rs      |   384 +
 .../nsh/crates/nsh-core/src/ui/engine_context.rs   |   158 +
 third-party/nsh/crates/nsh-core/src/ui/env.rs      |    82 +
 third-party/nsh/crates/nsh-core/src/ui/events.rs   |   499 +
 third-party/nsh/crates/nsh-core/src/ui/flow.rs     |   459 +
 third-party/nsh/crates/nsh-core/src/ui/host.rs     |  1880 ++
 third-party/nsh/crates/nsh-core/src/ui/js.rs       |   301 +
 .../nsh/crates/nsh-core/src/ui/json_host.rs        |   305 +
 third-party/nsh/crates/nsh-core/src/ui/keys.rs     |    70 +
 third-party/nsh/crates/nsh-core/src/ui/mod.rs      |   509 +
 third-party/nsh/crates/nsh-core/src/ui/module.rs   |   432 +
 third-party/nsh/crates/nsh-core/src/ui/once.rs     |   205 +
 third-party/nsh/crates/nsh-core/src/ui/palette.rs  |   127 +
 third-party/nsh/crates/nsh-core/src/ui/prop.rs     |   336 +
 third-party/nsh/crates/nsh-core/src/ui/reactive.rs |  1141 ++
 .../nsh/crates/nsh-core/src/ui/reactive/tests.rs   |   222 +
 third-party/nsh/crates/nsh-core/src/ui/renderer.rs |   223 +
 third-party/nsh/crates/nsh-core/src/ui/resource.rs |   216 +
 .../nsh/crates/nsh-core/src/ui/responder.rs        |   262 +
 third-party/nsh/crates/nsh-core/src/ui/rows.rs     |   156 +
 .../nsh/crates/nsh-core/src/ui/scrollable.rs       |   241 +
 third-party/nsh/crates/nsh-core/src/ui/services.rs |   176 +
 .../nsh/crates/nsh-core/src/ui/status_bar.rs       |    96 +
 third-party/nsh/crates/nsh-core/src/ui/style.rs    |  3850 ++++
 third-party/nsh/crates/nsh-core/src/ui/system.rs   |   729 +
 third-party/nsh/crates/nsh-core/src/ui/task.rs     |   623 +
 third-party/nsh/crates/nsh-core/src/ui/tokens.rs   |   179 +
 third-party/nsh/crates/nsh-core/src/ui/value.rs    |   597 +
 .../nsh/crates/nsh-core/src/ui/virtual_list.rs     |   524 +
 third-party/nsh/crates/nsh-core/src/websocket.rs   |    92 +
 .../nsh/crates/nsh-core/tests/attachment_compat.rs |    94 +
 third-party/nsh/crates/nsh-core/unitless.txt       |   340 +
 third-party/nsh/crates/nsh-core/untyped.txt        |     3 +
 third-party/nsh/crates/nsh-dev/Cargo.toml          |    30 +
 third-party/nsh/crates/nsh-dev/src/client.rs       |   381 +
 third-party/nsh/crates/nsh-dev/src/lib.rs          |    28 +
 third-party/nsh/crates/nsh-dev/src/protocol.rs     |   746 +
 third-party/nsh/crates/nsh-dev/src/server.rs       |   942 +
 third-party/nsh/crates/nsh-dev/src/site.rs         |   133 +
 third-party/nsh/crates/nsh-dev/tests/roundtrip.rs  |   462 +
 third-party/nsh/crates/nsh-engine/Cargo.toml       |    57 +
 third-party/nsh/crates/nsh-engine/src/access.rs    |   168 +
 .../nsh/crates/nsh-engine/src/app_directory.rs     |    13 +
 third-party/nsh/crates/nsh-engine/src/error.rs     |   165 +
 third-party/nsh/crates/nsh-engine/src/lib.rs       |  3075 ++++
 .../nsh/crates/nsh-engine/src/local_storage.rs     |    75 +
 third-party/nsh/crates/nsh-engine/src/net.rs       |   575 +
 third-party/nsh/crates/nsh-engine/src/perf.rs      |   566 +
 third-party/nsh/crates/nsh-engine/src/script.rs    |   466 +
 third-party/nsh/crates/nsh-engine/src/storage.rs   |   366 +
 .../nsh/crates/nsh-engine/src/symbolicate.rs       |   136 +
 .../nsh/crates/nsh-engine/tests/engine/canvas.rs   |   386 +
 .../crates/nsh-engine/tests/engine/class_bench.rs  |   194 +
 .../nsh/crates/nsh-engine/tests/engine/clock.rs    |   225 +
 .../nsh/crates/nsh-engine/tests/engine/compiled.rs |  1346 ++
 .../nsh-engine/tests/engine/component_bench.rs     |   355 +
 .../crates/nsh-engine/tests/engine/components.rs   |  2655 +++
 .../nsh/crates/nsh-engine/tests/engine/counter.rs  |   221 +
 .../nsh/crates/nsh-engine/tests/engine/errors.rs   |   280 +
 .../nsh-engine/tests/engine/external_wake.rs       |   204 +
 .../nsh/crates/nsh-engine/tests/engine/fetch.rs    |   336 +
 .../nsh/crates/nsh-engine/tests/engine/fs.rs       |   841 +
 .../crates/nsh-engine/tests/engine/handle_bench.rs |   114 +
 .../crates/nsh-engine/tests/engine/host_modules.rs |   279 +
 .../nsh/crates/nsh-engine/tests/engine/hot.rs      |   409 +
 .../nsh/crates/nsh-engine/tests/engine/hover.rs    |   198 +
 .../nsh/crates/nsh-engine/tests/engine/images.rs   |   426 +
 .../nsh/crates/nsh-engine/tests/engine/js_touch.rs |   211 +
 .../nsh/crates/nsh-engine/tests/engine/keymap.rs   |   298 +
 .../nsh/crates/nsh-engine/tests/engine/list.rs     |   327 +
 .../crates/nsh-engine/tests/engine/list_bench.rs   |   136 +
 .../nsh/crates/nsh-engine/tests/engine/logs.rs     |    66 +
 .../nsh/crates/nsh-engine/tests/engine/main.rs     |    83 +
 .../nsh/crates/nsh-engine/tests/engine/native.rs   |   156 +
 .../nsh/crates/nsh-engine/tests/engine/net.rs      |   260 +
 .../nsh/crates/nsh-engine/tests/engine/package.rs  |   224 +
 .../nsh/crates/nsh-engine/tests/engine/parity.rs   |   625 +
 .../nsh/crates/nsh-engine/tests/engine/platform.rs |   266 +
 .../nsh/crates/nsh-engine/tests/engine/process.rs  |   482 +
 .../nsh-engine/tests/engine/rust_animation.rs      |   362 +
 .../nsh/crates/nsh-engine/tests/engine/rust_app.rs |   705 +
 .../crates/nsh-engine/tests/engine/rust_classes.rs |  1052 ++
 .../crates/nsh-engine/tests/engine/rust_inputs.rs  |   159 +
 .../crates/nsh-engine/tests/engine/rust_lists.rs   |   479 +
 .../crates/nsh-engine/tests/engine/rust_media.rs   |   312 +
 .../nsh-engine/tests/engine/rust_platform.rs       |   457 +
 .../crates/nsh-engine/tests/engine/rust_popups.rs  |   109 +
 .../nsh-engine/tests/engine/rust_renderers.rs      |   156 +
 .../nsh-engine/tests/engine/rust_scrolling.rs      |   200 +
 .../crates/nsh-engine/tests/engine/rust_styles.rs  |   486 +
 .../crates/nsh-engine/tests/engine/rust_touch.rs   |   180 +
 .../nsh/crates/nsh-engine/tests/engine/shutdown.rs |    71 +
 .../nsh/crates/nsh-engine/tests/engine/split.rs    |   282 +
 .../nsh/crates/nsh-engine/tests/engine/storage.rs  |   367 +
 .../nsh/crates/nsh-engine/tests/engine/system.rs   |   209 +
 .../nsh/crates/nsh-engine/tests/engine/test_ui.rs  |   439 +
 .../nsh/crates/nsh-engine/tests/engine/theme.rs    |   167 +
 .../crates/nsh-engine/tests/engine/websocket.rs    |   361 +
 third-party/nsh/crates/nsh-engine/unitless.txt     |    13 +
 third-party/nsh/crates/nsh-engine/untyped.txt      |     3 +
 third-party/nsh/crates/nsh-ios-app/Cargo.toml      |    28 +
 third-party/nsh/crates/nsh-ios-app/src/lib.rs      |    85 +
 third-party/nsh/crates/nsh-ios-app/src/main.rs     |     5 +
 third-party/nsh/crates/nsh-ios-host/Cargo.toml     |    18 +
 third-party/nsh/crates/nsh-ios-host/src/lib.rs     |   120 +
 third-party/nsh/crates/nsh-ios-host/src/main.rs    |     5 +
 third-party/nsh/crates/nsh-js/Cargo.toml           |    50 +
 third-party/nsh/crates/nsh-js/src/animated.rs      |  2166 +++
 third-party/nsh/crates/nsh-js/src/bytecode.rs      |   294 +
 third-party/nsh/crates/nsh-js/src/canvas.rs        |  1555 ++
 third-party/nsh/crates/nsh-js/src/chunks.rs        |   332 +
 third-party/nsh/crates/nsh-js/src/classes.rs       |  2993 +++
 third-party/nsh/crates/nsh-js/src/clock.rs         |   209 +
 third-party/nsh/crates/nsh-js/src/components.rs    |  1253 ++
 third-party/nsh/crates/nsh-js/src/console.rs       |   105 +
 third-party/nsh/crates/nsh-js/src/declarations.rs  |  1007 +
 third-party/nsh/crates/nsh-js/src/desktop.rs       |   624 +
 third-party/nsh/crates/nsh-js/src/dom.rs           |  4196 +++++
 third-party/nsh/crates/nsh-js/src/env.rs           |   675 +
 third-party/nsh/crates/nsh-js/src/error.rs         |    40 +
 third-party/nsh/crates/nsh-js/src/host.rs          |  2961 +++
 third-party/nsh/crates/nsh-js/src/hot.rs           |   709 +
 third-party/nsh/crates/nsh-js/src/input_action.rs  |   414 +
 third-party/nsh/crates/nsh-js/src/keymap.rs        |   379 +
 third-party/nsh/crates/nsh-js/src/lib.rs           |    82 +
 third-party/nsh/crates/nsh-js/src/list.rs          |  2094 +++
 third-party/nsh/crates/nsh-js/src/modules.rs       |  1754 ++
 third-party/nsh/crates/nsh-js/src/navigation.rs    |  1419 ++
 third-party/nsh/crates/nsh-js/src/net.rs           |    21 +
 .../nsh/crates/nsh-js/src/platform_modules.rs      |   532 +
 third-party/nsh/crates/nsh-js/src/protocol.rs      |  1144 ++
 third-party/nsh/crates/nsh-js/src/reactive.rs      |  1584 ++
 third-party/nsh/crates/nsh-js/src/rejections.rs    |    93 +
 third-party/nsh/crates/nsh-js/src/resource.rs      |   652 +
 third-party/nsh/crates/nsh-js/src/sandbox.rs       |   474 +
 .../nsh/crates/nsh-js/src/standard/bounds.rs       |   210 +
 .../nsh/crates/nsh-js/src/standard/console.rs      |   124 +
 .../nsh/crates/nsh-js/src/standard/declarations.rs |   395 +
 third-party/nsh/crates/nsh-js/src/standard/mod.rs  |   290 +
 third-party/nsh/crates/nsh-js/src/standard/os.rs   |    64 +
 third-party/nsh/crates/nsh-js/src/standard/path.rs |    73 +
 .../nsh/crates/nsh-js/src/standard/process.rs      |   173 +
 .../nsh/crates/nsh-js/src/standard/random.rs       |    22 +
 .../nsh/crates/nsh-js/src/standard/scheduler.rs    |   141 +
 third-party/nsh/crates/nsh-js/src/standard/url.rs  |   175 +
 .../nsh/crates/nsh-js/src/standard/url/browser.rs  |   130 +
 .../nsh/crates/nsh-js/src/standard/websocket.rs    |   520 +
 .../nsh-js/src/standard/websocket_fixture.rs       |   238 +
 .../crates/nsh-js/src/standard/websocket_native.rs |   345 +
 third-party/nsh/crates/nsh-js/src/standard/zlib.rs |   299 +
 third-party/nsh/crates/nsh-js/src/state.rs         |   146 +
 third-party/nsh/crates/nsh-js/src/timers.rs        |    86 +
 third-party/nsh/crates/nsh-js/src/touch.rs         |  1097 ++
 third-party/nsh/crates/nsh-js/src/web/blob.rs      |   907 +
 third-party/nsh/crates/nsh-js/src/web/encoding.rs  |   408 +
 third-party/nsh/crates/nsh-js/src/web/event.rs     |  1009 +
 third-party/nsh/crates/nsh-js/src/web/fetch.rs     |  2090 +++
 third-party/nsh/crates/nsh-js/src/web/intl/date.rs |   579 +
 .../nsh/crates/nsh-js/src/web/intl/locale.rs       |   873 +
 third-party/nsh/crates/nsh-js/src/web/intl/mod.rs  |  1130 ++
 .../nsh/crates/nsh-js/src/web/intl/number.rs       |   918 +
 third-party/nsh/crates/nsh-js/src/web/iterator.rs  |    73 +
 third-party/nsh/crates/nsh-js/src/web/js.rs        |   994 +
 third-party/nsh/crates/nsh-js/src/web/mod.rs       |   888 +
 .../nsh/crates/nsh-js/src/web/streams/mod.rs       |   329 +
 .../nsh/crates/nsh-js/src/web/streams/readable.rs  |  3570 ++++
 .../nsh/crates/nsh-js/src/web/streams/text.rs      |   263 +
 .../nsh/crates/nsh-js/src/web/streams/transform.rs |   611 +
 .../nsh/crates/nsh-js/src/web/streams/writable.rs  |  1065 ++
 third-party/nsh/crates/nsh-js/src/web/url.rs       |   556 +
 third-party/nsh/crates/nsh-js/src/web/websocket.rs |   363 +
 .../nsh/crates/nsh-js/tests/standard/imports.rs    |   144 +
 .../nsh/crates/nsh-js/tests/standard/mod.rs        |    42 +
 .../nsh/crates/nsh-js/tests/standard/safety.rs     |   115 +
 .../nsh-js/tests/standard/url-parity.expected.json |   156 +
 .../nsh/crates/nsh-js/tests/standard/url-parity.js |    30 +
 .../nsh/crates/nsh-js/tests/standard/utilities.rs  |   140 +
 third-party/nsh/crates/nsh-js/tests/web.rs         |  1014 ++
 .../crates/nsh-js/third_party/llrt-types/LICENSE   |   202 +
 .../crates/nsh-js/third_party/llrt-types/README.md |    12 +
 .../nsh-js/third_party/llrt-types/SOURCE.json      |    18 +
 .../nsh-js/third_party/llrt-types/assert.d.ts.txt  |    39 +
 .../nsh-js/third_party/llrt-types/buffer.d.ts.txt  |  1186 ++
 .../nsh-js/third_party/llrt-types/crypto.d.ts.txt  |   958 +
 .../third_party/llrt-types/dom-events.d.ts.txt     |    51 +
 .../nsh-js/third_party/llrt-types/events.d.ts.txt  |   245 +
 .../nsh-js/third_party/llrt-types/globals.d.ts.txt |    23 +
 .../nsh-js/third_party/llrt-types/path.d.ts.txt    |   142 +
 .../nsh-js/third_party/llrt-types/refresh.py       |    22 +
 .../third_party/llrt-types/string_decoder.d.ts.txt |    63 +
 .../nsh-js/third_party/llrt-types/url.d.ts.txt     |   774 +
 .../nsh-js/third_party/llrt-types/util.d.ts.txt    |   388 +
 .../nsh-js/third_party/llrt-types/zlib.d.ts.txt    |   198 +
 third-party/nsh/crates/nsh-js/unitless.txt         |     2 +
 third-party/nsh/crates/nsh-js/untyped.txt          |     3 +
 third-party/nsh/crates/nsh-linux-app/Cargo.toml    |    29 +
 third-party/nsh/crates/nsh-linux-app/src/lib.rs    |   131 +
 third-party/nsh/crates/nsh-linux-app/src/main.rs   |     5 +
 third-party/nsh/crates/nsh-linux-host/Cargo.toml   |    26 +
 third-party/nsh/crates/nsh-linux-host/src/lib.rs   |    91 +
 third-party/nsh/crates/nsh-linux-host/src/main.rs  |     5 +
 third-party/nsh/crates/nsh-macos-app/Cargo.toml    |    25 +
 third-party/nsh/crates/nsh-macos-app/src/lib.rs    |   122 +
 third-party/nsh/crates/nsh-macos-app/src/main.rs   |     5 +
 third-party/nsh/crates/nsh-macos-host/Cargo.toml   |    20 +
 third-party/nsh/crates/nsh-macos-host/src/lib.rs   |   104 +
 third-party/nsh/crates/nsh-macos-host/src/main.rs  |     5 +
 third-party/nsh/crates/nsh-macros/Cargo.toml       |    22 +
 third-party/nsh/crates/nsh-macros/src/assets.rs    |   511 +
 third-party/nsh/crates/nsh-macros/src/class.rs     |   792 +
 .../nsh/crates/nsh-macros/src/host_props.rs        |   293 +
 third-party/nsh/crates/nsh-macros/src/js_ops.rs    |   268 +
 third-party/nsh/crates/nsh-macros/src/lib.rs       |  2796 +++
 .../nsh/crates/nsh-macros/src/native_module.rs     |   194 +
 third-party/nsh/crates/nsh-package/Cargo.toml      |    25 +
 third-party/nsh/crates/nsh-package/src/keys.rs     |   162 +
 third-party/nsh/crates/nsh-package/src/lib.rs      |   224 +
 third-party/nsh/crates/nsh-package/src/package.rs  |   734 +
 third-party/nsh/crates/nsh-package/src/trust.rs    |   348 +
 third-party/nsh/crates/nsh-package/tests/trust.rs  |   402 +
 .../nsh/crates/nsh-platform-android/Cargo.toml     |    39 +
 .../java/com/longbridge/nsh/A11y.java              |   192 +
 .../java/com/longbridge/nsh/AppActivity.java       |    54 +
 .../java/com/longbridge/nsh/BackCallbacks.java     |    59 +
 .../java/com/longbridge/nsh/Backdrop.java          |   118 +
 .../java/com/longbridge/nsh/Blur.java              |    79 +
 .../java/com/longbridge/nsh/Box.java               |   598 +
 .../java/com/longbridge/nsh/CanvasBox.java         |   791 +
 .../java/com/longbridge/nsh/ComponentBox.java      |    47 +
 .../java/com/longbridge/nsh/Decor.java             |   613 +
 .../java/com/longbridge/nsh/DevActivity.java       |   120 +
 .../java/com/longbridge/nsh/Effects.java           |   295 +
 .../java/com/longbridge/nsh/ImageBox.java          |   246 +
 .../java/com/longbridge/nsh/Images.java            |   458 +
 .../java/com/longbridge/nsh/InputBox.java          |   438 +
 .../java/com/longbridge/nsh/Json.java              |    53 +
 .../java/com/longbridge/nsh/ModalHost.java         |   294 +
 .../java/com/longbridge/nsh/Mounter.java           |  2164 +++
 .../java/com/longbridge/nsh/Native.java            |   217 +
 .../java/com/longbridge/nsh/Net.java               |   174 +
 .../java/com/longbridge/nsh/Node.java              |     7 +
 .../java/com/longbridge/nsh/NshComponent.java      |    56 +
 .../com/longbridge/nsh/NshComponentContext.java    |    34 +
 .../java/com/longbridge/nsh/NshPackage.java        |    47 +
 .../java/com/longbridge/nsh/NshTrust.java          |    79 +
 .../java/com/longbridge/nsh/NshView.java           |   803 +
 .../java/com/longbridge/nsh/Pressable.java         |   142 +
 .../java/com/longbridge/nsh/ScrollBox.java         |  1046 ++
 .../java/com/longbridge/nsh/SelectionArea.java     |   516 +
 .../java/com/longbridge/nsh/SelectionHandle.java   |   130 +
 .../java/com/longbridge/nsh/StackBox.java          |   424 +
 .../java/com/longbridge/nsh/SystemUi.java          |   173 +
 .../java/com/longbridge/nsh/TestAgent.java         |   312 +
 .../java/com/longbridge/nsh/TextBox.java           |   677 +
 .../java/com/longbridge/nsh/TextLayouts.java       |   627 +
 .../java/com/longbridge/nsh/TouchTracker.java      |   385 +
 .../java/com/longbridge/nsh/VideoBox.java          |   299 +
 .../java/com/longbridge/nsh/WebBox.java            |   137 +
 .../java/com/longbridge/nsh/WidgetBox.java         |    28 +
 .../nsh/crates/nsh-platform-android/src/agent.rs   |   390 +
 .../crates/nsh-platform-android/src/animation.rs   |   287 +
 .../nsh/crates/nsh-platform-android/src/dev.rs     |   268 +
 .../nsh/crates/nsh-platform-android/src/encode.rs  |  1525 ++
 .../nsh/crates/nsh-platform-android/src/host.rs    |  1429 ++
 .../nsh/crates/nsh-platform-android/src/java.rs    |   146 +
 .../nsh/crates/nsh-platform-android/src/lib.rs     |   142 +
 .../nsh/crates/nsh-platform-android/src/logger.rs  |    49 +
 .../nsh/crates/nsh-platform-android/src/net.rs     |   244 +
 .../nsh/crates/nsh-platform-android/src/package.rs |   201 +
 .../nsh-platform-android/src/selection_area.rs     |   314 +
 .../nsh/crates/nsh-platform-android/src/svg.rs     |    69 +
 .../nsh/crates/nsh-platform-android/src/text.rs    |   384 +
 third-party/nsh/crates/nsh-platform-ios/Cargo.toml |    48 +
 .../nsh-platform-ios/include/module.modulemap      |    13 +
 .../nsh/crates/nsh-platform-ios/include/nsh.h      |   167 +
 .../nsh/crates/nsh-platform-ios/src/agent.rs       |   292 +
 .../nsh/crates/nsh-platform-ios/src/animation.rs   |    99 +
 third-party/nsh/crates/nsh-platform-ios/src/app.rs |   252 +
 .../nsh/crates/nsh-platform-ios/src/blur.rs        |   197 +
 .../nsh/crates/nsh-platform-ios/src/canvas.rs      |  1048 ++
 .../nsh/crates/nsh-platform-ios/src/component.rs   |   151 +
 .../nsh/crates/nsh-platform-ios/src/decor.rs       |   873 +
 third-party/nsh/crates/nsh-platform-ios/src/dev.rs |   560 +
 .../nsh/crates/nsh-platform-ios/src/embed.rs       |   817 +
 .../nsh/crates/nsh-platform-ios/src/image.rs       |  1162 ++
 .../nsh/crates/nsh-platform-ios/src/input.rs       |   782 +
 .../nsh/crates/nsh-platform-ios/src/interaction.rs |   249 +
 third-party/nsh/crates/nsh-platform-ios/src/lib.rs |   104 +
 .../nsh/crates/nsh-platform-ios/src/mount.rs       |  3536 ++++
 .../nsh/crates/nsh-platform-ios/src/native_view.rs |   462 +
 .../nsh/crates/nsh-platform-ios/src/navigation.rs  |   989 +
 third-party/nsh/crates/nsh-platform-ios/src/net.rs |   387 +
 .../nsh/crates/nsh-platform-ios/src/press.rs       |   334 +
 .../crates/nsh-platform-ios/src/selection_area.rs  |  1046 ++
 .../nsh/crates/nsh-platform-ios/src/surface.rs     |   749 +
 .../nsh/crates/nsh-platform-ios/src/synth.rs       |   370 +
 .../nsh/crates/nsh-platform-ios/src/system.rs      |   369 +
 .../nsh/crates/nsh-platform-ios/src/target.rs      |   653 +
 .../nsh/crates/nsh-platform-ios/src/text.rs        |  1081 ++
 .../crates/nsh-platform-ios/src/text_selection.rs  |   780 +
 .../nsh/crates/nsh-platform-ios/src/text_view.rs   |   716 +
 .../nsh/crates/nsh-platform-ios/src/touch.rs       |   415 +
 .../nsh/crates/nsh-platform-ios/src/video.rs       |   467 +
 .../nsh/crates/nsh-platform-ios/src/view.rs        |   292 +
 .../nsh/crates/nsh-platform-ios/src/visual.rs      |   751 +
 third-party/nsh/crates/nsh-platform-ios/src/web.rs |   361 +
 .../nsh/crates/nsh-platform-ios/src/zoom.rs        |   137 +
 .../nsh-platform-ios/swift/NativeShell.swift       |   428 +
 .../nsh/crates/nsh-platform-linux/Cargo.toml       |    45 +
 .../nsh/crates/nsh-platform-linux/src/access.rs    |   637 +
 .../nsh/crates/nsh-platform-linux/src/agent.rs     |   309 +
 .../nsh/crates/nsh-platform-linux/src/animation.rs |    66 +
 .../nsh/crates/nsh-platform-linux/src/app.rs       |   403 +
 .../nsh/crates/nsh-platform-linux/src/canvas.rs    |  1343 ++
 .../nsh/crates/nsh-platform-linux/src/chrome.rs    |   840 +
 .../nsh/crates/nsh-platform-linux/src/decor.rs     |   829 +
 .../nsh/crates/nsh-platform-linux/src/dev.rs       |   596 +
 .../nsh/crates/nsh-platform-linux/src/file_drop.rs |   169 +
 .../nsh/crates/nsh-platform-linux/src/image.rs     |  1495 ++
 .../nsh/crates/nsh-platform-linux/src/input.rs     |  1981 ++
 .../nsh/crates/nsh-platform-linux/src/keymap.rs    |   307 +
 .../nsh/crates/nsh-platform-linux/src/lib.rs       |    56 +
 .../nsh/crates/nsh-platform-linux/src/mount.rs     |   413 +
 .../nsh/crates/nsh-platform-linux/src/native.rs    |   882 +
 .../crates/nsh-platform-linux/src/native/web.rs    |   647 +
 .../crates/nsh-platform-linux/src/navigation.rs    |  1247 ++
 .../nsh/crates/nsh-platform-linux/src/scroll.rs    |   638 +
 .../nsh-platform-linux/src/selection_area.rs       |   771 +
 .../nsh/crates/nsh-platform-linux/src/surface.rs   |   438 +
 .../nsh/crates/nsh-platform-linux/src/synth.rs     |   154 +
 .../nsh/crates/nsh-platform-linux/src/system.rs    |  1273 ++
 .../nsh/crates/nsh-platform-linux/src/text.rs      |  2439 +++
 .../crates/nsh-platform-linux/src/text_input.rs    |  1315 ++
 .../crates/nsh-platform-linux/src/transition.rs    |   241 +
 .../nsh/crates/nsh-platform-linux/src/view.rs      |   643 +
 .../nsh/crates/nsh-platform-macos/Cargo.toml       |    46 +
 .../nsh/crates/nsh-platform-macos/src/access.rs    |   749 +
 .../nsh/crates/nsh-platform-macos/src/agent.rs     |   360 +
 .../nsh/crates/nsh-platform-macos/src/animation.rs |    69 +
 .../nsh/crates/nsh-platform-macos/src/app.rs       |   668 +
 .../nsh/crates/nsh-platform-macos/src/blur.rs      |   197 +
 .../nsh/crates/nsh-platform-macos/src/canvas.rs    |  1076 ++
 .../nsh/crates/nsh-platform-macos/src/chrome.rs    |   866 +
 .../nsh/crates/nsh-platform-macos/src/decor.rs     |   928 +
 .../nsh/crates/nsh-platform-macos/src/dev.rs       |   840 +
 .../nsh/crates/nsh-platform-macos/src/file_drop.rs |   235 +
 .../nsh/crates/nsh-platform-macos/src/fps.rs       |   395 +
 .../nsh/crates/nsh-platform-macos/src/gpu.rs       |   189 +
 .../nsh/crates/nsh-platform-macos/src/image.rs     |  1530 ++
 .../nsh/crates/nsh-platform-macos/src/input.rs     |  2248 +++
 .../nsh/crates/nsh-platform-macos/src/keymap.rs    |   211 +
 .../nsh/crates/nsh-platform-macos/src/lib.rs       |    69 +
 .../nsh/crates/nsh-platform-macos/src/mount.rs     |   450 +
 .../nsh/crates/nsh-platform-macos/src/native.rs    |  1567 ++
 .../crates/nsh-platform-macos/src/navigation.rs    |  1384 ++
 .../nsh/crates/nsh-platform-macos/src/net.rs       |   387 +
 .../nsh/crates/nsh-platform-macos/src/scroll.rs    |  2005 ++
 .../nsh-platform-macos/src/selection_area.rs       |   478 +
 .../nsh/crates/nsh-platform-macos/src/surface.rs   |   796 +
 .../nsh/crates/nsh-platform-macos/src/synth.rs     |   288 +
 .../nsh/crates/nsh-platform-macos/src/system.rs    |   933 +
 .../nsh/crates/nsh-platform-macos/src/text.rs      |  1976 ++
 .../crates/nsh-platform-macos/src/text_input.rs    |  1713 ++
 .../crates/nsh-platform-macos/src/transition.rs    |   237 +
 .../nsh/crates/nsh-platform-macos/src/view.rs      |  1505 ++
 .../nsh/crates/nsh-platform-macos/src/visual.rs    |   711 +
 third-party/nsh/crates/nsh-platform-tui/Cargo.toml |    49 +
 third-party/nsh/crates/nsh-platform-tui/src/app.rs |  2396 +++
 .../nsh/crates/nsh-platform-tui/src/canvas.rs      |  2123 +++
 .../nsh/crates/nsh-platform-tui/src/composite.rs   |  1626 ++
 .../crates/nsh-platform-tui/src/composite/blend.rs |   405 +
 .../nsh-platform-tui/src/composite/effects.rs      |   399 +
 .../nsh/crates/nsh-platform-tui/src/editor.rs      |   809 +
 .../nsh/crates/nsh-platform-tui/src/fonts.rs       |  1048 ++
 .../nsh/crates/nsh-platform-tui/src/geometry.rs    |   654 +
 .../nsh/crates/nsh-platform-tui/src/image.rs       |  1518 ++
 .../nsh/crates/nsh-platform-tui/src/image_state.rs |   725 +
 .../nsh/crates/nsh-platform-tui/src/input.rs       |  6258 +++++++
 third-party/nsh/crates/nsh-platform-tui/src/lib.rs |    52 +
 .../nsh/crates/nsh-platform-tui/src/media.rs       |  2273 +++
 .../nsh/crates/nsh-platform-tui/src/metrics.rs     |    85 +
 .../nsh/crates/nsh-platform-tui/src/motion.rs      |   853 +
 .../nsh/crates/nsh-platform-tui/src/native.rs      |   424 +
 .../nsh/crates/nsh-platform-tui/src/navigation.rs  |  1646 ++
 third-party/nsh/crates/nsh-platform-tui/src/net.rs |   619 +
 .../nsh/crates/nsh-platform-tui/src/protocol.rs    |   676 +
 .../nsh/crates/nsh-platform-tui/src/render.rs      |  4762 +++++
 .../nsh/crates/nsh-platform-tui/src/script.rs      |   318 +
 .../nsh/crates/nsh-platform-tui/src/scroll.rs      |  1273 ++
 .../nsh/crates/nsh-platform-tui/src/services.rs    |  1707 ++
 .../nsh/crates/nsh-platform-tui/src/surface.rs     |  2861 +++
 .../nsh/crates/nsh-platform-tui/src/text.rs        |  1747 ++
 .../nsh/crates/nsh-platform-tui/src/worker.rs      |   198 +
 third-party/nsh/crates/nsh-platform-web/Cargo.toml |    50 +
 third-party/nsh/crates/nsh-platform-web/build.rs   |    12 +
 .../nsh/crates/nsh-platform-web/src/animation.rs   |   242 +
 .../nsh/crates/nsh-platform-web/src/canvas.rs      |   332 +
 .../nsh/crates/nsh-platform-web/src/encode.rs      |  1422 ++
 third-party/nsh/crates/nsh-platform-web/src/ffi.rs |   373 +
 .../nsh/crates/nsh-platform-web/src/filesystem.rs  |   162 +
 third-party/nsh/crates/nsh-platform-web/src/lib.rs |  1515 ++
 .../nsh/crates/nsh-platform-web/src/local_time.rs  |    49 +
 third-party/nsh/crates/nsh-platform-web/src/net.rs |   175 +
 .../nsh/crates/nsh-platform-web/src/storage.rs     |    77 +
 .../nsh/crates/nsh-platform-web/src/text.rs        |   744 +
 .../nsh/crates/nsh-platform-web/src/websocket.rs   |   155 +
 .../nsh/crates/nsh-platform-web/web/index.html     |   108 +
 .../nsh-platform-web/web/local-time.test.mjs       |    55 +
 .../nsh-platform-web/web/mouse-browser.test.mjs    |    52 +
 .../nsh/crates/nsh-platform-web/web/mouse.test.mjs |    40 +
 third-party/nsh/crates/nsh-platform-web/web/nsh.js |  4907 +++++
 .../nsh-platform-web/web/scroll-browser.test.mjs   |    53 +
 .../crates/nsh-platform-web/web/scroll.test.mjs    |   182 +
 .../nsh/crates/nsh-platform-windows/Cargo.toml     |    43 +
 .../nsh/crates/nsh-platform-windows/src/access.rs  |  1133 ++
 .../crates/nsh-platform-windows/src/access/uia.rs  |  1141 ++
 .../nsh/crates/nsh-platform-windows/src/agent.rs   |   300 +
 .../crates/nsh-platform-windows/src/animation.rs   |    67 +
 .../nsh/crates/nsh-platform-windows/src/app.rs     |   427 +
 .../nsh/crates/nsh-platform-windows/src/canvas.rs  |  2579 +++
 .../nsh/crates/nsh-platform-windows/src/chrome.rs  |  1278 ++
 .../nsh/crates/nsh-platform-windows/src/compose.rs |   495 +
 .../nsh/crates/nsh-platform-windows/src/decor.rs   |  1252 ++
 .../crates/nsh-platform-windows/src/decor/cache.rs |   117 +
 .../nsh-platform-windows/src/decor/gradient.rs     |   614 +
 .../crates/nsh-platform-windows/src/decor/layer.rs |   618 +
 .../nsh/crates/nsh-platform-windows/src/dev.rs     |  1143 ++
 .../crates/nsh-platform-windows/src/file_drop.rs   |   304 +
 .../nsh/crates/nsh-platform-windows/src/geom.rs    |   309 +
 .../nsh/crates/nsh-platform-windows/src/gfx.rs     |   284 +
 .../nsh/crates/nsh-platform-windows/src/image.rs   |  2017 ++
 .../nsh/crates/nsh-platform-windows/src/input.rs   |  2377 +++
 .../nsh/crates/nsh-platform-windows/src/keymap.rs  |   111 +
 .../nsh/crates/nsh-platform-windows/src/lib.rs     |    68 +
 .../nsh/crates/nsh-platform-windows/src/mount.rs   |   437 +
 .../nsh/crates/nsh-platform-windows/src/native.rs  |   899 +
 .../nsh-platform-windows/src/native/video.rs       |  1075 ++
 .../crates/nsh-platform-windows/src/native/web.rs  |  1598 ++
 .../crates/nsh-platform-windows/src/navigation.rs  |  1486 ++
 .../nsh/crates/nsh-platform-windows/src/render.rs  |  1091 ++
 .../nsh/crates/nsh-platform-windows/src/scroll.rs  |   722 +
 .../nsh-platform-windows/src/selection_area.rs     |   670 +
 .../nsh/crates/nsh-platform-windows/src/surface.rs |   630 +
 .../nsh/crates/nsh-platform-windows/src/synth.rs   |   266 +
 .../nsh/crates/nsh-platform-windows/src/system.rs  |  2308 +++
 .../nsh/crates/nsh-platform-windows/src/text.rs    |  3654 ++++
 .../crates/nsh-platform-windows/src/text_input.rs  |  2030 +++
 .../crates/nsh-platform-windows/src/transition.rs  |   281 +
 .../nsh/crates/nsh-platform-windows/src/view.rs    |   528 +
 .../nsh/crates/nsh-platform-windows/src/window.rs  |  1029 ++
 third-party/nsh/crates/nsh-testing/Cargo.toml      |    61 +
 third-party/nsh/crates/nsh-testing/src/agent.rs    |  1881 ++
 .../nsh/crates/nsh-testing/src/agent/forward.rs    |   331 +
 third-party/nsh/crates/nsh-testing/src/driver.rs   |   500 +
 .../crates/nsh-testing/src/headless/animation.rs   |   110 +
 .../crates/nsh-testing/src/headless/keyboard.rs    |   113 +
 .../nsh/crates/nsh-testing/src/headless/live.rs    |   255 +
 .../nsh/crates/nsh-testing/src/headless/menus.rs   |    93 +
 .../nsh/crates/nsh-testing/src/headless/mod.rs     |  1774 ++
 .../nsh/crates/nsh-testing/src/headless/net.rs     |    36 +
 .../nsh-testing/src/headless/net_fetch_tests.rs    |   206 +
 .../nsh/crates/nsh-testing/src/headless/pointer.rs |   471 +
 .../nsh/crates/nsh-testing/src/headless/stub.rs    |   459 +
 third-party/nsh/crates/nsh-testing/src/lib.rs      |   168 +
 third-party/nsh/crates/nsh-testing/src/menu.rs     |    83 +
 third-party/nsh/crates/nsh-testing/src/module.rs   |  1745 ++
 third-party/nsh/crates/nsh-testing/src/run.rs      |   964 +
 third-party/nsh/crates/nsh-testing/src/runner.rs   |   304 +
 third-party/nsh/crates/nsh-testing/src/screen.rs   |  1769 ++
 third-party/nsh/crates/nsh-testing/src/selector.rs |   202 +
 third-party/nsh/crates/nsh-testing/src/storage.rs  |    66 +
 third-party/nsh/crates/nsh-testing/src/trace.rs    |    43 +
 .../tests/testing/capabilities/App.test.tsx        |    13 +
 .../nsh-testing/tests/testing/capabilities/App.tsx |    24 +
 .../tests/testing/capabilities/nsh.json            |     5 +
 .../nsh-testing/tests/testing/clock/App.test.tsx   |    64 +
 .../crates/nsh-testing/tests/testing/clock/App.tsx |    36 +
 .../tests/testing/environment/App.test.tsx         |    85 +
 .../nsh-testing/tests/testing/environment/App.tsx  |    37 +
 .../nsh/crates/nsh-testing/tests/testing/main.rs   |   241 +
 .../tests/testing/platform/App.test.tsx            |    64 +
 .../nsh-testing/tests/testing/platform/App.tsx     |   111 +
 .../nsh-testing/tests/testing/queries/App.test.tsx |    57 +
 .../nsh-testing/tests/testing/queries/App.tsx      |    40 +
 .../nsh-testing/tests/testing/suites/Only.test.ts  |    17 +
 .../tests/testing/suites/Suites.test.ts            |   103 +
 .../nsh-testing/tests/testing/todo/App.test.tsx    |    31 +
 .../crates/nsh-testing/tests/testing/todo/App.tsx  |    39 +
 .../nsh-testing/tests/testing/todo/Broken.test.ts  |     4 +
 third-party/nsh/crates/nsh-tui-app/Cargo.toml      |    20 +
 third-party/nsh/crates/nsh-tui-app/src/lib.rs      |   153 +
 third-party/nsh/crates/nsh-tui-app/src/main.rs     |     5 +
 third-party/nsh/crates/nsh-tui-host/Cargo.toml     |    16 +
 third-party/nsh/crates/nsh-tui-host/src/lib.rs     |   112 +
 third-party/nsh/crates/nsh-tui-host/src/main.rs    |     5 +
 third-party/nsh/crates/nsh-windows-app/Cargo.toml  |    25 +
 third-party/nsh/crates/nsh-windows-app/src/lib.rs  |   122 +
 third-party/nsh/crates/nsh-windows-app/src/main.rs |     8 +
 third-party/nsh/crates/nsh-windows-host/Cargo.toml |    20 +
 third-party/nsh/crates/nsh-windows-host/src/lib.rs |   109 +
 .../nsh/crates/nsh-windows-host/src/main.rs        |     5 +
 third-party/nsh/crates/xtask/Cargo.toml            |    26 +
 third-party/nsh/crates/xtask/src/android.rs        |   313 +
 third-party/nsh/crates/xtask/src/compat.rs         |    98 +
 third-party/nsh/crates/xtask/src/dist.rs           |   348 +
 third-party/nsh/crates/xtask/src/ios.rs            |   433 +
 third-party/nsh/crates/xtask/src/main.rs           |   158 +
 third-party/nsh/crates/xtask/src/run.rs            |   292 +
 third-party/nsh/crates/xtask/src/term.rs           |   218 +
 third-party/nsh/crates/xtask/src/web.rs            |   172 +
 third-party/nsh/docs/README.md                     |     7 +
 third-party/nsh/docs/dev/README.md                 |    39 +
 third-party/nsh/docs/dev/animation.md              |    47 +
 third-party/nsh/docs/dev/api-naming.md             |   347 +
 third-party/nsh/docs/dev/architecture.md           |   109 +
 third-party/nsh/docs/dev/canvas.md                 |    79 +
 third-party/nsh/docs/dev/compatibility.md          |   195 +
 third-party/nsh/docs/dev/components.md             |   878 +
 third-party/nsh/docs/dev/dock.md                   |   225 +
 third-party/nsh/docs/dev/elements.md               |   314 +
 third-party/nsh/docs/dev/embedding.md              |   216 +
 third-party/nsh/docs/dev/file-drop.md              |    66 +
 third-party/nsh/docs/dev/geometry.md               |   165 +
 third-party/nsh/docs/dev/gpui.md                   |   335 +
 third-party/nsh/docs/dev/images.md                 |   113 +
 third-party/nsh/docs/dev/js-modules.md             |   202 +
 third-party/nsh/docs/dev/layerfs.md                |   100 +
 third-party/nsh/docs/dev/linux.md                  |   219 +
 third-party/nsh/docs/dev/macos.md                  |   332 +
 third-party/nsh/docs/dev/native-pipeline.md        |   242 +
 third-party/nsh/docs/dev/performance.md            |   301 +
 third-party/nsh/docs/dev/pitfalls.md               |   412 +
 third-party/nsh/docs/dev/reactive-components.md    |   434 +
 third-party/nsh/docs/dev/rust-classes.md           |   459 +
 third-party/nsh/docs/dev/rust-modules.md           |    48 +
 third-party/nsh/docs/dev/sandbox.md                |   114 +
 third-party/nsh/docs/dev/scrolling-and-lists.md    |    99 +
 third-party/nsh/docs/dev/signed-packages.md        |    60 +
 third-party/nsh/docs/dev/styles.md                 |   258 +
 third-party/nsh/docs/dev/text-view.md              |   238 +
 third-party/nsh/docs/dev/text.md                   |   110 +
 third-party/nsh/docs/dev/tooling.md                |   799 +
 third-party/nsh/docs/dev/tui.md                    |   521 +
 third-party/nsh/docs/dev/web.md                    |   617 +
 third-party/nsh/docs/dev/windows.md                |   261 +
 third-party/nsh/examples/bench/GridTs.tsx          |     6 +
 third-party/nsh/examples/bench/README.md           |    11 +
 third-party/nsh/examples/bench/RowsTs.tsx          |     6 +
 third-party/nsh/examples/bench/TsButton.tsx        |    53 +
 third-party/nsh/examples/bench/buttons.tsx         |    48 +
 third-party/nsh/examples/bench/tsconfig.json       |     4 +
 third-party/nsh/examples/counter/App.test.tsx      |    10 +
 third-party/nsh/examples/counter/App.tsx           |    61 +
 third-party/nsh/examples/counter/nsh.json          |     4 +
 third-party/nsh/examples/counter/tsconfig.json     |     4 +
 third-party/nsh/examples/desktop/App.tsx           |   188 +
 third-party/nsh/examples/desktop/tsconfig.json     |     4 +
 third-party/nsh/examples/embed-android/README.md   |    51 +
 .../com/longbridge/nsh/embeddemo/MainActivity.java |   118 +
 .../nsh/examples/embed-gpui/.cargo/config.toml     |     4 +
 .../nsh/examples/embed-gpui/Cargo.lock             | 14810 ++++-----------
 third-party/nsh/examples/embed-gpui/Cargo.toml     |    40 +
 third-party/nsh/examples/embed-gpui/README.md      |    49 +
 third-party/nsh/examples/embed-gpui/app/App.tsx    |   147 +
 third-party/nsh/examples/embed-gpui/app/nsh.json   |     6 +
 .../nsh/examples/embed-gpui/app/tsconfig.json      |     4 +
 third-party/nsh/examples/embed-gpui/app/ui.tsx     |    72 +
 third-party/nsh/examples/embed-gpui/build.rs       |    98 +
 third-party/nsh/examples/embed-gpui/run/Cargo.toml |    10 +
 .../nsh/examples/embed-gpui/run/src/main.rs        |    29 +
 third-party/nsh/examples/embed-gpui/src/layers.rs  |   126 +
 third-party/nsh/examples/embed-gpui/src/main.rs    |   686 +
 third-party/nsh/examples/embed-gpui/src/switch.rs  |   147 +
 third-party/nsh/examples/embed-gpui/src/theme.rs   |   119 +
 third-party/nsh/examples/embed-gpui/src/trading.rs |   266 +
 .../nsh/examples/embed-gpui/src/watchlist.rs       |   175 +
 .../nsh/examples/embed-gpui/themes/violet.json     |    47 +
 third-party/nsh/examples/embed-ios/README.md       |    41 +
 third-party/nsh/examples/embed-ios/main.swift      |   179 +
 third-party/nsh/examples/embedded/App.tsx          |    41 +
 third-party/nsh/examples/embedded/nsh.json         |     6 +
 third-party/nsh/examples/embedded/tsconfig.json    |     4 +
 third-party/nsh/examples/gallery-rs/App.test.tsx   |    14 +
 third-party/nsh/examples/gallery-rs/README.md      |    56 +
 .../nsh/examples/gallery-rs/animations.test.tsx    |    77 +
 .../nsh/examples/gallery-rs/canvas.test.tsx        |    41 +
 third-party/nsh/examples/gallery-rs/chat.test.tsx  |    69 +
 .../nsh/examples/gallery-rs/components.test.tsx    |   101 +
 .../nsh/examples/gallery-rs/desktop.test.tsx       |    51 +
 third-party/nsh/examples/gallery-rs/form.test.tsx  |   110 +
 .../nsh/examples/gallery-rs/gestures.test.tsx      |    81 +
 third-party/nsh/examples/gallery-rs/icon.png       |   Bin 0 -> 90237 bytes
 .../nsh/examples/gallery-rs/images.test.tsx        |    56 +
 third-party/nsh/examples/gallery-rs/index.test.tsx |    51 +
 third-party/nsh/examples/gallery-rs/lists.test.tsx |    94 +
 third-party/nsh/examples/gallery-rs/media.test.tsx |    65 +
 .../nsh/examples/gallery-rs/native/Cargo.toml      |    26 +
 .../examples/gallery-rs/native/assets/bounce.gif   |   Bin 0 -> 3418 bytes
 .../gallery-rs/native/assets/fonts/OFL.txt         |    93 +
 .../native/assets/fonts/Pacifico-Regular.ttf       |   Bin 0 -> 329380 bytes
 .../examples/gallery-rs/native/assets/logo@2x.png  |   Bin 0 -> 2772 bytes
 .../examples/gallery-rs/native/assets/spinner.webp |   Bin 0 -> 9948 bytes
 .../nsh/examples/gallery-rs/native/src/assets.rs   |    44 +
 .../gallery-rs/native/src/demos/animations.rs      |  1251 ++
 .../examples/gallery-rs/native/src/demos/canvas.rs |  1215 ++
 .../gallery-rs/native/src/demos/chat/glyphs.rs     |   207 +
 .../gallery-rs/native/src/demos/chat/markdown.rs   |    57 +
 .../gallery-rs/native/src/demos/chat/mod.rs        |  1816 ++
 .../gallery-rs/native/src/demos/chat/parts.rs      |   532 +
 .../gallery-rs/native/src/demos/chat/scripts.rs    |   499 +
 .../gallery-rs/native/src/demos/components.rs      |   774 +
 .../gallery-rs/native/src/demos/file_drop.rs       |    47 +
 .../examples/gallery-rs/native/src/demos/form.rs   |  1216 ++
 .../gallery-rs/native/src/demos/gestures.rs        |   833 +
 .../examples/gallery-rs/native/src/demos/images.rs |   478 +
 .../examples/gallery-rs/native/src/demos/lists.rs  |  1038 ++
 .../examples/gallery-rs/native/src/demos/media.rs  |   361 +
 .../examples/gallery-rs/native/src/demos/mod.rs    |   333 +
 .../gallery-rs/native/src/demos/navigation.rs      |   957 +
 .../examples/gallery-rs/native/src/demos/photos.rs |   489 +
 .../gallery-rs/native/src/demos/physics.rs         |   428 +
 .../gallery-rs/native/src/demos/scrolling.rs       |   899 +
 .../gallery-rs/native/src/demos/stocks/book.rs     |   444 +
 .../gallery-rs/native/src/demos/stocks/chart.rs    |   812 +
 .../gallery-rs/native/src/demos/stocks/detail.rs   |   686 +
 .../gallery-rs/native/src/demos/stocks/market.rs   |   889 +
 .../gallery-rs/native/src/demos/stocks/mod.rs      |   863 +
 .../gallery-rs/native/src/demos/stocks/parts.rs    |   385 +
 .../gallery-rs/native/src/demos/stocks/tape.rs     |   320 +
 .../gallery-rs/native/src/demos/stocks/ticket.rs   |   436 +
 .../gallery-rs/native/src/demos/storage.rs         |   261 +
 .../examples/gallery-rs/native/src/demos/styles.rs |   941 +
 .../examples/gallery-rs/native/src/demos/system.rs |   906 +
 .../gallery-rs/native/src/demos/text_demo.rs       |   483 +
 .../gallery-rs/native/src/demos/typed_styles.rs    |  1124 ++
 .../nsh/examples/gallery-rs/native/src/lib.rs      |    35 +
 .../nsh/examples/gallery-rs/native/src/main.rs     |    61 +
 .../nsh/examples/gallery-rs/native/src/nav.rs      |    80 +
 .../nsh/examples/gallery-rs/native/src/shell.rs    |   375 +
 .../examples/gallery-rs/native/src/ui/animated.rs  |   144 +
 .../examples/gallery-rs/native/src/ui/controls.rs  |   265 +
 .../examples/gallery-rs/native/src/ui/device.rs    |    24 +
 .../nsh/examples/gallery-rs/native/src/ui/icons.rs |   384 +
 .../examples/gallery-rs/native/src/ui/layout.rs    |    45 +
 .../nsh/examples/gallery-rs/native/src/ui/mod.rs   |    44 +
 .../nsh/examples/gallery-rs/native/src/ui/page.rs  |   195 +
 .../nsh/examples/gallery-rs/native/src/ui/parts.rs |  1104 ++
 .../examples/gallery-rs/native/src/ui/shapes.rs    |    22 +
 .../nsh/examples/gallery-rs/native/src/ui/sheet.rs |   136 +
 .../nsh/examples/gallery-rs/native/src/ui/theme.rs |   564 +
 .../nsh/examples/gallery-rs/navigation.test.tsx    |    84 +
 third-party/nsh/examples/gallery-rs/nsh.json       |     9 +
 .../nsh/examples/gallery-rs/scrolling.test.tsx     |    85 +
 .../nsh/examples/gallery-rs/stocks.test.tsx        |    72 +
 .../nsh/examples/gallery-rs/storage.test.tsx       |    91 +
 .../nsh/examples/gallery-rs/styles.test.tsx        |   115 +
 .../nsh/examples/gallery-rs/system.test.tsx        |   128 +
 third-party/nsh/examples/gallery-rs/text.test.tsx  |    58 +
 third-party/nsh/examples/gallery-rs/theme.json     |    44 +
 third-party/nsh/examples/gallery/App.tsx           |   396 +
 third-party/nsh/examples/gallery/Bench.tsx         |     7 +
 third-party/nsh/examples/gallery/README.md         |    19 +
 third-party/nsh/examples/gallery/TitleBar.tsx      |    33 +
 third-party/nsh/examples/gallery/bounce.gif        |   Bin 0 -> 3418 bytes
 .../nsh/examples/gallery/demos/Animations.tsx      |   831 +
 .../nsh/examples/gallery/demos/CanvasDemo.tsx      |   787 +
 third-party/nsh/examples/gallery/demos/Chat.tsx    |   866 +
 .../nsh/examples/gallery/demos/Components.tsx      |   405 +
 .../nsh/examples/gallery/demos/Controls.tsx        |   571 +
 third-party/nsh/examples/gallery/demos/Dock.tsx    |   338 +
 third-party/nsh/examples/gallery/demos/Form.tsx    |   567 +
 .../nsh/examples/gallery/demos/Gestures.tsx        |   477 +
 .../nsh/examples/gallery/demos/ImageViewer.tsx     |   158 +
 third-party/nsh/examples/gallery/demos/Images.tsx  |   342 +
 third-party/nsh/examples/gallery/demos/Lists.tsx   |   681 +
 third-party/nsh/examples/gallery/demos/Media.tsx   |   184 +
 third-party/nsh/examples/gallery/demos/Menus.tsx   |   393 +
 .../nsh/examples/gallery/demos/Navigation.tsx      |   522 +
 .../nsh/examples/gallery/demos/Overlays.tsx        |   166 +
 third-party/nsh/examples/gallery/demos/Photos.tsx  |   279 +
 third-party/nsh/examples/gallery/demos/Physics.tsx |   250 +
 .../nsh/examples/gallery/demos/Resizable.tsx       |    88 +
 .../nsh/examples/gallery/demos/Scrolling.tsx       |   477 +
 .../nsh/examples/gallery/demos/Standard.tsx        |    10 +
 .../nsh/examples/gallery/demos/StandardActions.tsx |   135 +
 .../examples/gallery/demos/StandardWebSockets.tsx  |    67 +
 third-party/nsh/examples/gallery/demos/Stocks.tsx  |   426 +
 third-party/nsh/examples/gallery/demos/Storage.tsx |   149 +
 third-party/nsh/examples/gallery/demos/Styles.tsx  |   538 +
 third-party/nsh/examples/gallery/demos/System.tsx  |   459 +
 .../nsh/examples/gallery/demos/Tailwind.tsx        |   411 +
 .../nsh/examples/gallery/demos/TextDemo.tsx        |   298 +
 .../nsh/examples/gallery/demos/TextViewDemo.tsx    |   397 +
 .../nsh/examples/gallery/demos/chat/glyphs.tsx     |   133 +
 .../nsh/examples/gallery/demos/chat/local.ts       |    44 +
 .../nsh/examples/gallery/demos/chat/markdown.tsx   |    56 +
 .../nsh/examples/gallery/demos/chat/parts.tsx      |   328 +
 .../nsh/examples/gallery/demos/chat/scripts.ts     |   282 +
 .../nsh/examples/gallery/demos/stocks/Book.tsx     |   213 +
 .../nsh/examples/gallery/demos/stocks/Chart.tsx    |   451 +
 .../nsh/examples/gallery/demos/stocks/Detail.tsx   |   374 +
 .../nsh/examples/gallery/demos/stocks/Tape.tsx     |   162 +
 .../nsh/examples/gallery/demos/stocks/Ticket.tsx   |   230 +
 .../nsh/examples/gallery/demos/stocks/market.ts    |   536 +
 .../nsh/examples/gallery/demos/stocks/parts.tsx    |   242 +
 third-party/nsh/examples/gallery/fonts/OFL.txt     |    93 +
 .../examples/gallery/fonts/Pacifico-Regular.ttf    |   Bin 0 -> 329380 bytes
 third-party/nsh/examples/gallery/icon.png          |   Bin 0 -> 90237 bytes
 third-party/nsh/examples/gallery/icons.tsx         |   275 +
 third-party/nsh/examples/gallery/logo-dark.svg     |    10 +
 third-party/nsh/examples/gallery/logo-light.svg    |    10 +
 third-party/nsh/examples/gallery/logo@2x.png       |   Bin 0 -> 2772 bytes
 third-party/nsh/examples/gallery/mark.svg          |    11 +
 third-party/nsh/examples/gallery/nav.ts            |    16 +
 third-party/nsh/examples/gallery/nsh.json          |    45 +
 third-party/nsh/examples/gallery/spinner.webp      |   Bin 0 -> 9948 bytes
 third-party/nsh/examples/gallery/star.svg          |     1 +
 .../examples/gallery/tests/context-menu.test.tsx   |    24 +
 .../nsh/examples/gallery/tests/controls.test.tsx   |   156 +
 .../nsh/examples/gallery/tests/device.test.tsx     |    22 +
 .../nsh/examples/gallery/tests/dock.test.tsx       |   175 +
 .../examples/gallery/tests/environment.test.tsx    |    18 +
 .../examples/gallery/tests/error-boundary.test.tsx |    22 +
 .../gallery/tests/fixtures/error-boundary.tsx      |    36 +
 .../gallery/tests/fixtures/list-search.tsx         |    24 +
 .../nsh/examples/gallery/tests/fixtures/press.tsx  |    37 +
 .../nsh/examples/gallery/tests/form.test.tsx       |    26 +
 .../nsh/examples/gallery/tests/gestures.test.tsx   |    27 +
 .../nsh/examples/gallery/tests/hover.test.tsx      |    15 +
 .../nsh/examples/gallery/tests/links.test.tsx      |    18 +
 .../examples/gallery/tests/list-search.test.tsx    |    16 +
 .../nsh/examples/gallery/tests/menus.test.tsx      |    83 +
 .../nsh/examples/gallery/tests/navigation.test.tsx |    29 +
 .../nsh/examples/gallery/tests/network.test.tsx    |    39 +
 .../nsh/examples/gallery/tests/overlays.test.tsx   |    67 +
 .../nsh/examples/gallery/tests/photos.test.tsx     |    13 +
 .../nsh/examples/gallery/tests/press.test.tsx      |    32 +
 .../nsh/examples/gallery/tests/resizable.test.tsx  |    51 +
 .../nsh/examples/gallery/tests/shortcuts.test.tsx  |    15 +
 .../nsh/examples/gallery/tests/storage.test.tsx    |    36 +
 .../nsh/examples/gallery/tests/text-view.test.tsx  |    31 +
 .../nsh/examples/gallery/tests/timers.test.tsx     |    19 +
 third-party/nsh/examples/gallery/theme.json        |   100 +
 third-party/nsh/examples/gallery/tools/echo.py     |   104 +
 third-party/nsh/examples/gallery/tsconfig.json     |     4 +
 third-party/nsh/examples/gallery/ui.tsx            |  1113 ++
 third-party/nsh/examples/hopper/App.tsx            |   175 +
 third-party/nsh/examples/hopper/FINDINGS.md        |    35 +
 .../nsh/examples/hopper/cards/FlightPlan.tsx       |   169 +
 third-party/nsh/examples/hopper/cards/HopLog.tsx   |   188 +
 third-party/nsh/examples/hopper/cards/Mass.tsx     |   203 +
 third-party/nsh/examples/hopper/cards/Rcs.tsx      |   162 +
 .../nsh/examples/hopper/cards/ThrottleProfile.tsx  |   339 +
 third-party/nsh/examples/hopper/cards/Tilt.tsx     |   158 +
 third-party/nsh/examples/hopper/icons.tsx          |    85 +
 third-party/nsh/examples/hopper/nsh.json           |     7 +
 third-party/nsh/examples/hopper/store.ts           |   287 +
 third-party/nsh/examples/hopper/theme.ts           |    28 +
 third-party/nsh/examples/hopper/tsconfig.json      |     4 +
 third-party/nsh/examples/hopper/ui.tsx             |   518 +
 third-party/nsh/examples/rust-exports/App.test.tsx |    24 +
 third-party/nsh/examples/rust-exports/App.tsx      |   156 +
 third-party/nsh/examples/rust-exports/README.md    |    35 +
 .../nsh/examples/rust-exports/native/Cargo.toml    |    20 +
 .../examples/rust-exports/native/src/account.rs    |   143 +
 .../nsh/examples/rust-exports/native/src/gauge.rs  |    99 +
 .../nsh/examples/rust-exports/native/src/ledger.rs |    62 +
 .../nsh/examples/rust-exports/native/src/lib.rs    |    27 +
 .../native/tests/rust_exports/common.rs            |    42 +
 .../native/tests/rust_exports/declarations.rs      |    54 +
 .../rust-exports/native/tests/rust_exports/main.rs |   102 +
 third-party/nsh/examples/rust-exports/nsh.json     |     5 +
 .../nsh/examples/rust-exports/tsconfig.json        |     4 +
 .../nsh/examples/terminal-workbench/App.tsx        |   267 +
 .../nsh/examples/terminal-workbench/README.md      |   100 +
 .../nsh/examples/terminal-workbench/assets/OFL.txt |    93 +
 .../terminal-workbench/assets/Pacifico-Regular.ttf |   Bin 0 -> 342012 bytes
 .../examples/terminal-workbench/assets/runtime.png |   Bin 0 -> 2772 bytes
 .../nsh/examples/terminal-workbench/data.ts        |    73 +
 .../nsh/examples/terminal-workbench/inspectors.tsx |   102 +
 .../nsh/examples/terminal-workbench/nsh.json       |     8 +
 .../nsh/examples/terminal-workbench/theme.json     |    28 +
 .../nsh/examples/terminal-workbench/tsconfig.json  |     4 +
 third-party/nsh/examples/terminal-workbench/ui.tsx |    72 +
 third-party/nsh/rust-toolchain.toml                |    10 +
 third-party/nsh/scripts/layerfs                    |    12 +
 third-party/nsh/tests/compat/cases/android/App.tsx |    29 +
 .../compat/cases/android/base-dialog-android.tsx   |    36 +
 .../nsh/tests/compat/cases/android/nsh.json        |     4 +
 .../cases/android/props-platform-android.tsx       |    20 +
 .../compat/cases/android/props-view-android.tsx    |    27 +
 .../nsh/tests/compat/cases/android/script.txt      |    35 +
 third-party/nsh/tests/compat/cases/base/App.tsx    |    63 +
 .../tests/compat/cases/base/base-alert-dialog.tsx  |    75 +
 .../nsh/tests/compat/cases/base/base-button.tsx    |    64 +
 .../nsh/tests/compat/cases/base/base-checkbox.tsx  |    64 +
 .../tests/compat/cases/base/base-collapsible.tsx   |    41 +
 .../compat/cases/base/base-dialog-backdrop.tsx     |    36 +
 .../nsh/tests/compat/cases/base/base-dialog.tsx    |   104 +
 .../nsh/tests/compat/cases/base/base-dock.tsx      |    49 +
 .../nsh/tests/compat/cases/base/base-nav-page.tsx  |   100 +
 .../nsh/tests/compat/cases/base/base-nav-stack.tsx |    81 +
 .../nsh/tests/compat/cases/base/base-popups.tsx    |   171 +
 .../nsh/tests/compat/cases/base/base-progress.tsx  |    36 +
 .../nsh/tests/compat/cases/base/base-radio.tsx     |    51 +
 .../nsh/tests/compat/cases/base/base-resizable.tsx |    68 +
 .../compat/cases/base/base-safe-area-keyboard.tsx  |    91 +
 .../compat/cases/base/base-selection-area.tsx      |    26 +
 .../tests/compat/cases/base/base-status-bar.tsx    |    58 +
 .../nsh/tests/compat/cases/base/base-switch.tsx    |    56 +
 .../nsh/tests/compat/cases/base/base-tabs.tsx      |    51 +
 .../nsh/tests/compat/cases/base/base-text-view.tsx |   131 +
 .../nsh/tests/compat/cases/base/base-token.tsx     |    21 +
 third-party/nsh/tests/compat/cases/base/nsh.json   |    21 +
 third-party/nsh/tests/compat/cases/base/script.txt |  1158 ++
 third-party/nsh/tests/compat/cases/browser/App.tsx |    31 +
 .../compat/cases/browser/base-popups-desktop.tsx   |    72 +
 .../nsh/tests/compat/cases/browser/nsh.json        |     4 +
 .../cases/browser/props-media-webview-desktop.tsx  |    21 +
 .../compat/cases/browser/props-platform-web.tsx    |    26 +
 .../compat/cases/browser/props-text-scaling.tsx    |    31 +
 .../nsh/tests/compat/cases/browser/script.txt      |    85 +
 third-party/nsh/tests/compat/cases/core/App.tsx    |    53 +
 .../nsh/tests/compat/cases/core/context.tsx        |    30 +
 .../nsh/tests/compat/cases/core/core-animated.tsx  |    64 +
 .../nsh/tests/compat/cases/core/core-canvas.tsx    |    75 +
 .../nsh/tests/compat/cases/core/core-elements.tsx  |    58 +
 .../compat/cases/core/core-error-boundary.tsx      |    44 +
 .../tests/compat/cases/core/core-input-action.tsx  |    22 +
 .../tests/compat/cases/core/core-list-binding.tsx  |    29 +
 .../nsh/tests/compat/cases/core/core-list.tsx      |   105 +
 .../nsh/tests/compat/cases/core/core-overlay.tsx   |    45 +
 .../tests/compat/cases/core/core-primitives.tsx    |    84 +
 .../nsh/tests/compat/cases/core/core-reactive.tsx  |    72 +
 .../nsh/tests/compat/cases/core/core-ref.tsx       |    54 +
 .../nsh/tests/compat/cases/core/core-resource.tsx  |    86 +
 .../nsh/tests/compat/cases/core/module-url.tsx     |     4 +
 third-party/nsh/tests/compat/cases/core/nsh.json   |     4 +
 third-party/nsh/tests/compat/cases/core/script.txt |   365 +
 third-party/nsh/tests/compat/cases/core/steps.tsx  |    33 +
 .../nsh/tests/compat/cases/core/tsconfig.json      |     4 +
 third-party/nsh/tests/compat/cases/events/App.tsx  |    41 +
 .../compat/cases/events/events-composition.tsx     |    25 +
 .../compat/cases/events/events-context-menu.tsx    |    33 +
 .../tests/compat/cases/events/events-gestures.tsx  |    46 +
 .../nsh/tests/compat/cases/events/events-input.tsx |    74 +
 .../tests/compat/cases/events/events-layout.tsx    |    36 +
 .../nsh/tests/compat/cases/events/events-media.tsx |    73 +
 .../tests/compat/cases/events/events-pointer.tsx   |    63 +
 .../tests/compat/cases/events/events-scroll.tsx    |    40 +
 .../nsh/tests/compat/cases/events/events-touch.tsx |   115 +
 third-party/nsh/tests/compat/cases/events/nsh.json |     4 +
 .../nsh/tests/compat/cases/events/script.txt       |   283 +
 third-party/nsh/tests/compat/cases/layout/App.tsx  |    37 +
 .../nsh/tests/compat/cases/layout/core-theme.tsx   |    18 +
 .../nsh/tests/compat/cases/layout/fonts/OFL.txt    |    93 +
 .../compat/cases/layout/fonts/Pacifico-Regular.ttf |   Bin 0 -> 329380 bytes
 .../nsh/tests/compat/cases/layout/layout-box.tsx   |   163 +
 .../tests/compat/cases/layout/layout-direction.tsx |   113 +
 .../nsh/tests/compat/cases/layout/layout-flex.tsx  |   219 +
 .../nsh/tests/compat/cases/layout/layout-grid.tsx  |   153 +
 .../tests/compat/cases/layout/layout-sticky.tsx    |    33 +
 .../tests/compat/cases/layout/layout-tailwind.tsx  |    65 +
 third-party/nsh/tests/compat/cases/layout/nsh.json |     7 +
 .../nsh/tests/compat/cases/layout/script.txt       |   358 +
 third-party/nsh/tests/compat/cases/macos/App.tsx   |    31 +
 .../nsh/tests/compat/cases/macos/base-dock.tsx     |    98 +
 .../nsh/tests/compat/cases/macos/desktop-props.tsx |    17 +
 .../compat/cases/macos/mod-standard-files.tsx      |    63 +
 .../compat/cases/macos/mod-standard-system.tsx     |    73 +
 third-party/nsh/tests/compat/cases/macos/nsh.json  |    14 +
 .../nsh/tests/compat/cases/macos/script.txt        |   141 +
 third-party/nsh/tests/compat/cases/modules/App.tsx |    41 +
 .../compat/cases/modules/mod-accessibility.tsx     |    30 +
 .../nsh/tests/compat/cases/modules/mod-android.tsx |    32 +
 .../tests/compat/cases/modules/mod-clipboard.tsx   |    36 +
 .../nsh/tests/compat/cases/modules/mod-desktop.tsx |    65 +
 .../nsh/tests/compat/cases/modules/mod-device.tsx  |    31 +
 .../nsh/tests/compat/cases/modules/mod-ios.tsx     |    26 +
 .../nsh/tests/compat/cases/modules/mod-keymap.tsx  |    44 +
 .../compat/cases/modules/mod-standard-access.tsx   |    31 +
 .../nsh/tests/compat/cases/modules/mod-storage.tsx |    52 +
 .../nsh/tests/compat/cases/modules/nsh.json        |     4 +
 .../nsh/tests/compat/cases/modules/script.txt      |   135 +
 third-party/nsh/tests/compat/cases/paint/App.tsx   |    47 +
 third-party/nsh/tests/compat/cases/paint/nsh.json  |     4 +
 .../nsh/tests/compat/cases/paint/paint-borders.tsx |    94 +
 .../nsh/tests/compat/cases/paint/paint-effects.tsx |    83 +
 .../compat/cases/paint/paint-inline-align.tsx      |    32 +
 .../nsh/tests/compat/cases/paint/paint-misc.tsx    |    75 +
 .../nsh/tests/compat/cases/paint/paint-motion.tsx  |    62 +
 .../compat/cases/paint/paint-object-position.tsx   |    37 +
 .../nsh/tests/compat/cases/paint/paint-shadows.tsx |    53 +
 .../tests/compat/cases/paint/paint-tailwind.tsx    |    51 +
 .../nsh/tests/compat/cases/paint/paint-text.tsx    |   153 +
 .../nsh/tests/compat/cases/paint/script.txt        |   606 +
 .../nsh/tests/compat/cases/paint/state-checked.tsx |    38 +
 .../compat/cases/paint/state-indeterminate.tsx     |    39 +
 .../nsh/tests/compat/cases/paint/state-styles.tsx  |    53 +
 third-party/nsh/tests/compat/cases/props/App.tsx   |    61 +
 .../nsh/tests/compat/cases/props/images/flag.png   |   Bin 0 -> 73 bytes
 .../tests/compat/cases/props/images/flag@2x.png    |   Bin 0 -> 74 bytes
 .../tests/compat/cases/props/images/flag@3x.png    |   Bin 0 -> 76 bytes
 third-party/nsh/tests/compat/cases/props/nsh.json  |     4 +
 .../compat/cases/props/props-gesture-values.tsx    |    36 +
 .../compat/cases/props/props-input-config.tsx      |    42 +
 .../tests/compat/cases/props/props-list-events.tsx |    64 +
 .../tests/compat/cases/props/props-list-follow.tsx |    48 +
 .../tests/compat/cases/props/props-list-layout.tsx |    53 +
 .../cases/props/props-list-sticky-offset.tsx       |    23 +
 .../compat/cases/props/props-list-viewport.tsx     |    27 +
 .../cases/props/props-media-image-inline.tsx       |    34 +
 .../cases/props/props-media-image-variants.tsx     |    24 +
 .../tests/compat/cases/props/props-media-image.tsx |    33 +
 .../tests/compat/cases/props/props-media-svg.tsx   |    22 +
 .../tests/compat/cases/props/props-media-video.tsx |    33 +
 .../compat/cases/props/props-media-webview.tsx     |    34 +
 .../compat/cases/props/props-scroll-behavior.tsx   |    53 +
 .../tests/compat/cases/props/props-scroll-zoom.tsx |    35 +
 .../tests/compat/cases/props/props-text-lines.tsx  |    49 +
 .../cases/props/props-view-accessibility.tsx       |    44 +
 .../compat/cases/props/props-view-styling.tsx      |    50 +
 .../tests/compat/cases/props/props-view-touch.tsx  |    33 +
 .../nsh/tests/compat/cases/props/script.txt        |   460 +
 .../nsh/tests/compat/cases/props/svg/badge.svg     |     1 +
 .../nsh/tests/compat/cases/props/svg/mark.svg      |     1 +
 .../nsh/tests/compat/cases/props/svg/star.svg      |     1 +
 third-party/nsh/tests/compat/cases/web/App.tsx     |    39 +
 third-party/nsh/tests/compat/cases/web/nsh.json    |     4 +
 third-party/nsh/tests/compat/cases/web/script.txt  |   422 +
 .../nsh/tests/compat/cases/web/web-blob.tsx        |   126 +
 .../tests/compat/cases/web/web-control-flow.tsx    |    88 +
 .../nsh/tests/compat/cases/web/web-encoding.tsx    |   118 +
 .../nsh/tests/compat/cases/web/web-events.tsx      |   204 +
 .../nsh/tests/compat/cases/web/web-fetch.tsx       |   217 +
 .../nsh/tests/compat/cases/web/web-streams.tsx     |   497 +
 .../nsh/tests/compat/cases/web/web-timers.tsx      |   208 +
 third-party/nsh/tests/compat/cases/web/web-url.tsx |   131 +
 third-party/nsh/tests/compat/examples/counter.txt  |    16 +
 third-party/nsh/tests/compat/examples/desktop.txt  |     6 +
 third-party/nsh/tests/compat/examples/gallery.txt  |    88 +
 third-party/nsh/tests/compat/examples/hopper.txt   |    75 +
 .../nsh/third-party/gpui-wgpu/.gitattributes       |     3 +
 third-party/nsh/third-party/gpui-wgpu/Cargo.toml   |   183 +
 .../nsh/third-party/gpui-wgpu/Cargo.toml.orig      |   119 +
 third-party/nsh/third-party/gpui-wgpu/LICENSE      |   206 +
 third-party/nsh/third-party/gpui-wgpu/README.md    |     9 +
 third-party/nsh/third-party/gpui-wgpu/SOURCE.md    |    81 +
 .../gpui-wgpu/src/cosmic_text_system.rs            |  1890 ++
 .../third-party/gpui-wgpu/src/fast/bind_groups.rs  |   103 +
 .../third-party/gpui-wgpu/src/fast/composition.rs  |    73 +
 .../nsh/third-party/gpui-wgpu/src/fast/frame.rs    |  1117 ++
 .../nsh/third-party/gpui-wgpu/src/fast/globals.rs  |    54 +
 .../gpui-wgpu/src/fast/layers/composite.rs         |    90 +
 .../third-party/gpui-wgpu/src/fast/layers/mod.rs   |    14 +
 .../gpui-wgpu/src/fast/layers/raster.rs            |    96 +
 .../src/fast/layers/rounded_clip_texture_tests.rs  |   183 +
 .../third-party/gpui-wgpu/src/fast/layers/tests.rs |  1199 ++
 .../gpui-wgpu/src/fast/layers/tile_cache.rs        |   484 +
 .../nsh/third-party/gpui-wgpu/src/fast/mod.rs      |    18 +
 .../third-party/gpui-wgpu/src/fast/pass_state.rs   |    50 +
 .../third-party/gpui-wgpu/src/fast/rounded_clip.rs |   415 +
 .../nsh/third-party/gpui-wgpu/src/gpui_wgpu.rs     |    22 +
 .../nsh/third-party/gpui-wgpu/src/shaders.wgsl     |  1362 ++
 .../third-party/gpui-wgpu/src/shaders_storage.wgsl |    42 +
 .../gpui-wgpu/src/shaders_subpixel.wgsl            |    56 +
 .../third-party/gpui-wgpu/src/shaders_webgl.wgsl   |   262 +
 .../nsh/third-party/gpui-wgpu/src/wgpu_atlas.rs    |   568 +
 .../nsh/third-party/gpui-wgpu/src/wgpu_context.rs  |   887 +
 .../nsh/third-party/gpui-wgpu/src/wgpu_renderer.rs |  3280 ++++
 .../gpui-wgpu/test-assets/IBMPlexSans-Regular.ttf  |   Bin 0 -> 200500 bytes
 .../gpui-wgpu/test-assets/IBMPlexSans-license.txt  |    92 +
 .../gpui-wgpu/test-assets/Lilex-Bold.ttf           |   Bin 0 -> 192992 bytes
 .../gpui-wgpu/test-assets/Lilex-Regular.ttf        |   Bin 0 -> 194308 bytes
 .../nsh/third-party/gpui-wgpu/test-assets/OFL.txt  |    93 +
 .../gpui-wgpu/test-assets/rounded_clip_fixtures.rs |   556 +
 .../nsh/third-party/gpui-wgpu/upstream.json        |    64 +
 third-party/nsh/third-party/icy_sixel/Cargo.toml   |    52 +
 .../nsh/third-party/icy_sixel/LICENSE-APACHE       |   202 +
 third-party/nsh/third-party/icy_sixel/LICENSE-MIT  |    27 +
 third-party/nsh/third-party/icy_sixel/README.md    |   218 +
 third-party/nsh/third-party/icy_sixel/SOURCE.md    |    33 +
 .../nsh/third-party/icy_sixel/src/decoder.rs       |  1007 +
 .../nsh/third-party/icy_sixel/src/encoder.rs       |   525 +
 third-party/nsh/third-party/icy_sixel/src/lib.rs   |    87 +
 .../nsh/third-party/icy_sixel/src/sixel_image.rs   |   354 +
 third-party/nsh/upstream.json                      |  1676 ++
 third-party/nsh/website/.gitignore                 |     7 +
 third-party/nsh/website/DESIGN.md                  |   190 +
 third-party/nsh/website/README.md                  |   226 +
 third-party/nsh/website/astro.config.mjs           |    55 +
 third-party/nsh/website/demos/.gitignore           |     2 +
 third-party/nsh/website/demos/counter.tsx          |    55 +
 third-party/nsh/website/demos/el-alert-dialog.tsx  |   122 +
 third-party/nsh/website/demos/el-button.tsx        |   136 +
 third-party/nsh/website/demos/el-canvas.tsx        |   171 +
 third-party/nsh/website/demos/el-checkbox.tsx      |   118 +
 third-party/nsh/website/demos/el-collapsible.tsx   |   121 +
 third-party/nsh/website/demos/el-control-flow.tsx  |   127 +
 third-party/nsh/website/demos/el-dialog.tsx        |   169 +
 third-party/nsh/website/demos/el-dock.tsx          |   155 +
 third-party/nsh/website/demos/el-image.tsx         |   129 +
 third-party/nsh/website/demos/el-input.tsx         |   124 +
 .../website/demos/el-keyboard-avoiding-view.tsx    |    92 +
 third-party/nsh/website/demos/el-list.tsx          |   220 +
 third-party/nsh/website/demos/el-menu.tsx          |   175 +
 third-party/nsh/website/demos/el-overlay.tsx       |   143 +
 third-party/nsh/website/demos/el-popover.tsx       |    94 +
 third-party/nsh/website/demos/el-progress.tsx      |   158 +
 third-party/nsh/website/demos/el-radio.tsx         |    99 +
 third-party/nsh/website/demos/el-resizable.tsx     |    87 +
 .../nsh/website/demos/el-safe-area-view.tsx        |    82 +
 third-party/nsh/website/demos/el-scroll.tsx        |   121 +
 .../nsh/website/demos/el-selection-area.tsx        |    48 +
 third-party/nsh/website/demos/el-sheet.tsx         |   123 +
 third-party/nsh/website/demos/el-switch.tsx        |    85 +
 third-party/nsh/website/demos/el-tabs.tsx          |   136 +
 third-party/nsh/website/demos/el-text.tsx          |    78 +
 third-party/nsh/website/demos/el-tooltip.tsx       |   124 +
 third-party/nsh/website/demos/el-video.tsx         |    88 +
 third-party/nsh/website/demos/el-view.tsx          |    97 +
 third-party/nsh/website/demos/el-web-view.tsx      |   100 +
 third-party/nsh/website/demos/graphite-theme.json  |    76 +
 third-party/nsh/website/demos/guide-animation.tsx  |   200 +
 third-party/nsh/website/demos/guide-canvas.tsx     |   193 +
 third-party/nsh/website/demos/guide-components.tsx |    92 +
 third-party/nsh/website/demos/guide-device.tsx     |    61 +
 third-party/nsh/website/demos/guide-forms.tsx      |   184 +
 third-party/nsh/website/demos/guide-gestures.tsx   |   176 +
 .../nsh/website/demos/guide-getting-started.tsx    |    59 +
 third-party/nsh/website/demos/guide-layout.tsx     |   148 +
 third-party/nsh/website/demos/guide-lists.tsx      |   208 +
 third-party/nsh/website/demos/guide-reactivity.tsx |   131 +
 third-party/nsh/website/demos/guide-scrolling.tsx  |   164 +
 third-party/nsh/website/demos/guide-styling.tsx    |   116 +
 third-party/nsh/website/demos/guide-tailwind.tsx   |   106 +
 third-party/nsh/website/demos/hero-chat/Chat.tsx   |   760 +
 .../nsh/website/demos/hero-chat/ImageViewer.tsx    |   159 +
 .../nsh/website/demos/hero-chat/chat/glyphs.tsx    |   133 +
 .../nsh/website/demos/hero-chat/chat/markdown.tsx  |    56 +
 .../nsh/website/demos/hero-chat/chat/parts.tsx     |   328 +
 .../nsh/website/demos/hero-chat/chat/scripts.ts    |   282 +
 third-party/nsh/website/demos/hero-chat/icons.tsx  |   227 +
 third-party/nsh/website/demos/hero-chat/ui.tsx     |   780 +
 third-party/nsh/website/demos/home-chat.tsx        |     6 +
 third-party/nsh/website/demos/mod-animated.tsx     |   132 +
 third-party/nsh/website/demos/mod-canvas.tsx       |   139 +
 third-party/nsh/website/demos/mod-storage.tsx      |    46 +
 third-party/nsh/website/demos/nsh.json             |     3 +
 third-party/nsh/website/demos/palette.ts           |   320 +
 third-party/nsh/website/demos/text-view.tsx        |    69 +
 third-party/nsh/website/demos/tsconfig.json        |     4 +
 third-party/nsh/website/demos/ui-navigation.tsx    |   163 +
 third-party/nsh/website/docs/accessibility.md      |   333 +
 third-party/nsh/website/docs/android.md            |   299 +
 third-party/nsh/website/docs/animation.md          |   569 +
 third-party/nsh/website/docs/architecture.md       |   173 +
 third-party/nsh/website/docs/canvas.md             |   529 +
 third-party/nsh/website/docs/cli.md                |   320 +
 third-party/nsh/website/docs/coding-guides.md      |  1184 ++
 third-party/nsh/website/docs/comparison.md         |    59 +
 third-party/nsh/website/docs/compatibility.md      |   174 +
 third-party/nsh/website/docs/design-guides.md      |  1173 ++
 .../nsh/website/docs/dev-server-and-debugging.md   |   263 +
 .../nsh/website/docs/device-and-environment.md     |   405 +
 third-party/nsh/website/docs/fonts.md              |   170 +
 third-party/nsh/website/docs/forms-and-keyboard.md |   672 +
 third-party/nsh/website/docs/getting-started.md    |   471 +
 third-party/nsh/website/docs/gpui.md               |   190 +
 third-party/nsh/website/docs/images-and-assets.md  |   329 +
 third-party/nsh/website/docs/index.md              |   168 +
 third-party/nsh/website/docs/installation.md       |   229 +
 third-party/nsh/website/docs/ios.md                |   340 +
 third-party/nsh/website/docs/jsx-and-components.md |   456 +
 third-party/nsh/website/docs/layerfs.md            |   104 +
 third-party/nsh/website/docs/layout.md             |   292 +
 third-party/nsh/website/docs/linux.md              |   189 +
 third-party/nsh/website/docs/lists.md              |   763 +
 third-party/nsh/website/docs/macos.md              |   222 +
 third-party/nsh/website/docs/native-components.md  |   604 +
 third-party/nsh/website/docs/navigation.md         |   586 +
 third-party/nsh/website/docs/networking.md         |   352 +
 third-party/nsh/website/docs/packaging.md          |   267 +
 third-party/nsh/website/docs/performance.md        |   272 +
 third-party/nsh/website/docs/platform-specific.md  |   331 +
 third-party/nsh/website/docs/platforms.md          |   125 +
 third-party/nsh/website/docs/project-structure.md  |   293 +
 third-party/nsh/website/docs/reactivity.md         |   548 +
 third-party/nsh/website/docs/rust.md               |   573 +
 .../nsh/website/docs/sandbox-and-capabilities.md   |   257 +
 third-party/nsh/website/docs/scrolling.md          |   523 +
 third-party/nsh/website/docs/signed-packages.md    |   354 +
 third-party/nsh/website/docs/styling.md            |   429 +
 third-party/nsh/website/docs/tailwind.md           |   304 +
 third-party/nsh/website/docs/testing-and-trace.md  |   636 +
 third-party/nsh/website/docs/text.md               |   315 +
 third-party/nsh/website/docs/touch-and-gestures.md |   639 +
 third-party/nsh/website/docs/tui.md                |   304 +
 third-party/nsh/website/docs/web-view-and-video.md |   450 +
 third-party/nsh/website/docs/web.md                |   339 +
 third-party/nsh/website/docs/windows.md            |   191 +
 third-party/nsh/website/elements/alert-dialog.md   |   177 +
 third-party/nsh/website/elements/button.md         |   242 +
 third-party/nsh/website/elements/canvas.md         |   182 +
 third-party/nsh/website/elements/checkbox.md       |   173 +
 third-party/nsh/website/elements/collapsible.md    |   118 +
 third-party/nsh/website/elements/control-flow.md   |   159 +
 third-party/nsh/website/elements/dialog.md         |   234 +
 third-party/nsh/website/elements/dock.md           |   400 +
 third-party/nsh/website/elements/image.md          |   176 +
 third-party/nsh/website/elements/index.md          |   487 +
 third-party/nsh/website/elements/input.md          |   215 +
 .../nsh/website/elements/keyboard-avoiding-view.md |   221 +
 third-party/nsh/website/elements/list.md           |   238 +
 third-party/nsh/website/elements/menu.md           |   175 +
 third-party/nsh/website/elements/nav-stack.md      |   384 +
 third-party/nsh/website/elements/overlay.md        |   155 +
 third-party/nsh/website/elements/popover.md        |   134 +
 third-party/nsh/website/elements/progress.md       |   123 +
 third-party/nsh/website/elements/radio.md          |   170 +
 third-party/nsh/website/elements/resizable.md      |   203 +
 third-party/nsh/website/elements/safe-area-view.md |   130 +
 third-party/nsh/website/elements/scroll.md         |   200 +
 third-party/nsh/website/elements/selection-area.md |   121 +
 third-party/nsh/website/elements/sheet.md          |   100 +
 third-party/nsh/website/elements/switch.md         |   145 +
 third-party/nsh/website/elements/tabs.md           |   176 +
 third-party/nsh/website/elements/text-view.md      |   810 +
 third-party/nsh/website/elements/text.md           |   238 +
 third-party/nsh/website/elements/tooltip.md        |   107 +
 third-party/nsh/website/elements/video.md          |   142 +
 third-party/nsh/website/elements/view.md           |   239 +
 third-party/nsh/website/elements/web-view.md       |   174 +
 third-party/nsh/website/modules/globals.md         |   695 +
 third-party/nsh/website/modules/index.md           |    63 +
 .../nsh/website/modules/nsh-accessibility.md       |   117 +
 third-party/nsh/website/modules/nsh-android.md     |   128 +
 third-party/nsh/website/modules/nsh-animated.md    |   402 +
 third-party/nsh/website/modules/nsh-base.md        |   325 +
 third-party/nsh/website/modules/nsh-canvas.md      |   263 +
 third-party/nsh/website/modules/nsh-clipboard.md   |   277 +
 third-party/nsh/website/modules/nsh-desktop.md     |   287 +
 third-party/nsh/website/modules/nsh-device.md      |   201 +
 third-party/nsh/website/modules/nsh-gesture.md     |   177 +
 third-party/nsh/website/modules/nsh-image.md       |    69 +
 third-party/nsh/website/modules/nsh-ios.md         |   113 +
 third-party/nsh/website/modules/nsh-keymap.md      |   244 +
 third-party/nsh/website/modules/nsh-list.md        |   229 +
 third-party/nsh/website/modules/nsh-native.md      |   200 +
 third-party/nsh/website/modules/nsh-storage.md     |   155 +
 third-party/nsh/website/modules/nsh-video.md       |    99 +
 third-party/nsh/website/modules/nsh-webview.md     |   128 +
 third-party/nsh/website/modules/nsh.md             |   346 +
 .../nsh/website/modules/standard-modules.md        |   259 +
 third-party/nsh/website/modules/style-reference.md |   483 +
 .../nsh/website/modules/tailwind-reference.md      |   652 +
 third-party/nsh/website/package.json               |    37 +
 third-party/nsh/website/public/CNAME               |     1 +
 .../nsh/website/public/apple-touch-icon.png        |   Bin 0 -> 3355 bytes
 .../nsh/website/public/diagrams/ai-flow-dark.svg   |   148 +
 .../nsh/website/public/diagrams/ai-flow-light.svg  |   148 +
 .../public/diagrams/alignment-spines-dark.svg      |   106 +
 .../public/diagrams/alignment-spines-light.svg     |   106 +
 .../public/diagrams/application-layers-dark.svg    |    75 +
 .../public/diagrams/application-layers-light.svg   |    75 +
 .../website/public/diagrams/architecture-dark.svg  |   173 +
 .../website/public/diagrams/architecture-light.svg |   173 +
 .../nsh/website/public/diagrams/host-app-dark.svg  |   193 +
 .../nsh/website/public/diagrams/host-app-light.svg |   193 +
 .../nsh/website/public/diagrams/platforms-dark.svg |   184 +
 .../website/public/diagrams/platforms-light.svg    |   184 +
 .../public/diagrams/radius-hierarchy-dark.svg      |    89 +
 .../public/diagrams/radius-hierarchy-light.svg     |    89 +
 .../public/diagrams/signed-packages-dark.svg       |   188 +
 .../public/diagrams/signed-packages-light.svg      |   188 +
 third-party/nsh/website/public/favicon.svg         |    20 +
 third-party/nsh/website/public/icon-512.png        |   Bin 0 -> 9869 bytes
 third-party/nsh/website/public/install.ps1         |    81 +
 third-party/nsh/website/public/install.sh          |   132 +
 third-party/nsh/website/public/logo.svg            |    10 +
 third-party/nsh/website/scripts/play.js            |    45 +
 .../nsh/website/src/components/DemoFrame.astro     |    61 +
 .../nsh/website/src/components/DocPage.astro       |    13 +
 .../nsh/website/src/components/DocSearch.astro     |   106 +
 .../nsh/website/src/components/Gallery.astro       |   180 +
 .../nsh/website/src/components/HeroField.astro     |   328 +
 third-party/nsh/website/src/components/Home.astro  |   766 +
 third-party/nsh/website/src/components/Logo.astro  |    20 +
 third-party/nsh/website/src/components/Nav.astro   |   116 +
 .../nsh/website/src/components/Playground.astro    |   322 +
 .../nsh/website/src/components/Sidebar.astro       |    73 +
 .../nsh/website/src/components/SiteFooter.astro    |    28 +
 .../nsh/website/src/components/ThemeSwitch.astro   |    69 +
 third-party/nsh/website/src/components/Toc.astro   |    61 +
 third-party/nsh/website/src/content.config.ts      |    33 +
 third-party/nsh/website/src/dark.theme.json        |   161 +
 .../nsh/website/src/layouts/BaseLayout.astro       |    73 +
 .../nsh/website/src/layouts/DocsLayout.astro       |   134 +
 .../nsh/website/src/lib/code-tabs-client.ts        |    67 +
 third-party/nsh/website/src/lib/demo-client.ts     |   152 +
 third-party/nsh/website/src/lib/demo.js            |   186 +
 third-party/nsh/website/src/lib/llms.ts            |    27 +
 .../nsh/website/src/lib/markdown-endpoint.ts       |    54 +
 third-party/nsh/website/src/lib/markdown.js        |    19 +
 third-party/nsh/website/src/lib/play-dev.js        |    64 +
 .../nsh/website/src/lib/playground-client.ts       |   309 +
 .../nsh/website/src/lib/rehype-heading-anchors.js  |    25 +
 third-party/nsh/website/src/lib/remark-callouts.js |    47 +
 .../nsh/website/src/lib/remark-code-tabs.js        |   136 +
 third-party/nsh/website/src/lib/remark-demo.js     |    18 +
 .../nsh/website/src/lib/remark-doc-links.js        |    71 +
 .../nsh/website/src/lib/remark-strip-title.js      |    11 +
 third-party/nsh/website/src/lib/sections.ts        |   154 +
 third-party/nsh/website/src/lib/site.ts            |    30 +
 third-party/nsh/website/src/light.theme.json       |   161 +
 third-party/nsh/website/src/pages/404.astro        |    53 +
 third-party/nsh/website/src/pages/[section].md.ts  |    11 +
 .../website/src/pages/[section]/[...slug].astro    |    15 +
 .../website/src/pages/[section]/[...slug].md.ts    |    12 +
 third-party/nsh/website/src/pages/gallery.astro    |    18 +
 third-party/nsh/website/src/pages/index.astro      |    13 +
 third-party/nsh/website/src/pages/llms-full.txt.ts |     5 +
 third-party/nsh/website/src/pages/llms.txt.ts      |     5 +
 third-party/nsh/website/src/pages/playground.astro |    18 +
 third-party/nsh/website/src/pages/robots.txt.ts    |     7 +
 third-party/nsh/website/src/pages/sitemap.xml.ts   |    33 +
 .../nsh/website/src/pages/zh-CN/[section].md.ts    |    11 +
 .../src/pages/zh-CN/[section]/[...slug].astro      |    15 +
 .../src/pages/zh-CN/[section]/[...slug].md.ts      |    12 +
 .../nsh/website/src/pages/zh-CN/gallery.astro      |    18 +
 .../nsh/website/src/pages/zh-CN/index.astro        |    18 +
 .../nsh/website/src/pages/zh-CN/playground.astro   |    18 +
 third-party/nsh/website/src/styles/global.css      |  1374 ++
 third-party/nsh/website/tests/code-tabs.test.ts    |    78 +
 third-party/nsh/website/tests/content.test.ts      |    98 +
 third-party/nsh/website/tests/links.test.ts        |   106 +
 .../nsh/website/tests/scroll-snapping.test.ts      |    81 +
 third-party/nsh/website/tests/storage-keys.test.ts |    32 +
 third-party/nsh/website/tests/storage.test.ts      |   243 +
 third-party/nsh/website/tsconfig.json              |     5 +
 .../nsh/website/zh-CN/docs/accessibility.md        |   333 +
 third-party/nsh/website/zh-CN/docs/android.md      |   286 +
 third-party/nsh/website/zh-CN/docs/animation.md    |   569 +
 third-party/nsh/website/zh-CN/docs/architecture.md |   154 +
 third-party/nsh/website/zh-CN/docs/canvas.md       |   529 +
 third-party/nsh/website/zh-CN/docs/cli.md          |   303 +
 .../nsh/website/zh-CN/docs/coding-guides.md        |  1053 ++
 third-party/nsh/website/zh-CN/docs/comparison.md   |    59 +
 .../nsh/website/zh-CN/docs/compatibility.md        |   135 +
 .../nsh/website/zh-CN/docs/design-guides.md        |   862 +
 .../website/zh-CN/docs/dev-server-and-debugging.md |   227 +
 .../website/zh-CN/docs/device-and-environment.md   |   403 +
 third-party/nsh/website/zh-CN/docs/fonts.md        |   170 +
 .../nsh/website/zh-CN/docs/forms-and-keyboard.md   |   670 +
 .../nsh/website/zh-CN/docs/getting-started.md      |   428 +
 third-party/nsh/website/zh-CN/docs/gpui.md         |   157 +
 .../nsh/website/zh-CN/docs/images-and-assets.md    |   329 +
 third-party/nsh/website/zh-CN/docs/index.md        |   168 +
 third-party/nsh/website/zh-CN/docs/installation.md |   230 +
 third-party/nsh/website/zh-CN/docs/ios.md          |   322 +
 .../nsh/website/zh-CN/docs/jsx-and-components.md   |   452 +
 third-party/nsh/website/zh-CN/docs/layerfs.md      |    94 +
 third-party/nsh/website/zh-CN/docs/layout.md       |   292 +
 third-party/nsh/website/zh-CN/docs/linux.md        |   175 +
 third-party/nsh/website/zh-CN/docs/lists.md        |   765 +
 third-party/nsh/website/zh-CN/docs/macos.md        |   200 +
 .../nsh/website/zh-CN/docs/native-components.md    |   581 +
 third-party/nsh/website/zh-CN/docs/navigation.md   |   591 +
 third-party/nsh/website/zh-CN/docs/networking.md   |   352 +
 third-party/nsh/website/zh-CN/docs/packaging.md    |   242 +
 third-party/nsh/website/zh-CN/docs/performance.md  |   257 +
 .../nsh/website/zh-CN/docs/platform-specific.md    |   329 +
 third-party/nsh/website/zh-CN/docs/platforms.md    |   125 +
 .../nsh/website/zh-CN/docs/project-structure.md    |   292 +
 third-party/nsh/website/zh-CN/docs/reactivity.md   |   547 +
 third-party/nsh/website/zh-CN/docs/rust.md         |   524 +
 .../website/zh-CN/docs/sandbox-and-capabilities.md |   240 +
 third-party/nsh/website/zh-CN/docs/scrolling.md    |   523 +
 .../nsh/website/zh-CN/docs/signed-packages.md      |   336 +
 third-party/nsh/website/zh-CN/docs/styling.md      |   428 +
 third-party/nsh/website/zh-CN/docs/tailwind.md     |   304 +
 .../nsh/website/zh-CN/docs/testing-and-trace.md    |   598 +
 third-party/nsh/website/zh-CN/docs/text.md         |   307 +
 .../nsh/website/zh-CN/docs/touch-and-gestures.md   |   639 +
 third-party/nsh/website/zh-CN/docs/tui.md          |   273 +
 .../nsh/website/zh-CN/docs/web-view-and-video.md   |   445 +
 third-party/nsh/website/zh-CN/docs/web.md          |   317 +
 third-party/nsh/website/zh-CN/docs/windows.md      |   171 +
 .../nsh/website/zh-CN/elements/alert-dialog.md     |   173 +
 third-party/nsh/website/zh-CN/elements/button.md   |   237 +
 third-party/nsh/website/zh-CN/elements/canvas.md   |   161 +
 third-party/nsh/website/zh-CN/elements/checkbox.md |   168 +
 .../nsh/website/zh-CN/elements/collapsible.md      |   110 +
 .../nsh/website/zh-CN/elements/control-flow.md     |   144 +
 third-party/nsh/website/zh-CN/elements/dialog.md   |   214 +
 third-party/nsh/website/zh-CN/elements/dock.md     |   353 +
 third-party/nsh/website/zh-CN/elements/image.md    |   162 +
 third-party/nsh/website/zh-CN/elements/index.md    |   434 +
 third-party/nsh/website/zh-CN/elements/input.md    |   204 +
 .../zh-CN/elements/keyboard-avoiding-view.md       |   217 +
 third-party/nsh/website/zh-CN/elements/list.md     |   220 +
 third-party/nsh/website/zh-CN/elements/menu.md     |   175 +
 .../nsh/website/zh-CN/elements/nav-stack.md        |   366 +
 third-party/nsh/website/zh-CN/elements/overlay.md  |   146 +
 third-party/nsh/website/zh-CN/elements/popover.md  |   131 +
 third-party/nsh/website/zh-CN/elements/progress.md |   107 +
 third-party/nsh/website/zh-CN/elements/radio.md    |   165 +
 .../nsh/website/zh-CN/elements/resizable.md        |   183 +
 .../nsh/website/zh-CN/elements/safe-area-view.md   |   128 +
 third-party/nsh/website/zh-CN/elements/scroll.md   |   185 +
 .../nsh/website/zh-CN/elements/selection-area.md   |   111 +
 third-party/nsh/website/zh-CN/elements/sheet.md    |   100 +
 third-party/nsh/website/zh-CN/elements/switch.md   |   143 +
 third-party/nsh/website/zh-CN/elements/tabs.md     |   170 +
 .../nsh/website/zh-CN/elements/text-view.md        |   761 +
 third-party/nsh/website/zh-CN/elements/text.md     |   214 +
 third-party/nsh/website/zh-CN/elements/tooltip.md  |   105 +
 third-party/nsh/website/zh-CN/elements/video.md    |   136 +
 third-party/nsh/website/zh-CN/elements/view.md     |   211 +
 third-party/nsh/website/zh-CN/elements/web-view.md |   166 +
 third-party/nsh/website/zh-CN/modules/globals.md   |   695 +
 third-party/nsh/website/zh-CN/modules/index.md     |    65 +
 .../nsh/website/zh-CN/modules/nsh-accessibility.md |   117 +
 .../nsh/website/zh-CN/modules/nsh-android.md       |   128 +
 .../nsh/website/zh-CN/modules/nsh-animated.md      |   402 +
 third-party/nsh/website/zh-CN/modules/nsh-base.md  |   302 +
 .../nsh/website/zh-CN/modules/nsh-canvas.md        |   263 +
 .../nsh/website/zh-CN/modules/nsh-clipboard.md     |   267 +
 .../nsh/website/zh-CN/modules/nsh-desktop.md       |   287 +
 .../nsh/website/zh-CN/modules/nsh-device.md        |   201 +
 .../nsh/website/zh-CN/modules/nsh-gesture.md       |   177 +
 third-party/nsh/website/zh-CN/modules/nsh-image.md |    69 +
 third-party/nsh/website/zh-CN/modules/nsh-ios.md   |   113 +
 .../nsh/website/zh-CN/modules/nsh-keymap.md        |   241 +
 third-party/nsh/website/zh-CN/modules/nsh-list.md  |   227 +
 .../nsh/website/zh-CN/modules/nsh-native.md        |   198 +
 .../nsh/website/zh-CN/modules/nsh-storage.md       |   155 +
 third-party/nsh/website/zh-CN/modules/nsh-video.md |    99 +
 .../nsh/website/zh-CN/modules/nsh-webview.md       |   128 +
 third-party/nsh/website/zh-CN/modules/nsh.md       |   335 +
 .../nsh/website/zh-CN/modules/standard-modules.md  |   259 +
 .../nsh/website/zh-CN/modules/style-reference.md   |   483 +
 .../website/zh-CN/modules/tailwind-reference.md    |   652 +
 1674 files changed, 674346 insertions(+), 24926 deletions(-)

diff --git a/.gitattributes b/.gitattributes
index 7bb8f6c18b..84f33380a9 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -16,3 +16,15 @@
 # working notes are not source-release inputs.
 /.claude export-ignore
 /.maka-shots export-ignore
+
+# Preserve verbatim whitespace in the pinned NSH source snapshot.
+/third-party/nsh/.gitattributes whitespace=-blank-at-eof
+/third-party/nsh/examples/gallery/TitleBar.tsx whitespace=-blank-at-eof
+/third-party/nsh/examples/gallery/demos/chat/markdown.tsx whitespace=-blank-at-eof
+/third-party/nsh/third-party/icy_sixel/Cargo.toml whitespace=-blank-at-eof
+/third-party/nsh/website/demos/hero-chat/chat/markdown.tsx whitespace=-blank-at-eof
+/third-party/nsh/website/demos/hero-chat/ui.tsx whitespace=-blank-at-eof
+/third-party/nsh/examples/gallery-rs/native/assets/fonts/OFL.txt whitespace=-blank-at-eol
+/third-party/nsh/examples/gallery/fonts/OFL.txt whitespace=-blank-at-eol
+/third-party/nsh/tests/compat/cases/layout/fonts/OFL.txt whitespace=-blank-at-eol
+/third-party/nsh/third-party/icy_sixel/src/decoder.rs whitespace=-blank-at-eol
diff --git a/Cargo.lock b/Cargo.lock
index 85538cf429..1ea47be2d2 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -6313,7 +6313,6 @@ dependencies = [
 [[package]]
 name = "gpui-fast-wgpu"
 version = "0.1.10"
-source = "git+https://github.com/M4n5ter/nsh?rev=645cc38dea68da8fb03df3ccafa77ac9a86b489a#645cc38dea68da8fb03df3ccafa77ac9a86b489a"
 dependencies = [
  "anyhow",
  "bytemuck",
@@ -7715,7 +7714,6 @@ checksum = "ae293c039020f9ec10710af98d29ce6aa2051486638b49c9a6409f3b4a9e98ad"
 [[package]]
 name = "icy_sixel"
 version = "0.5.1"
-source = "git+https://github.com/M4n5ter/nsh?rev=645cc38dea68da8fb03df3ccafa77ac9a86b489a#645cc38dea68da8fb03df3ccafa77ac9a86b489a"
 dependencies = [
  "quantette",
  "thiserror 2.0.20",
@@ -10940,7 +10938,6 @@ dependencies = [
 [[package]]
 name = "nsh-base"
 version = "0.2.0"
-source = "git+https://github.com/M4n5ter/nsh?rev=645cc38dea68da8fb03df3ccafa77ac9a86b489a#645cc38dea68da8fb03df3ccafa77ac9a86b489a"
 dependencies = [
  "html5ever 0.27.0",
  "log",
@@ -10958,7 +10955,6 @@ dependencies = [
 [[package]]
 name = "nsh-bundler"
 version = "0.2.0"
-source = "git+https://github.com/M4n5ter/nsh?rev=645cc38dea68da8fb03df3ccafa77ac9a86b489a#645cc38dea68da8fb03df3ccafa77ac9a86b489a"
 dependencies = [
  "anyhow",
  "dunce",
@@ -10983,7 +10979,6 @@ dependencies = [
 [[package]]
 name = "nsh-core"
 version = "0.2.0"
-source = "git+https://github.com/M4n5ter/nsh?rev=645cc38dea68da8fb03df3ccafa77ac9a86b489a#645cc38dea68da8fb03df3ccafa77ac9a86b489a"
 dependencies = [
  "cap-std",
  "flate2",
@@ -11000,6 +10995,7 @@ dependencies = [
  "taffy 0.15.0",
  "tokio",
  "tokio-tungstenite 0.28.0",
+ "unicode-linebreak",
  "url",
  "windows-sys 0.61.2",
 ]
@@ -11007,7 +11003,6 @@ dependencies = [
 [[package]]
 name = "nsh-engine"
 version = "0.2.0"
-source = "git+https://github.com/M4n5ter/nsh?rev=645cc38dea68da8fb03df3ccafa77ac9a86b489a#645cc38dea68da8fb03df3ccafa77ac9a86b489a"
 dependencies = [
  "crossbeam-channel",
  "libc",
@@ -11025,7 +11020,6 @@ dependencies = [
 [[package]]
 name = "nsh-gpui-terminal"
 version = "0.2.0"
-source = "git+https://github.com/M4n5ter/nsh?rev=645cc38dea68da8fb03df3ccafa77ac9a86b489a#645cc38dea68da8fb03df3ccafa77ac9a86b489a"
 dependencies = [
  "anyhow",
  "base64 0.22.1",
@@ -11043,7 +11037,6 @@ dependencies = [
 [[package]]
 name = "nsh-js"
 version = "0.2.0"
-source = "git+https://github.com/M4n5ter/nsh?rev=645cc38dea68da8fb03df3ccafa77ac9a86b489a#645cc38dea68da8fb03df3ccafa77ac9a86b489a"
 dependencies = [
  "futures-util",
  "getrandom 0.4.3",
@@ -11064,7 +11057,6 @@ dependencies = [
 [[package]]
 name = "nsh-macros"
 version = "0.2.0"
-source = "git+https://github.com/M4n5ter/nsh?rev=645cc38dea68da8fb03df3ccafa77ac9a86b489a#645cc38dea68da8fb03df3ccafa77ac9a86b489a"
 dependencies = [
  "imagesize 0.15.0",
  "proc-macro2",
@@ -11076,7 +11068,6 @@ dependencies = [
 [[package]]
 name = "nsh-package"
 version = "0.2.0"
-source = "git+https://github.com/M4n5ter/nsh?rev=645cc38dea68da8fb03df3ccafa77ac9a86b489a#645cc38dea68da8fb03df3ccafa77ac9a86b489a"
 dependencies = [
  "base64 0.22.1",
  "ed25519-dalek 2.2.0",
@@ -11091,7 +11082,6 @@ dependencies = [
 [[package]]
 name = "nsh-platform-gpui"
 version = "0.2.0"
-source = "git+https://github.com/M4n5ter/nsh?rev=645cc38dea68da8fb03df3ccafa77ac9a86b489a#645cc38dea68da8fb03df3ccafa77ac9a86b489a"
 dependencies = [
  "anyhow",
  "crossbeam-channel",
@@ -11122,7 +11112,6 @@ dependencies = [
 [[package]]
 name = "nsh-platform-tui"
 version = "0.2.0"
-source = "git+https://github.com/M4n5ter/nsh?rev=645cc38dea68da8fb03df3ccafa77ac9a86b489a#645cc38dea68da8fb03df3ccafa77ac9a86b489a"
 dependencies = [
  "base64 0.22.1",
  "crossbeam-channel",
diff --git a/Cargo.toml b/Cargo.toml
index fd27ba01d9..ee1a25cdff 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -16,7 +16,7 @@
 # under the License.
 
 [workspace]
-exclude = ["third-party/gpui-fast", "third-party/async-io", "third-party/gix-index", "third-party/sqlx-sqlite", "third-party/image-webp", "third-party/llrt-crypto", "third-party/termina"]
+exclude = ["third-party/nsh", "third-party/gpui-fast", "third-party/async-io", "third-party/gix-index", "third-party/sqlx-sqlite", "third-party/image-webp", "third-party/llrt-crypto", "third-party/termina"]
 default-members = ["products/maka/cli"]
 members = [
     "plugins/agent/facts",
@@ -91,13 +91,13 @@ publish = false
 hex = "0.4.3"
 maka-ui-authoring = { path = "plugins/application/authoring/native" }
 maka-app-client = { path = "products/maka/client" }
-nsh-core = { git = "https://github.com/M4n5ter/nsh", rev = "645cc38dea68da8fb03df3ccafa77ac9a86b489a" }
-nsh-engine = { git = "https://github.com/M4n5ter/nsh", rev = "645cc38dea68da8fb03df3ccafa77ac9a86b489a" }
-nsh-platform-tui = { git = "https://github.com/M4n5ter/nsh", rev = "645cc38dea68da8fb03df3ccafa77ac9a86b489a" }
-nsh-platform-gpui = { git = "https://github.com/M4n5ter/nsh", rev = "645cc38dea68da8fb03df3ccafa77ac9a86b489a", default-features = false, features = ["js"] }
-nsh-gpui-terminal = { git = "https://github.com/M4n5ter/nsh", rev = "645cc38dea68da8fb03df3ccafa77ac9a86b489a" }
-nsh-bundler = { git = "https://github.com/M4n5ter/nsh", rev = "645cc38dea68da8fb03df3ccafa77ac9a86b489a", default-features = false }
-nsh-base = { git = "https://github.com/M4n5ter/nsh", rev = "645cc38dea68da8fb03df3ccafa77ac9a86b489a" }
+nsh-core = { path = "third-party/nsh/crates/nsh-core" }
+nsh-engine = { path = "third-party/nsh/crates/nsh-engine" }
+nsh-platform-tui = { path = "third-party/nsh/crates/nsh-platform-tui" }
+nsh-platform-gpui = { path = "third-party/nsh/crates/gpui/nsh-platform-gpui", default-features = false, features = ["js"] }
+nsh-gpui-terminal = { path = "third-party/nsh/crates/gpui/nsh-gpui-terminal" }
+nsh-bundler = { path = "third-party/nsh/crates/nsh-bundler", default-features = false }
+nsh-base = { path = "third-party/nsh/crates/nsh-base" }
 maka-agent-facts = { path = "plugins/agent/facts" }
 maka-packages = { path = "platform/packages" }
 maka-agent-ports = { path = "plugins/agent/ports" }
@@ -214,8 +214,8 @@ gpui-fast-macos = { path = "third-party/gpui-fast/crates/gpui_macos" }
 gpui-fast-windows = { path = "third-party/gpui-fast/crates/gpui_windows" }
 gpui-fast-linux = { path = "third-party/gpui-fast/crates/gpui_linux" }
 # The terminal backend owns the offscreen renderer and image codec.
-gpui-fast-wgpu = { git = "https://github.com/M4n5ter/nsh", rev = "645cc38dea68da8fb03df3ccafa77ac9a86b489a" }
-icy_sixel = { git = "https://github.com/M4n5ter/nsh", rev = "645cc38dea68da8fb03df3ccafa77ac9a86b489a" }
+gpui-fast-wgpu = { path = "third-party/nsh/third-party/gpui-wgpu" }
+icy_sixel = { path = "third-party/nsh/third-party/icy_sixel" }
 gpui-pre-scheduler = { path = "third-party/gpui-fast/crates/scheduler" }
 
 [patch."https://github.com/longbridge/gpui-kit"]
diff --git a/products/maka/cli/THIRD_PARTY_NOTICES.txt b/products/maka/cli/THIRD_PARTY_NOTICES.txt
index 87af1c3fb9..9229569cc4 100644
--- a/products/maka/cli/THIRD_PARTY_NOTICES.txt
+++ b/products/maka/cli/THIRD_PARTY_NOTICES.txt
@@ -4028,7 +4028,6 @@ zeroize_derive@1.5.0 (Apache-2.0 OR MIT); authors declared by package: The RustC
 zune-core@0.5.1 (MIT OR Apache-2.0 OR Zlib)
 zune-jpeg@0.5.15 (MIT OR Apache-2.0 OR Zlib); authors declared by package: caleb <et...@gmail.com>
 
-git+https://github.com/M4n5ter/nsh?rev=645cc38dea68da8fb03df3ccafa77ac9a86b489a#645cc38dea68da8fb03df3ccafa77ac9a86b489a :: third_party/llrt-types/LICENSE
 https://crates.io/api/v1/crates/apple-cf/0.9.3/download :: LICENSE-APACHE
 https://crates.io/api/v1/crates/apple-metal/0.8.8/download :: LICENSE-APACHE
 https://crates.io/api/v1/crates/approx/0.5.1/download :: LICENSE
@@ -4096,6 +4095,7 @@ https://crates.io/api/v1/crates/zeroize/1.9.0/download :: LICENSE-APACHE
 https://crates.io/api/v1/crates/zeroize_derive/1.5.0/download :: LICENSE-APACHE
 https://crates.io/api/v1/crates/zune-core/0.5.1/download :: LICENSE-APACHE
 https://crates.io/api/v1/crates/zune-jpeg/0.5.15/download :: LICENSE-APACHE
+https://github.com/M4n5ter/nsh#de176695240d550f2b303643b8019146c7989e7f (adapted; third-party/nsh/crates/nsh-js) :: third_party/llrt-types/LICENSE
 https://github.com/awslabs/llrt#7b95c82a9b15e7ddfb2778eca4b5a63111e74f51 (adapted; third-party/llrt-crypto) :: LICENSE
 https://raw.githubusercontent.com/awslabs/llrt/7b95c82a9b15e7ddfb2778eca4b5a63111e74f51/LICENSE
 https://raw.githubusercontent.com/brendanzab/gl-rs/ea503e8d5fb6d73c6030e6191ce738cd3bf3433e/LICENSE
@@ -20333,10 +20333,10 @@ gpui-fast-windows@0.1.10 (Apache-2.0)
 gpui-fast@0.1.10 (Apache-2.0); authors declared by package: Nathan Sobo <na...@zed.dev>
 gpui-pre-scheduler@0.3.9 (Apache-2.0)
 
-git+https://github.com/M4n5ter/nsh?rev=645cc38dea68da8fb03df3ccafa77ac9a86b489a#645cc38dea68da8fb03df3ccafa77ac9a86b489a :: LICENSE
 https://crates.io/api/v1/crates/gpui-fast-apple/0.1.10/download :: LICENSE
 https://crates.io/api/v1/crates/gpui-fast-macros/0.1.10/download :: LICENSE
 https://crates.io/api/v1/crates/gpui-fast-platform/0.1.10/download :: LICENSE
+https://github.com/M4n5ter/nsh#de176695240d550f2b303643b8019146c7989e7f (adapted; third-party/nsh/third-party/gpui-wgpu) :: LICENSE
 https://github.com/longbridge/gpui-fast#b836dd970b26830f2124b7cf91b0e19018fd12da (adapted; third-party/gpui-fast/crates/gpui) :: ../../LICENSE-APACHE
 https://github.com/longbridge/gpui-fast#b836dd970b26830f2124b7cf91b0e19018fd12da (adapted; third-party/gpui-fast/crates/gpui) :: LICENSE-APACHE
 https://github.com/longbridge/gpui-fast#b836dd970b26830f2124b7cf91b0e19018fd12da (adapted; third-party/gpui-fast/crates/gpui_linux) :: ../../LICENSE-APACHE
@@ -20558,7 +20558,7 @@ Apache License
 
 gpui-fast-wgpu@0.1.10 (Apache-2.0); authors declared by package: Longbridge
 
-git+https://github.com/M4n5ter/nsh?rev=645cc38dea68da8fb03df3ccafa77ac9a86b489a#645cc38dea68da8fb03df3ccafa77ac9a86b489a :: test-assets/IBMPlexSans-license.txt
+https://github.com/M4n5ter/nsh#de176695240d550f2b303643b8019146c7989e7f (adapted; third-party/nsh/third-party/gpui-wgpu) :: test-assets/IBMPlexSans-license.txt
 
 Copyright © 2017 IBM Corp. with Reserved Font Name "Plex"
 
@@ -23066,7 +23066,7 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a
 
 icy_sixel@0.5.1 (MIT OR Apache-2.0); authors declared by package: Mike Krüger <mk...@posteo.de>
 
-git+https://github.com/M4n5ter/nsh?rev=645cc38dea68da8fb03df3ccafa77ac9a86b489a#645cc38dea68da8fb03df3ccafa77ac9a86b489a :: LICENSE-APACHE
+https://github.com/M4n5ter/nsh#de176695240d550f2b303643b8019146c7989e7f (adapted; third-party/nsh/third-party/icy_sixel) :: LICENSE-APACHE
 
 Apache License
                            Version 2.0, January 2004
@@ -23274,7 +23274,7 @@ Apache License
 
 icy_sixel@0.5.1 (MIT OR Apache-2.0); authors declared by package: Mike Krüger <mk...@posteo.de>
 
-git+https://github.com/M4n5ter/nsh?rev=645cc38dea68da8fb03df3ccafa77ac9a86b489a#645cc38dea68da8fb03df3ccafa77ac9a86b489a :: LICENSE-MIT
+https://github.com/M4n5ter/nsh#de176695240d550f2b303643b8019146c7989e7f (adapted; third-party/nsh/third-party/icy_sixel) :: LICENSE-MIT
 
 MIT License
 
@@ -28492,7 +28492,7 @@ nsh-package@0.2.0 (Apache-2.0)
 nsh-platform-gpui@0.2.0 (Apache-2.0)
 nsh-platform-tui@0.2.0 (Apache-2.0)
 
-https://raw.githubusercontent.com/M4n5ter/nsh/645cc38dea68da8fb03df3ccafa77ac9a86b489a/LICENSE-APACHE
+https://raw.githubusercontent.com/M4n5ter/nsh/de176695240d550f2b303643b8019146c7989e7f/LICENSE-APACHE
 
 Copyright 2026 Longbridge <https://longbridge.com>
 
diff --git a/products/maka/cli/notices.json b/products/maka/cli/notices.json
index 1657b7830a..898fa08a97 100644
--- a/products/maka/cli/notices.json
+++ b/products/maka/cli/notices.json
@@ -1,7 +1,7 @@
 {
   "inputs": {
-    "Cargo.lock": "408eef8f99b0b5a56748dfd19fa652dfa8750144e7fb0abb7f260633141b1a43",
-    "Cargo.toml": "fc7b4e33c1bc9552b08ea85f5d9c3ebff58306fb33964a8e53336b9ddc57b25c",
+    "Cargo.lock": "cc702b3d61b2540ad2a0865d465fa51c61adb7b2294a3868c2e072310c5cb183",
+    "Cargo.toml": "266a989b27bbf255009c0deb0dbb23dc870262a0cde2e23ed7dc842148c6346d",
     "package-lock.json": "a5af15aca21fabe0e1bdd48784167df4dc81cee17777d54861dcbd641168a4eb",
     "package.json": "38baf3beeb5876849ca16e31868d59bfaee769f260c7555b4a8a1847b92e28a1",
     "packages/plugin-sdk/src/configurations.ts": "93fcc2c070289ffd4b48dcbaee426d72abff74f95c3166ad73447eec588c011a",
@@ -1029,6 +1029,1640 @@
     "third-party/llrt-crypto/src/subtle/verify.rs": "50b94c3f7476085fa15dfee704c1ae86b45746a715ce31fee0a8a3568562e3a5",
     "third-party/llrt-crypto/src/subtle/wrapping.rs": "438a0b83ff2309e3c040bb3d4d875b8bdd847f338455323427eeb1d1b07b2db6",
     "third-party/llrt-crypto/upstream.json": "eaf8f0a0b7b6027ea1656c21bf021885168681479b03ef925a622dfa788aa7bf",
+    "third-party/nsh/AGENTS.md": "6b2e0883676c03c9a021a67c517da2e098e67a879123bb7cd2da8c39d0fca4eb",
+    "third-party/nsh/CLAUDE.md": "336cc4fbf19beaada7ccf9986414fa91851a8d7a07dfb3ccbe800a69eed0ab49",
+    "third-party/nsh/CONTRIBUTING.md": "fb27100fec01ba22dde6da1546f9cd761b8e23bec7d47eca87146c7991e85de2",
+    "third-party/nsh/Cargo.lock": "f1765287f4b60baad0fe758919f878f9da61b6ac0f3e8a17ed9488b3608955c6",
+    "third-party/nsh/Cargo.toml": "fc0059d9067e1ce8c9bebb563d4e244985346c557e0c9d121e16e807be4ce9c5",
+    "third-party/nsh/LICENSE-APACHE": "ec75427ad955e3c740f22e7dc3f6db6fc5b2cc1d9135c2af91cece8dd47a2d38",
+    "third-party/nsh/README.md": "41b27ca2d909710134b9a43243b31b54b856fe5a07c84b1eff53cffe2791c95f",
+    "third-party/nsh/SOURCE.md": "aa03c1062a7c36d5cb37112f1f4ade726ff916b8ba4d72550728006ef33587af",
+    "third-party/nsh/crates/gpui/Cargo.lock": "2b8a4fd17ecabf2cb11520392322bf5aaa2736a8f79989d9e55ab8795360487b",
+    "third-party/nsh/crates/gpui/Cargo.toml": "1d53eec1242cd480700a9e2ffd5c013f21c8b0c3207cb9544733fd5ea375f0f1",
+    "third-party/nsh/crates/gpui/nsh-gpui-host/Cargo.toml": "f36b982a17b38bd1d91760a2d8d9db06b42db949c227878cef294a5ff2100844",
+    "third-party/nsh/crates/gpui/nsh-gpui-host/src/lib.rs": "ac2976b5a3d01d49198d8868009ca2c6636bf4af627cd922e778ee2d7ec9a243",
+    "third-party/nsh/crates/gpui/nsh-gpui-host/src/main.rs": "90cc675d4e2d70cf54f61b4cc5b28af0167d895e76242e93865fdebfd440d3ae",
+    "third-party/nsh/crates/gpui/nsh-gpui-terminal/Cargo.toml": "0a1ff80203b0ff21fd0aa39d8f76ce1dcd4121532670dfaac52d6333bf7aaaf2",
+    "third-party/nsh/crates/gpui/nsh-gpui-terminal/README.md": "3f91ef22670a72ce6e53202f6012a26ded711a710debac800f00a9c4a38704df",
+    "third-party/nsh/crates/gpui/nsh-gpui-terminal/src/dispatcher.rs": "2c64b942b52824c65811079f54533d1c6e4a09bed0eced8a39ed2737efb0fa5e",
+    "third-party/nsh/crates/gpui/nsh-gpui-terminal/src/inline.rs": "8deb7f1f721e75c4e8a2681b4e0dfc95c0fa99115df7644273f26a60b3714fd7",
+    "third-party/nsh/crates/gpui/nsh-gpui-terminal/src/kitty.rs": "386206359c93d9bff76e61976ad3dd7f44b2d0e6d165a1893d70dd63bbbf06cd",
+    "third-party/nsh/crates/gpui/nsh-gpui-terminal/src/lib.rs": "cfe9e6a7bf6ef7fbbc0703503cdb6b267c1ae5535537c651e84a9fd40f8cf2a9",
+    "third-party/nsh/crates/gpui/nsh-gpui-terminal/src/platform.rs": "40df16750bf373c0302ac93d5311e7e96b4a502b91d9672b24c8971f5ac23969",
+    "third-party/nsh/crates/gpui/nsh-gpui-terminal/src/window.rs": "b6d83b859f050b81207e7498d1b742a5d3ee1c7977b2849c9a0e22037cb6d7da",
+    "third-party/nsh/crates/gpui/nsh-gpui-terminal/src/wire.rs": "6144e0c6a8012c73969ef78826b0c098d884018c8c3ce7646021bdf51447f27e",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/Cargo.toml": "206934e8190c020747f5fccb8ed1f9397366a04483cdafd3b0277b6252badfc7",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/examples/embed.rs": "0f24faf7a0fdd81c877c196eb6eb60642baff340680ae148e655dc2969a54875",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/access.rs": "9b0fec093b95d73254ff0b3301b4cb7266a65a7ac074384ebeff02902d6b4a59",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/agent.rs": "05bbc3ce172ccc45187ee13fc72cb0ada94466906b0d16c1f670797aa857e5f3",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/animation.rs": "5e849ee6e81ef77bfcd70e255228431f3ea2b67266530a10d962582541b78c29",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/app.rs": "bdda4c8eb54b13f9d09c6a88a56e24e5861954242036e998a17274f3d3401f54",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/canvas.rs": "fc25fa52fbe8fe59b16ebf971c81a1bddc68e78181df2181a5620db24abc6518",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/chrome.rs": "888d41336ef98d6f51664281de2b5eec613445f4ccf8f12735e792f8ace1133c",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/chrome/menus.rs": "43b4c8cef09fb4d314e6f908b8f57df821ab6eaa9d236e0087db6a0599ae3ab7",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/decor.rs": "7aacbde97e94ce7e90d39698d9f21731948edfd0aa8ccd70b6a16d059a929ce8",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/decor/gradient.rs": "a2b962a2b3be0bd8881aa16f4fb625ada76c869efa30c9fd89a22231f41ccbed",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/decor/shape.rs": "4bec3060c95d020c634739f3b40c99d21af91168201ad4fc2ccb1037a6995748",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/dev.rs": "38f7debaa9933397ad497e2ac5d8bb9a6074bbb617b7fbf4c73141c2dce2077b",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/events.rs": "3549709f811270e5d7495f6a2394926b8ab7dac9d2dff7fd9de66adf0568233a",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/focus_return.rs": "05270dbdaf2f5418fbbb6d065e4121d5099520166af9a00100f9694e2bbdce3e",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/geom.rs": "c3ec43a6f17f80371760c5f6cc2f8170fe0cc543bbda7094d683b3fbb287413e",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/image.rs": "2f6fd485e03ec5aa6c4ecbb2d5019dbe19670dfb0c7c7b93b9cef548355a04e0",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/input.rs": "54a3bb215cbefd85f4dc94db488647e4bd5c0ae8f582578dc9cfaa99f919020b",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/keymap.rs": "8bbd84f9cdebd3a7e3b2756085ee0233f3b3efb447ade999781ab6f2d4c8b56b",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/keys.rs": "588934210e4de9cfc849f0a66d48af29e3637a33f019a084db8961db0df46561",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/lib.rs": "db69c489a913fa62facbe592bb5089751753844486029ab7dab6f6e3ef534d49",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/mount.rs": "f0c99ac758e694b95c197f2f4137a8a100bb9e164746c793c3081c03d41ac04c",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/native.rs": "e539afdcfab410ce2d191bca7436a3dcfc61577622c47dc6dc62e66d3544c98a",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/native/video.rs": "e1a61eee03f49428c3860c2c732baa88709ac07fb8e837e0b09ba387f3473049",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/native/web.rs": "47b3c35e9e8654c485cd90b7e72d2ca5fba13a136868c8681e0e41be5a32baf4",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/navigation.rs": "afd5e71288983486885825496f01cc00d683abad04c73969a84aef6dabdce6c2",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/render.rs": "3d108feb8be5f880ebb1452026745a0f06e537cb762cfa399306e5a3c4865dd6",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/rt.rs": "217dc97d29ceadb5cb4baa8aa8747a50c1a752b5771cc1e299a815d48beb180e",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/scroll.rs": "dd042da62d2a20624442d8816a918eb69b39f5ea40f1a5a69fc1229d3f7d42bd",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/selection_area.rs": "ba1d8e91ca6bf8296d6744f567e822ed7bf5fcf001addb4bc016b1a61ee0d02f",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/stats.rs": "b05468754e418be8b4fb4506b6036cd2b96c9f6f484fa5607b0fab9db74ab44e",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/surface.rs": "24aa6b5d57947613075fcdc839da3e40c23db65c0a40aaae6ad3924bd10a777b",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/synth.rs": "d6c43385fcf80d88679f55720befe2bb3e1b3cc0f8cae0d053db6f482955672e",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/system.rs": "25618570a6d78f289986a1356553f1cb066f41bc6b1a982e86ec138cc43ec9a6",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/tests.rs": "f861c3bc7bd98fc2cd3d792120a2de7d67b317f2ed4698ffedfd63a125946f8d",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/text.rs": "5eb68c710789eb83e2e343814a251b2ee8b255db0744b16c9a24ff25542f1dcb",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/text_input.rs": "4f326eb4833632356800bdda880ae396aeade1c0969cede9bb614b876f73a2c1",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/text_input/layout.rs": "e73bbaa60ccd94a48de52f16c14341ca746ae00d4135346b5f72e4291880b23c",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/transition.rs": "dac21868ca439f92c4ecb41197fec60f4b8cf54e0364213dbcf4b8ae9e01cc24",
+    "third-party/nsh/crates/gpui/nsh-platform-gpui/src/view.rs": "e0d563afce0215663b798dc964b3965972651774083b9cbbdf974dea8ffae3b4",
+    "third-party/nsh/crates/nsh-base/Cargo.toml": "d5700555d23a589b043045e4bdb29c0d435affbedb6ecb624b342e46f03aa30a",
+    "third-party/nsh/crates/nsh-base/src/alert_dialog.rs": "594cd26009ca4612c97562f4ea5147e1383ab582442299593d42d82128350c45",
+    "third-party/nsh/crates/nsh-base/src/button.rs": "a5d390732f24ad3a23365e849ffb875f51b59b36701d393c8e7b9a04ebba4892",
+    "third-party/nsh/crates/nsh-base/src/checkbox.rs": "3f5d6cdf25f2e95a36a2ebfd8fd824f93250092085bd80b9cd8903d7f845f62b",
+    "third-party/nsh/crates/nsh-base/src/collapsible.rs": "8b24804af2e462a7c12ec168f4c64683a2fd1d4df67d09818516564900c58aef",
+    "third-party/nsh/crates/nsh-base/src/default-theme.json": "8792c42d1057a7472b07062609061216ab3ea0b7137b853fb88858f78701320a",
+    "third-party/nsh/crates/nsh-base/src/dock/area.rs": "c14cfbf9e9c8d64617e9ccc9c778085aea8313262592bfd3c6505d175969831f",
+    "third-party/nsh/crates/nsh-base/src/dock/compact.rs": "32eeedc3c990f9141e1507922a6e9f900ca9ca1d21b7b01df99a4e293c02ec91",
+    "third-party/nsh/crates/nsh-base/src/dock/dock_area.rs": "803a28f513d7fee564589f03f27384ad0c37bced566607564a4606fb47cb73b7",
+    "third-party/nsh/crates/nsh-base/src/dock/dock_placement.rs": "7f4d1446913c0bd4c8c1370776f8b6105f43f5c7160e80f586eda2db71984333",
+    "third-party/nsh/crates/nsh-base/src/dock/drag.rs": "c0a4eafd25a493b33342df7f07ba1360a9f4a3ad90ea907361fabd6726702940",
+    "third-party/nsh/crates/nsh-base/src/dock/fixtures/bare_tab_panel_root.json": "3e6a100a3870a5b2aeac1d14eb312432515cc9ae529253bf9be13e8c48179e04",
+    "third-party/nsh/crates/nsh-base/src/dock/fixtures/layout.json": "dc90df21089188bb050b497d216999b6c92a484cc2b16d95daa4a98bcb4aed9d",
+    "third-party/nsh/crates/nsh-base/src/dock/fixtures/legacy_empty_tab_group.json": "6ce77a7a4590954f2f6dc1f6dcdc820b080b63b83bc05ad1571ffc81ca2758e2",
+    "third-party/nsh/crates/nsh-base/src/dock/fixtures/nested_splits.json": "06c6226a4489e9311b8d6b828e4a612e732ef6f44ae7ddc57c5f5bdf101c8fa4",
+    "third-party/nsh/crates/nsh-base/src/dock/fixtures/unregistered_panel.json": "5aa6db83f7f7de42453841a732a7cbdba36d1243f10181b68e14ebc1d15c80c6",
+    "third-party/nsh/crates/nsh-base/src/dock/fixtures/zero_size_sentinel.json": "4661f3d75c390cededee7c10b06b16252bd8e85dedcfcebece16c4fc9969f3a4",
+    "third-party/nsh/crates/nsh-base/src/dock/layout/builder.rs": "3df7d628490285d70fb7e1fc8ef7457baeda04e61e727543902706c3f5b7a2d5",
+    "third-party/nsh/crates/nsh-base/src/dock/layout/edit.rs": "644584ce3d1942222d77b5233777f49a4dde012ee6c034ee3a5cc5d6b506b6c9",
+    "third-party/nsh/crates/nsh-base/src/dock/layout/mod.rs": "8363f8fa852e6e8260f196fa22116c3d2ed4dee48fa514cf8a220dafe6e1f441",
+    "third-party/nsh/crates/nsh-base/src/dock/layout/node.rs": "f0ad5d832232bf846100fb91f4bf6c022c7112e0e8a52a63df3f9fc1b0c5ca09",
+    "third-party/nsh/crates/nsh-base/src/dock/layout/normalize.rs": "65f50c7567c013666ce59148798f1ecb5d4d6b8af667d310f2b6156402d61e3a",
+    "third-party/nsh/crates/nsh-base/src/dock/layout/tree.rs": "918a6031ad235d2130924093f599a248814dc6ba680e76db656b8370556aca21",
+    "third-party/nsh/crates/nsh-base/src/dock/mod.rs": "e1b0da24f9c5d831b5cf2371b9182a4ec573746483570a93425ce1648aaf2d9b",
+    "third-party/nsh/crates/nsh-base/src/dock/state.rs": "4f9d59dd682d4e49b5a097670ef51f30d50a5de9aa2018de5b5d0986dcd1fd34",
+    "third-party/nsh/crates/nsh-base/src/dock/state_convert.rs": "3fd3d0fb3a7f8e66478aaa82a38fedca60f41ea31a67cd1fd32e06ec84e787ac",
+    "third-party/nsh/crates/nsh-base/src/dock/tab_group.rs": "aec8a114c1c9da897f4e3f9e89df842c7a9e9777d721fd9a52860813655960b8",
+    "third-party/nsh/crates/nsh-base/src/dock/value.rs": "a8f75f77b4b770755247eac7c07d4340e49541bc3dfd164fbc189fa27d09771e",
+    "third-party/nsh/crates/nsh-base/src/dock/value/tests.rs": "3c730d09df8502d04211f7f3f00ede95be06ff1efac11deebc3d802ef8993449",
+    "third-party/nsh/crates/nsh-base/src/keyboard.rs": "797de960194d5a7c29c0f88c1e14429895067d68ccd00987777615f73673e856",
+    "third-party/nsh/crates/nsh-base/src/lib.rs": "de0c6516d558654521318e20b97ad0d1609de40d0801a13347903f6aef629f8d",
+    "third-party/nsh/crates/nsh-base/src/menu.rs": "ba6339940ab1f77de454cd32a3d01fcaa370f2234bf44352a8ade0d043f1cd8a",
+    "third-party/nsh/crates/nsh-base/src/navigation.rs": "0fa4be89464b3feffacb521991192ca5d71db53a0021f90461c4e37df77c1278",
+    "third-party/nsh/crates/nsh-base/src/popover.rs": "d42902bb2396513bc9eeb98b7e584cee2b99647523779e2e888bf4b0fbbf1063",
+    "third-party/nsh/crates/nsh-base/src/popup.rs": "505a089b784978faf603ae5890df38e46ec18562a6b82ec59d140cd1080c86f5",
+    "third-party/nsh/crates/nsh-base/src/progress.rs": "a8c02bb828f10f2d0e30056a1791fcacb0e458684d6e9dde33093fcc5e10f224",
+    "third-party/nsh/crates/nsh-base/src/radio.rs": "8b12775c2ac3a93b839bc0fc7693948fd6694884658037ab6a9efc80f41a7470",
+    "third-party/nsh/crates/nsh-base/src/resizable/mod.rs": "7344f45b4f047f4f63fe845a8890d422cd37a150f321caebc0afd4a40dc9d423",
+    "third-party/nsh/crates/nsh-base/src/resizable/panel.rs": "4f3aff3d27fe3ed4a72fb01cc65c36ee6142a168ddfc2c460b6f5e1c7a1c0956",
+    "third-party/nsh/crates/nsh-base/src/resizable/resize_handle.rs": "88276350b420007dc52c3c4c0caafe0c7c7c089c83fc0606f0633c0ab8f15e1d",
+    "third-party/nsh/crates/nsh-base/src/resizable/state.rs": "874194e34f301181eeffb2d88884fad8000878dba733255da02aee841aa50b8a",
+    "third-party/nsh/crates/nsh-base/src/safe_area.rs": "08c050e264e44e7e0dbd7b007debce030e25764837f7859fcf8ec5e932d5d25c",
+    "third-party/nsh/crates/nsh-base/src/selection_area.rs": "2998539cb65e66388975f5bfaac7879659c3dd3f16d3675518dc5ef645ac95ee",
+    "third-party/nsh/crates/nsh-base/src/sheet.rs": "aa8ec34cad199956bd01de6c4d41ff00f76ffbfdeafcb65eae1646f89d523fed",
+    "third-party/nsh/crates/nsh-base/src/switch.rs": "151c68f286fb32581069e489558f81a88d2d44c78b91533b4fc77780c7df3f90",
+    "third-party/nsh/crates/nsh-base/src/tabs.rs": "628a1b1dab6d45b359dfac367111f217651b23cc90dbc83fa9fd7efa5efc61d9",
+    "third-party/nsh/crates/nsh-base/src/text_view/common.rs": "ac4a95a89ec0f99cdb65d8d4caa5c4455a861f9d8890e1165e1d1227c9baa1df",
+    "third-party/nsh/crates/nsh-base/src/text_view/document.rs": "d6c4a00150259b5ace8e11eb372e95c10e48e087dc75ebf51d095cc0bcb0167a",
+    "third-party/nsh/crates/nsh-base/src/text_view/extension.rs": "72cf65189124c97c72810ba757652338f41f38226af2c054bbbb7b26915fc44c",
+    "third-party/nsh/crates/nsh-base/src/text_view/highlight.rs": "bb04607667e1533f4ec05c5e86a4a6b6b37fb204d2c182ecbbd81beb9e7f36b0",
+    "third-party/nsh/crates/nsh-base/src/text_view/html/mod.rs": "e7c74c94c8f19c5d3393cef7af79220ae10e4e1ce5fc4085f708ccd206b1aef4",
+    "third-party/nsh/crates/nsh-base/src/text_view/html/tests.rs": "a38dcf3bf23cb1e81fab136d51176697314e31922abca7815e6a7b5001ba4816",
+    "third-party/nsh/crates/nsh-base/src/text_view/markdown/container.rs": "9eff9e468da502c8b7fe7beb5d513e7f56b4c1faaf275c71a98f42a1759c0854",
+    "third-party/nsh/crates/nsh-base/src/text_view/markdown/latex.rs": "8bdee12c15f0c78b93fdaf0cca05cb8cc43be261e11576f75b6fd9a2b07b6ada",
+    "third-party/nsh/crates/nsh-base/src/text_view/markdown/mod.rs": "0fb6b3b8f1e953a7e27149f1fc9f38d33c5e99f2538bb87deecb3390e227d8c4",
+    "third-party/nsh/crates/nsh-base/src/text_view/markdown/streaming.rs": "834a73b3ac746536c75f96046a7abc2da936659e7415e4766e4f4330cc7599b1",
+    "third-party/nsh/crates/nsh-base/src/text_view/markdown/tests.rs": "c450a092d7f55738f1bd8f1a25ecdbe5553dc0fe4aaadcbedc4f07d1c543800d",
+    "third-party/nsh/crates/nsh-base/src/text_view/mod.rs": "f6d200e37c21aece2cf3355781577539a9830118d3e55d34356a55776d3b5a7b",
+    "third-party/nsh/crates/nsh-base/src/text_view/parts.rs": "1cc12fdfdb815ea5eb44ceaa37467849b9005d99353809150379708f4b7c1add",
+    "third-party/nsh/crates/nsh-base/src/text_view/view.rs": "e1162a8a0e79876951ffc30fd3f930346f2cfb68969d03c284ca350c9e5e4105",
+    "third-party/nsh/crates/nsh-base/src/theme.rs": "cf2c7a0d55987301434e8c61a96d4190c0945fed9c52632076c50812aef8b432",
+    "third-party/nsh/crates/nsh-base/src/tooltip.rs": "5ee4deb7358e62d9e88b0287d06624e538c21619229b4cace4ecda09c214c5a0",
+    "third-party/nsh/crates/nsh-base/tests/base/dock.rs": "d6657e7a078fec7ee3f3640540b8f2935255d68a176af79444713574d8177c27",
+    "third-party/nsh/crates/nsh-base/tests/base/main.rs": "d4bd54e22c71fee7a6ea0f4c242b77aaafd24c7af9773b86db6d26b6e1f9b699",
+    "third-party/nsh/crates/nsh-base/tests/base/resizable.rs": "77d40746a511c641b8332fa3187ecc890f278cac1582a4c5a613476fbcf200b7",
+    "third-party/nsh/crates/nsh-base/tests/base/sheet.rs": "2a7cfda4b7087d85df7f4e65e23c2386fe3b91a868339aa7dba159e42e27f56a",
+    "third-party/nsh/crates/nsh-bundler/Cargo.toml": "8284a211f8f7fbf7fc14de5ac6739a5b837ad2db30729bdbffd70001df95000f",
+    "third-party/nsh/crates/nsh-bundler/src/bundle.rs": "812e38f4d8522267f832f4381d388c2ee8226729beb9605ceeea610c35600721",
+    "third-party/nsh/crates/nsh-bundler/src/classes.rs": "b6fc4affe5ca9ee0dc38b0b00579375dd2c6d6684424e4b6aa08371ab965fb40",
+    "third-party/nsh/crates/nsh-bundler/src/compile.rs": "a8c3881697eedf15074495c7bee24c5bf79af9667ecf5a99fb6089dabdeb6445",
+    "third-party/nsh/crates/nsh-bundler/src/hot.rs": "c3655c9dc2c1c561831bf33d0a7915bfa596063ac130cca4b79e37a021d76c10",
+    "third-party/nsh/crates/nsh-bundler/src/jsx.rs": "794180e4ce4b827ca510645a76e35e7fe820ca9780b9120d9b5c0b881041ec06",
+    "third-party/nsh/crates/nsh-bundler/src/lib.rs": "e32e2b6d52c597531ed13c24ce493080605d71a6f3761acce5740c748970e8e6",
+    "third-party/nsh/crates/nsh-bundler/src/minify.rs": "09bb43220c92c72daf59f73b7a1fc3c950c40fd32bf872ad93967ed7cf745af3",
+    "third-party/nsh/crates/nsh-bundler/src/plugin.rs": "531c58768760e9149beb40e68c9b90e8ed795e78f8b81f91420b77565abe796c",
+    "third-party/nsh/crates/nsh-bundler/src/props.rs": "b7b2122af74037f63ae74e2c4f5092d5ae5138aa78cd81abc03d9c8d7f7fa337",
+    "third-party/nsh/crates/nsh-bundler/src/split.rs": "dd958b4d93476155b5cb557389e53673b89c1c9c525d74c8126367a95529024b",
+    "third-party/nsh/crates/nsh-bundler/src/standard_tests.rs": "88f73548512850cfa4846d58ddbe675f1adbc674e0e1f8c45a4e86bd267cd50b",
+    "third-party/nsh/crates/nsh-bundler/src/types.rs": "6547e6859ac6c9ffe6639132fc874922c58760f2a31e0bed0cc95019362e1cc3",
+    "third-party/nsh/crates/nsh-cli/Cargo.toml": "c80530c91c38340020d5b69c66d61947600ffe4ae4977b108ccb1392e237cd69",
+    "third-party/nsh/crates/nsh-cli/build.rs": "617f5d3890c8b278c74b7a4620a148a0a8079fa7dba2e98b0726cac5d0fef494",
+    "third-party/nsh/crates/nsh-cli/src/android.rs": "ca5254b4b751e140a69a0ab30e23d57e0c673de0441c2491ad66cba0f2ea9792",
+    "third-party/nsh/crates/nsh-cli/src/bindgen.rs": "c0637c275b6fceb199ef7b1edc8f73305eabd8640e92760fa4f58ec84eba2aa8",
+    "third-party/nsh/crates/nsh-cli/src/bindgen/wasm-bindgen-0.2.129.js": "5823060057ea5de1326121c1132d558d8f96d1fa8c23fb1270a132b07ac9af06",
+    "third-party/nsh/crates/nsh-cli/src/build.rs": "930e9e61189b299f9b4121db7810c48a463f50d2e45d3dae2a88d820ab08d309",
+    "third-party/nsh/crates/nsh-cli/src/cdp.rs": "a7df2735afb1013b4946b9d21393c9d72e1afa2e28e23667eaa242eb5878681d",
+    "third-party/nsh/crates/nsh-cli/src/check.rs": "4caecd505d9a8464a99eb6ebc3a34e047aafa205c86e794524f865b4761677ff",
+    "third-party/nsh/crates/nsh-cli/src/dev.rs": "e25c40cf05389b1c2eb8d0de22a5d4fd33492eecd1ef0c0a5ec96d36421dc4f3",
+    "third-party/nsh/crates/nsh-cli/src/entry.rs": "8880023842ca765687e3ce6f356a9f8498881fa8d90f459c025702964098ea41",
+    "third-party/nsh/crates/nsh-cli/src/init.rs": "953623491dc2fc64dc1f72c113b8d18edb564271b54a3e62ca7ff8648bb41f08",
+    "third-party/nsh/crates/nsh-cli/src/logger.rs": "09574fa1381d8dc650d820f6953541601180698657cf3eda2f1429165122840d",
+    "third-party/nsh/crates/nsh-cli/src/main.rs": "feb8ecbb8f3e4b33cd29e3df840198f28cead2c3341bce22407d234b734ed46e",
+    "third-party/nsh/crates/nsh-cli/src/package.rs": "40c91f4ec6e23cacd7fc256c3bed159a35a52e833de67f21797fb9917fbd542d",
+    "third-party/nsh/crates/nsh-cli/src/run.rs": "077ebada325b5ac5470a21a4be510a2507c28f47711be42844e53914cf8f9f51",
+    "third-party/nsh/crates/nsh-cli/src/runtime.rs": "5c0c87e5f3793083bc66dcd67c0faff2362de0ee788145fa00198cd29c5b9628",
+    "third-party/nsh/crates/nsh-cli/src/rust_app.rs": "ada2a98a27628f508eea1fe818a2dc4252a7c60b1d73179dd3eeceba076ddd8e",
+    "third-party/nsh/crates/nsh-cli/src/sign.rs": "fc514e034f23cc868166368b7add5a8f8ead0437bddbdb61e6296fa7ecf55028",
+    "third-party/nsh/crates/nsh-cli/src/templates/mixed/App.test.tsx": "8bfdffa4cc29537e750cb3c281fb815bcee41e457ab70cebd3cf18ae2a1bf40e",
+    "third-party/nsh/crates/nsh-cli/src/templates/mixed/App.tsx": "659921fdaa9e38cf2a5154fa12eb2296f1fade4cbb224bfbd6838464c52e59b4",
+    "third-party/nsh/crates/nsh-cli/src/templates/mixed/README.md": "290ecc937215a0e156ba72d444e5563db4b673f3c23b162b4e61089f3fb0e349",
+    "third-party/nsh/crates/nsh-cli/src/templates/mixed/lib.rs": "96ad084b76b8185f73df79eeebe65a56150fe3863c46e25619baef2742ea6449",
+    "third-party/nsh/crates/nsh-cli/src/templates/rust/App.test.tsx": "ba47395b7270bc2a9af7b9df87aff74f70333b46f7233609eea1a98943d6cd9d",
+    "third-party/nsh/crates/nsh-cli/src/templates/rust/README.md": "5e662e66de72487af62622dd91a8e6229c217b34f686981cca19e4e196986d8b",
+    "third-party/nsh/crates/nsh-cli/src/templates/rust/lib.rs": "e5ab2f7b82524837422c9f9edf10654e7ed36bf7f7114e487a751007bf083e2e",
+    "third-party/nsh/crates/nsh-cli/src/templates/rust/main.rs": "0a89de02467082b89ccefc925a7af53b15af9b06e77aae3e05096326a4c9c644",
+    "third-party/nsh/crates/nsh-cli/src/templates/tsconfig/1.json": "8ceb789d13fc1d74ddbaa75615daeaabadf0737ef76b7a4ccc293ce065d6895c",
+    "third-party/nsh/crates/nsh-cli/src/templates/tsconfig/2.json": "746d8d6b8de252179faf02d582531d53c39aa259eebfec49cd726c9f5cc3d738",
+    "third-party/nsh/crates/nsh-cli/src/templates/tsconfig/3.json": "832b63d1c87c6381f7d49d7f55394ce4ed2503d3cf0d0124b81a88ec9621a330",
+    "third-party/nsh/crates/nsh-cli/src/templates/tsconfig/4.json": "d7972c656ce45ce90df97fd5370c26c660c5fe8fca5355cf24822498039685ee",
+    "third-party/nsh/crates/nsh-cli/src/templates/tsconfig/5.json": "5d6ee953f0366848a5cbe9fe9d0a6b31637d14e8dfb20761e7730c9228753b1a",
+    "third-party/nsh/crates/nsh-cli/src/test.rs": "ebf44d8fa58c05c0375a0cd7586a3f0ee38968f9c2897682c7411bae8599bce4",
+    "third-party/nsh/crates/nsh-cli/src/test_android.rs": "6f3ca5c6caf8e46d48fa7d3046e82a9d1d5f50efd1a6a68a08f3c0472295c48c",
+    "third-party/nsh/crates/nsh-cli/src/test_host.rs": "1d180f234bed65f2e53fbae83e3b9547644e17d3d5bfeb165a12e15b874cf892",
+    "third-party/nsh/crates/nsh-cli/src/test_ios.rs": "aa5e20afee9e655471d7971c31f94ed9d3973784dc13edc20019f3ef45de3ef5",
+    "third-party/nsh/crates/nsh-cli/src/test_web.rs": "0f4d0ce39f86ffd4a4de2e6d2d6b9d6f69427aaf10e7c1a3dfa397fc440bdba9",
+    "third-party/nsh/crates/nsh-cli/src/tui.rs": "edadbdd4996dce76cf87b4e8eb4e4101fa6ed338f2ebb7f0725a6c61d2bde6c0",
+    "third-party/nsh/crates/nsh-cli/src/ui.rs": "b76573d4d63e976026013526e661b0f32d74f9da995fc1facc7f3f48c040735e",
+    "third-party/nsh/crates/nsh-cli/src/web.rs": "736b5930852cca6f86b5c7ceb376308607a1804dc42ca092869c8c67cfcffcfb",
+    "third-party/nsh/crates/nsh-cli/src/web/dev.html": "6ee194e1e1eeae680741635ff7c4f1f2e8a24613bf190d2ffa81a718dba27bf0",
+    "third-party/nsh/crates/nsh-cli/src/web/index.html": "e31fd8c3e4d72b3b82cf47e79c3dc5fc8405321b9c26558ec86904a90703e49a",
+    "third-party/nsh/crates/nsh-cli/src/windows.rs": "81b1e8af3c91b3d45f7c0d05ac2abef4ca426403e30f7c71c8029d74bfde6b24",
+    "third-party/nsh/crates/nsh-core/Cargo.toml": "9e5e298894de41f52334ba29bec2c3cbc37ce8676f754701c9f4680f99f7a7de",
+    "third-party/nsh/crates/nsh-core/src/access.rs": "5e880fb21cc43c8c28fe42bd06a08f56520d4eca33c8e404b199cdc83ac3d764",
+    "third-party/nsh/crates/nsh-core/src/animation/animator.rs": "a5ccd0ab2bf2f353bf7e31c0e8ef11151f443d3a551ee63ee7487f77b87a7506",
+    "third-party/nsh/crates/nsh-core/src/animation/driver.rs": "68f951a4572f81335911c19b65329b3f920a85d9ad402d566716f84c1372311e",
+    "third-party/nsh/crates/nsh-core/src/animation/graph.rs": "a4fe8ca39d20fffce8f2114ee8d834c82044053ad5ef34c17e3bfa037c7e1fe2",
+    "third-party/nsh/crates/nsh-core/src/animation/mod.rs": "34bcf5a813cadcf903304308ccfe9e6cf58bc59e2fe36707fac918221c392d1f",
+    "third-party/nsh/crates/nsh-core/src/animation/ops.rs": "45d17baa5d67d2197027d26fa1313044c8cdc102e5c7e9aa8ea2a20cef924931",
+    "third-party/nsh/crates/nsh-core/src/canvas.rs": "89aca709ed1cf7f6e6f483bfe3b393bdc914bb1c676ac78905d8805a9a2b9b47",
+    "third-party/nsh/crates/nsh-core/src/canvas/damage.rs": "5b7ec6c92ea78ccf55d691dffc9e9621454de07c773d8263f4ed3ff2b51a61e7",
+    "third-party/nsh/crates/nsh-core/src/canvas/hit.rs": "2e3528e7f911e5d4ab735b19e8f79a54a037748598edc88dd9309195106b8e36",
+    "third-party/nsh/crates/nsh-core/src/clipboard.rs": "36b1c87f8762288ba9f8282daa03a5deb5541769afe75d58a7ba0cf8fe7defb1",
+    "third-party/nsh/crates/nsh-core/src/color.rs": "93afe9bf38e8f7b12108fedc4863f8e1bee3a55ae7d0c75e788b79b02fb72a93",
+    "third-party/nsh/crates/nsh-core/src/core/classes.rs": "242ff14438c0785b6d29af6315273d4f0256cc048fad221b4cabd2f3a0f2027f",
+    "third-party/nsh/crates/nsh-core/src/core/components.rs": "93f3cb23f3a570c620d8204bf46a125885f35cebe71e56e637eaafcb673dd057",
+    "third-party/nsh/crates/nsh-core/src/core/list.rs": "e709dcf029ac3d8d0c4bc87b4e1984ce07f50e18266d0759eaed773de1902684",
+    "third-party/nsh/crates/nsh-core/src/core/measure.rs": "c6692abd3002576afef5b6d777d7694e28e4754bf7ada0adf8ed1c92419289c1",
+    "third-party/nsh/crates/nsh-core/src/core/mod.rs": "0dddd5ad69f1c2bf6e67fe69b0d49f8d8487e9c0b31c4f72d486cbab1e907406",
+    "third-party/nsh/crates/nsh-core/src/core/overlay.rs": "21be85fdbba3484b0e5ea2d7455f821c197bf3af195ef2532a5bdc37080987a5",
+    "third-party/nsh/crates/nsh-core/src/core/parent_viewport.rs": "7aba431169b7dbd3000896a2aa6af865b18286826ce031182c0903278ffb71b6",
+    "third-party/nsh/crates/nsh-core/src/core/reading.rs": "3bb3d25dc8b97f35eb73dcbaf2d6f1b5dff8cdbdd012a8edcef7fab6661f3d9f",
+    "third-party/nsh/crates/nsh-core/src/core/renders.rs": "eba08379b95272762630258bba8c9d1908f8e8ec94d9518bfd59470edf49b5cd",
+    "third-party/nsh/crates/nsh-core/src/core/services.rs": "8812eefd00661841ff2b1de5d4f8cf68dd667da4151b4c79ed966cc940934752",
+    "third-party/nsh/crates/nsh-core/src/core/sticky.rs": "2c508038c1677fc10f11b5e6c1bf245cb78a75a02beaac24d0b09b2033a4beaa",
+    "third-party/nsh/crates/nsh-core/src/core/tests.rs": "1e4f1112be94a7cb3d86fa8242ef4a679b9e4016ee30a7ae4e4bddbb44ebc7fb",
+    "third-party/nsh/crates/nsh-core/src/core/touch.rs": "a8559c023a443a6defad135af2f319e60130e7df23af2a8353239b0862e494a8",
+    "third-party/nsh/crates/nsh-core/src/core/views.rs": "c32c59533d5ee33bc16677b0459816f7670c224f3f8de3507c72029989660834",
+    "third-party/nsh/crates/nsh-core/src/css.rs": "56760520c706f64505849d5a32a1eada2d9fd243a5c70e07f21bc8ed0105217f",
+    "third-party/nsh/crates/nsh-core/src/css_named.rs": "99459b7095e5729120419fff9e4c30795a660c743978a11010777f9a31a13b39",
+    "third-party/nsh/crates/nsh-core/src/default-env": "dd2723803c946daa91ceda4cca488b2850629f7655a5b1515ceb095742a29a9c",
+    "third-party/nsh/crates/nsh-core/src/desktop.rs": "bf5917f085915d8501956622558a5bd723b38e683cb3dc82d9fa8d74ed32e491",
+    "third-party/nsh/crates/nsh-core/src/effects.rs": "38281e098f0ec1e77369674b0d8bf0cb78ee75ec1faf8b2cbc7a1fa35b0ac359",
+    "third-party/nsh/crates/nsh-core/src/fenwick.rs": "dbb7e9e1cb1dff6b52d09c5341f85b29ea39af69ecc6bef88637e271d2a4a155",
+    "third-party/nsh/crates/nsh-core/src/filesystem.rs": "d7a41f7a470df023e1c495dcf8883eab07d5c099677d7bac4fdf8c8f1912897b",
+    "third-party/nsh/crates/nsh-core/src/geometry/length.rs": "ca5057f8fc5f3c8ba291e218e944321376a93326a4cf718b347fbb7880f7332a",
+    "third-party/nsh/crates/nsh-core/src/geometry/mod.rs": "1facd3aa45ba022bbf3c3b68fae51479e5033b1ef6e16bfb69e294c6a2a39373",
+    "third-party/nsh/crates/nsh-core/src/geometry/shapes.rs": "9408fce0f2b17664dcfbbd5d3bc780a968b27cb3dbe983d88f7a0cb8080d8dfc",
+    "third-party/nsh/crates/nsh-core/src/geometry/taffy.rs": "b756ff2358d713cec131ac51bf1af13b171d14ac44b5e956e28328cfd746fb62",
+    "third-party/nsh/crates/nsh-core/src/geometry/tests.rs": "a3cd72d91dc0e63600deb3ef1ec64256c7fc2ada9dd1baff45ff26b5ab057a64",
+    "third-party/nsh/crates/nsh-core/src/geometry/unit_scan.rs": "c195815bfd16481b1593cb99698a1d60cd2f841baa9c1e4027a6bb5c44170b04",
+    "third-party/nsh/crates/nsh-core/src/geometry/unit_types.rs": "fb33d6819432a8727305ca0e1aa0937e2a642bfe6068483822bbbc6b540d84ea",
+    "third-party/nsh/crates/nsh-core/src/geometry/units.rs": "8e061b96ca9860bfd97c4aca55d220736a757658d1f3a0a2b3cbfb8abc03b416",
+    "third-party/nsh/crates/nsh-core/src/grid.rs": "4572921a4b6c13a59a64b6e0e6e3bb4f2049f060b6c12194e0fea6c38c5e553c",
+    "third-party/nsh/crates/nsh-core/src/image.rs": "24e8519dde64e77adc35be54f176a303155a230d1f94b8251035e08c89528869",
+    "third-party/nsh/crates/nsh-core/src/input.rs": "9ef67d528e7a00bb4b325a425aa50e20ee3ebbf7f62325201520b6a3f4ffab07",
+    "third-party/nsh/crates/nsh-core/src/js/animation.rs": "e2bb991a9e414e81f1d4e9449b4c017d42a5a54f529f4713651e1c5badca32d8",
+    "third-party/nsh/crates/nsh-core/src/js/canvas.rs": "348900df6c3d12e2061e09d7d7c1d50fc409cb1f42fe4da2e1400e89fab93679",
+    "third-party/nsh/crates/nsh-core/src/js/host.rs": "3ff652f77711cb48a1255805fdd51d34d5c514e14ba9d1d4ad3cb8c192c97613",
+    "third-party/nsh/crates/nsh-core/src/js/host_values.rs": "f8da8a7af5cf78c4e514357c7d15b5cec5d32b60dfdfd103a28a32bbc89dac09",
+    "third-party/nsh/crates/nsh-core/src/js/limits.rs": "44bafb43b6fc14a6899f7f7219fb8d7505485179bc0ec470f76d9266d9b35fb3",
+    "third-party/nsh/crates/nsh-core/src/js/mod.rs": "0377b9d8f67c77acc47a467dc709090d3c5951a3f4ae6118abe680e97bfef9ca",
+    "third-party/nsh/crates/nsh-core/src/js/ops.rs": "c43398b95c3d9a6d58027b19bd3fb4d073287986939d9b894e9d4d1c905c4cd4",
+    "third-party/nsh/crates/nsh-core/src/js/protocol.rs": "19c4c34368d2a05a196e580d5813159f44e3d8183b9c6e9168f9b3ab3db4f91a",
+    "third-party/nsh/crates/nsh-core/src/js/style.rs": "8b80f7b45468d22da5403a25092087d42340ca119e6940309e38f22ef1651926",
+    "third-party/nsh/crates/nsh-core/src/keymap.rs": "c55d58813d5d84d2c33dc9a9cc9d9ef95e3e5eaef4e03a1af42c863674281685",
+    "third-party/nsh/crates/nsh-core/src/lib.rs": "5106d92ca05d9f46573efa426d1abeef8d7b5cddf71d4b1f7e3f7beda339c82f",
+    "third-party/nsh/crates/nsh-core/src/mount.rs": "d8b4f34e10db29189b29538041345b7c3cc90f2d743e48f6d20ad453d51471d3",
+    "third-party/nsh/crates/nsh-core/src/navigation.rs": "d79dd1d10a04157cbc5a383dc7b01aee820e6a33a16c682d3e43dc5d4909f5ea",
+    "third-party/nsh/crates/nsh-core/src/ops.rs": "cc2c363638171332617f74ea3534c6da6180c4cfb6ab1ef2cf065b79ccc43d2e",
+    "third-party/nsh/crates/nsh-core/src/overlay.rs": "e3029e8e8827a4365a4ac91162c77baa2a8e76fcbf22ded7c46cafac8cc33b13",
+    "third-party/nsh/crates/nsh-core/src/platform.rs": "d0acf7489905e456a648aac2cd2e892a0a7b0a34ead24de921a7cb33bd0029e3",
+    "third-party/nsh/crates/nsh-core/src/platform/clipboard.rs": "42bad81067d3339c38fbd45de16611c92bb6dcbf0c400c5486962ca19e70f282",
+    "third-party/nsh/crates/nsh-core/src/props.rs": "88d70945adcdbcf384e6b13ed1105d6f683b877e7a429a9b0804b9b356415963",
+    "third-party/nsh/crates/nsh-core/src/reactive.rs": "0d2d4c952be9b7f1c6c9c12898aa5d63b30e9401e8621194fda80904470e41df",
+    "third-party/nsh/crates/nsh-core/src/reactive/tests.rs": "f8c773d266b01c412849c896bae5d9607f53f752d0b1cbb5974ba0b19a341648",
+    "third-party/nsh/crates/nsh-core/src/resource.rs": "fdfe5bc19dbb80bfa2ce12c7f6fb78cf61cdb0ba14f0fd937f187e50d0fba7d5",
+    "third-party/nsh/crates/nsh-core/src/runtime/accessibility.rs": "10efaea7ad156a91dd2799d4aa6883a570d0d3b1bc6229c9fa1800e0702db04b",
+    "third-party/nsh/crates/nsh-core/src/runtime/android.rs": "d0d2609f76299aada76d82819991e199130d0ff1ce65952a4ae86777048b5125",
+    "third-party/nsh/crates/nsh-core/src/runtime/clipboard.rs": "916e9bfcf05cc6b8702f0fccaa20e7e1062a71dcacc820d625fc34ecfccecab8",
+    "third-party/nsh/crates/nsh-core/src/runtime/desktop.rs": "9f178654e9ddb48d258ccf198b5faac58f68cee3c3ef9fbeb079ed9523b87b46",
+    "third-party/nsh/crates/nsh-core/src/runtime/fs.rs": "b7f6770ccaefe5a04b034d649ef639601876651bece06c03b5ed4e5265d05d97",
+    "third-party/nsh/crates/nsh-core/src/runtime/image.rs": "df044f7d2f061309859de8b1c0f293747c85721eaae7ee265805da8c0517b811",
+    "third-party/nsh/crates/nsh-core/src/runtime/mod.rs": "6bb4ba9ac5272e343f2b3453c56151388bc2a49a108a53d11f8b7b12449de0bc",
+    "third-party/nsh/crates/nsh-core/src/runtime/net.rs": "698fadd3e298e8da089e4d4c88ed5f9a714028b021e5155c89fc6f5e86bf143c",
+    "third-party/nsh/crates/nsh-core/src/runtime/os.rs": "741a77c8a93dc6343873aea7b90a951f9340bd9a61ddaf185e6e6a3108bb81ea",
+    "third-party/nsh/crates/nsh-core/src/runtime/process.rs": "53eaea00026fce5689ee9d500aba7508f1e79d9ea3e4867232f9fdc281978efb",
+    "third-party/nsh/crates/nsh-core/src/runtime/storage.rs": "dc098b443ecfd5edf0141d7d42a8152fae2f7ce16fc78cc30aca808972eccc76",
+    "third-party/nsh/crates/nsh-core/src/runtime/websocket.rs": "7fbe877b04b24a1ca2ffae32f6f3ee68a974e26e0ac8aa41a740ef6909bebe58",
+    "third-party/nsh/crates/nsh-core/src/runtime/websocket/native.rs": "03cb9ef690cd2a8a7602081ff30c30a160d082c06689b019bfd4bc8b9611d7c8",
+    "third-party/nsh/crates/nsh-core/src/scroll.rs": "b9511db9608486e4cdc22c2ab994b0e53dd169a4165d5e5ab184467ca55542c7",
+    "third-party/nsh/crates/nsh-core/src/selection.rs": "3069ec87a5dcce2b0676caa08bd41fa3ee4f0e2a546bb2dcd8b1ae466eb684e3",
+    "third-party/nsh/crates/nsh-core/src/shape.rs": "83ae1d63179f16796ac750ecae9fb38dde64cac64820db915d47659e8c7f362b",
+    "third-party/nsh/crates/nsh-core/src/storage.rs": "8d1d46f2d486e61f644152c315c62535e4e652a4a51ae03ea379a8777d314386",
+    "third-party/nsh/crates/nsh-core/src/style.rs": "84e4dbfd20a8e00ef87a3d2b46dc917c7ae0e9326097967df2fbd6f3464de4ac",
+    "third-party/nsh/crates/nsh-core/src/svg/layers.rs": "ea5709f292a9135c2661a87bc1a64310bc7a27cc3738100db59c7af656691768",
+    "third-party/nsh/crates/nsh-core/src/svg/mod.rs": "f1ca0b3cd22ade38c71c8e7c33bfc708fa2b6f0dd183b1736c36418e244f5a3b",
+    "third-party/nsh/crates/nsh-core/src/svg/testdata/half-alpha.svg": "43eb1f002e5ede97714d406308232adc064e7d33b7aab1e98502a56c23056f19",
+    "third-party/nsh/crates/nsh-core/src/svg/testdata/icon.svg": "40bd48703eb318ebf7bb57a8f90b4b1987781500f1f4c69bac568e83a0f068e2",
+    "third-party/nsh/crates/nsh-core/src/svg/testdata/logo.svg": "c7f4d73d1828860ec1ec70da096bd121cda0fa18d2533945360b039c734a605b",
+    "third-party/nsh/crates/nsh-core/src/svg/testdata/text.svg": "7585c858450ac674151db5baf46ceffe55df4c2959e5a8e06b7c5c5fb77aa537",
+    "third-party/nsh/crates/nsh-core/src/svg/tests.rs": "7532a171fd18277140d75ffc0c780162445efada9ef170d9c7edcd7a78192557",
+    "third-party/nsh/crates/nsh-core/src/tailwind/mod.rs": "9c1cc41b0e71f99675033835c0584a24f44b759b7cd75329bd7b601b495799b8",
+    "third-party/nsh/crates/nsh-core/src/tailwind/palette.rs": "5ca161df61a76d0615f24d2ed9d31ddee1459d3bdcaa153146adbbf9abe78199",
+    "third-party/nsh/crates/nsh-core/src/tailwind/tests.rs": "9a4ae71614da6141bffd5da1fa1797f11dcec88f83f28aacfe9b57f320c788f1",
+    "third-party/nsh/crates/nsh-core/src/tailwind/theme.rs": "17300453d21ec734879ebae9077b39b7406b0d2ca817689ac197f6c5b3b6a258",
+    "third-party/nsh/crates/nsh-core/src/tailwind/utilities.rs": "6a89b9b15858ed5db49f457815d7ab1523dc25a5f05db7ecae2e0d7a00ecda2f",
+    "third-party/nsh/crates/nsh-core/src/text.rs": "01605b9db2e395cc1c1634baa87b246f3e9b66063b1cea0c0e9a6685cdd66368",
+    "third-party/nsh/crates/nsh-core/src/text_edit.rs": "46b21782bebc3ece314655e354ba31ff9f4de59f59a759a8ba75d931b42e012d",
+    "third-party/nsh/crates/nsh-core/src/text_source.rs": "d32bc6e9f66f085b7ae838a0f1dc9275be9fde648ae34af98de1e061813ba5a6",
+    "third-party/nsh/crates/nsh-core/src/time.rs": "c342c2e1d620cd2e8d44691e10064e56505253b696f543c1223c6ca4e34a137d",
+    "third-party/nsh/crates/nsh-core/src/transform.rs": "7a5fef9eb9b544d114ccf0f3c11e272aaed77eea1124da06bf247ef354e3b07c",
+    "third-party/nsh/crates/nsh-core/src/transition.rs": "f468b6d0a6e07d12ff76d7abbfef4c00233f69484fdfa4bb6eb7f288116375d9",
+    "third-party/nsh/crates/nsh-core/src/ui/ambient.rs": "864367f4f2d4999056e9d804ea0584807c37b377dfada1f5864756817d6bea7a",
+    "third-party/nsh/crates/nsh-core/src/ui/animated.rs": "b5e802d1f29181f663e375cbf6d6f09cb1706e4141ebf0b9289f25cc48579344",
+    "third-party/nsh/crates/nsh-core/src/ui/asset.rs": "ecc4b40dbe52c239f69de438eab9444768bb5d7e4069aa15a51c3adc7477702e",
+    "third-party/nsh/crates/nsh-core/src/ui/back.rs": "ef98d58af2314de48ec9fef54677a69d663a6fbd6fcbe90ba5f80f8c253bbce7",
+    "third-party/nsh/crates/nsh-core/src/ui/call.rs": "28dca6e5f92875ed1d413d27fa83401aba3c759880a75866af964affca4d72d6",
+    "third-party/nsh/crates/nsh-core/src/ui/callback.rs": "29c43c5cd493bed789895a3971bf808603d52ce0f211640f385c0fd1fd6d921d",
+    "third-party/nsh/crates/nsh-core/src/ui/class.rs": "08f3f36cc9d904cee6f49c3b33a3598dae8a478cc8bb8703f360f63c640ac5c4",
+    "third-party/nsh/crates/nsh-core/src/ui/component.rs": "8f19ed1b78d3eeb6434f4dd58748d937f5b45a9e583c316b1c979443b07c9358",
+    "third-party/nsh/crates/nsh-core/src/ui/description.rs": "b45848d583fe72fe79efb18aac23c88aadb30c14e6a5b33558243eb0f81367a2",
+    "third-party/nsh/crates/nsh-core/src/ui/desktop.rs": "13b68e6510e3e920b882e83617fef21380da29627007f0b8501200e904dc79d7",
+    "third-party/nsh/crates/nsh-core/src/ui/element.rs": "0caf17597339f476132700eb31fba3a992ab4e43818b83e51b10113801daa535",
+    "third-party/nsh/crates/nsh-core/src/ui/element_ref.rs": "18505f479859e82aeaabe2522318adf0004f2301ba9d7119bfa032f1fc5bc233",
+    "third-party/nsh/crates/nsh-core/src/ui/engine_context.rs": "fc9f4487a2ec47939119d2c6f5c75dc081ede1feb0422be8127b19fcb129fa1a",
+    "third-party/nsh/crates/nsh-core/src/ui/env.rs": "6560f20704070b7bb08c1e8e7c58f63c86afc53c150aa41fc571460a0c8e6b37",
+    "third-party/nsh/crates/nsh-core/src/ui/events.rs": "40d4d1b562781ac13732685d5decdffb81860010790469c9b4219cb3df9736fa",
+    "third-party/nsh/crates/nsh-core/src/ui/flow.rs": "3984b86ad1aaba5a1dd8fc32f93c139dcf3260d86500f6791ac8dd15d6de756d",
+    "third-party/nsh/crates/nsh-core/src/ui/host.rs": "03366afe31db0cef32adf10f5bd9eccb2406365bf1f5df711ad0e063ace1f408",
+    "third-party/nsh/crates/nsh-core/src/ui/js.rs": "ca79ea51d0bb9219018c6350609cc69ff11011f464b6efa8cabee325529e06ec",
+    "third-party/nsh/crates/nsh-core/src/ui/json_host.rs": "19bb29fd8e68537ca2166a3072082ef3de95afc0a7a99bd2070d98d9e8150772",
+    "third-party/nsh/crates/nsh-core/src/ui/keys.rs": "cea9dfabc574c0000bf6ef45383b9f77052dbd700bd694b5ce1107a11e2cef0d",
+    "third-party/nsh/crates/nsh-core/src/ui/mod.rs": "bdbd10de2d9cf3f257a36b7e1a93ffee496a4ae783a39de60fcae98831a90e8d",
+    "third-party/nsh/crates/nsh-core/src/ui/module.rs": "a2aba178d7f33e35ec9a2b40b6517701f83eee236bae1f6e184cff7ded1d05da",
+    "third-party/nsh/crates/nsh-core/src/ui/once.rs": "43c3c781c2b6d2622a569825e35b09ce9075af9b2fd5bc974dce6b5f4d303345",
+    "third-party/nsh/crates/nsh-core/src/ui/palette.rs": "56a631d4e5bb3ffe02241618a7f16f999049946017de61a29606c12ca6b1c325",
+    "third-party/nsh/crates/nsh-core/src/ui/prop.rs": "e8126a20d32bb563d596059694fdb185a4cb5ab4edf2ffc5e3c3c74e53a8823d",
+    "third-party/nsh/crates/nsh-core/src/ui/reactive.rs": "4bcab40ad0dd3c2c545b5a5aee844d084d7f126aaaa9c4419a75099d1ba518e6",
+    "third-party/nsh/crates/nsh-core/src/ui/reactive/tests.rs": "e8b36d60d5ce67a6b1fa98022aed23fd0622a672f423dec1dcd56e31bbccbf19",
+    "third-party/nsh/crates/nsh-core/src/ui/renderer.rs": "05cc3b2ccea2a14b3ff34d6c4e88d872acb8b9d996e703102e45009b8c44b214",
+    "third-party/nsh/crates/nsh-core/src/ui/resource.rs": "b991619994e566e792fe4c113af9a0970d764749b45ff183fb971ac8d70ac18b",
+    "third-party/nsh/crates/nsh-core/src/ui/responder.rs": "b5e419ced70b1457743c4c9fd61e3cc51c93db348581cc9bd14b61fe695e0e43",
+    "third-party/nsh/crates/nsh-core/src/ui/rows.rs": "a5fd4db97517c39b1e4d898c19cb4a8e60429ffc6de1021527df0f2cd53bb365",
+    "third-party/nsh/crates/nsh-core/src/ui/scrollable.rs": "704ae082a1f10e2b344e20299e52177ee77990bacf83eb71c6523e0419f8ec6a",
+    "third-party/nsh/crates/nsh-core/src/ui/services.rs": "df1e10972fbdea7b4af78016948c214eb393c49ef8d4e023e9f55d022e91a8d6",
+    "third-party/nsh/crates/nsh-core/src/ui/status_bar.rs": "2fff306388c47bfee440e1042f9143251fe0b210cd57a370e5e8a8247c537acc",
+    "third-party/nsh/crates/nsh-core/src/ui/style.rs": "3a39cfbd53c8a754d59685e73ccb7cf1da431063c8b7a4ec0379bb9fd039498c",
+    "third-party/nsh/crates/nsh-core/src/ui/system.rs": "077e9dada158047e159eae15a86eadbdff62875e473e11255afacf32a20f9607",
+    "third-party/nsh/crates/nsh-core/src/ui/task.rs": "e19a244fd39fb716a71ad33f653f3f24cc3e390c40159224ad341aa51c37e174",
+    "third-party/nsh/crates/nsh-core/src/ui/tokens.rs": "c95b983afc27c65290b22f5db7e9ece7b48d05e7f4c769c2e882e81695ab4756",
+    "third-party/nsh/crates/nsh-core/src/ui/value.rs": "81804c80fb2a357b40f55fa4586c55a818370cb641e8c074e6f3f8f6046ab0b8",
+    "third-party/nsh/crates/nsh-core/src/ui/virtual_list.rs": "e3d0ae1417072a65323d978a8fdf7911d936d82f4304993e5ed74b2589335abe",
+    "third-party/nsh/crates/nsh-core/src/websocket.rs": "8438f7eb89366e83af5fb5795ae69010b0c1a9714531ebdade6284e4a5c146a8",
+    "third-party/nsh/crates/nsh-core/tests/attachment_compat.rs": "4bf699c142cfa3940a1a9845c644097a642e8b563cf33a18e447c6f200a09dd8",
+    "third-party/nsh/crates/nsh-core/unitless.txt": "4be7cb21e81a9b06df05b110a3af3d109ff99c684786ef6146feced3006495e4",
+    "third-party/nsh/crates/nsh-core/untyped.txt": "2dbe1d080c08c33debbf4d4c27ae0a08996efa87dd072494b7d0ce712109d2d1",
+    "third-party/nsh/crates/nsh-dev/Cargo.toml": "f6f8b7604f4e2bc8212779f46c74f568247f8d9f853eaef4417418ea8a6f4ab2",
+    "third-party/nsh/crates/nsh-dev/src/client.rs": "541352e633968e5ff9dc3fa6d5f3ace8fef5cfb42465d623a2d19331b71d1edb",
+    "third-party/nsh/crates/nsh-dev/src/lib.rs": "5ab70265d0446186802b942c849ac83cd0bb7cfeb2ca3f69d163dd56bbac3fff",
+    "third-party/nsh/crates/nsh-dev/src/protocol.rs": "b97d61c24c8fe9da3d6fb42cf844703a952c36aa0a04e30a4cf41e178d29eb49",
+    "third-party/nsh/crates/nsh-dev/src/server.rs": "362e3db0d084c02b91242d6c0bcdd21becbe31db5d8330bc50b85330231d0d82",
+    "third-party/nsh/crates/nsh-dev/src/site.rs": "2f54a4ba0b0c7f7c7d24da8719ceecf50e4ef4cc1adf49fcf15305fa6d8bc25f",
+    "third-party/nsh/crates/nsh-dev/tests/roundtrip.rs": "b4b5fcdc8ba628dab768744fc2e13d899081a092c605d1382f767bea4c021fa2",
+    "third-party/nsh/crates/nsh-engine/Cargo.toml": "9a8d4579a6a19b201f1de8493ceeff18fe4a4d32161911366957380600db4279",
+    "third-party/nsh/crates/nsh-engine/src/access.rs": "37cb4b18aa2f1d47325969b035bd08f5d6cb9db6c5b437a6a9aa7bd2677f6707",
+    "third-party/nsh/crates/nsh-engine/src/app_directory.rs": "bf99d20949b392e5b919f8185a6e234308d53ae7db02c29b0d18ce678b74986f",
+    "third-party/nsh/crates/nsh-engine/src/error.rs": "54bce4d455c05a1c37b3e0ce8e46271492369855482283ffae3851605b44bc51",
+    "third-party/nsh/crates/nsh-engine/src/lib.rs": "e443d068bc5197bbc89df2e6bb648a3ba1c2cc679baeaef15eb110f43bc04252",
+    "third-party/nsh/crates/nsh-engine/src/local_storage.rs": "bf75d06d4d917a14b6d4f08abb10d385c68ed4ab50b6c70c4851cbc72ad3f631",
+    "third-party/nsh/crates/nsh-engine/src/net.rs": "3a1fe7de92639eb17aac9e97156b7a9c6cf9384bbd9a973548c12434b48910f9",
+    "third-party/nsh/crates/nsh-engine/src/perf.rs": "29aeede364da40ee8cbdf2acb750abaab7cee523b2df34870b7bbeaf291f1a33",
+    "third-party/nsh/crates/nsh-engine/src/script.rs": "8cf5c920bbad1dec79c5718df66ebdd85dc7e97e9e07a33adc16034c1a760a22",
+    "third-party/nsh/crates/nsh-engine/src/storage.rs": "b18cfe10046ef5e3486a3ba1840578862195968e06ed842b7c1f285f610e8221",
+    "third-party/nsh/crates/nsh-engine/src/symbolicate.rs": "974a80ff547e60e682ce2691e83346f02123c549b5f92899e84dc41b29fdd094",
+    "third-party/nsh/crates/nsh-engine/tests/engine/canvas.rs": "8484a9e9e3fb0b60b45a947ae31e9e0b9435843390b59411c03a7248dd3a322f",
+    "third-party/nsh/crates/nsh-engine/tests/engine/class_bench.rs": "48429824b5efc1a8a8a08776fdf3280139c9a2b450aacc7437a663bd16bf4ba6",
+    "third-party/nsh/crates/nsh-engine/tests/engine/clock.rs": "b11f9c4240f2787b39dc819bdbe90b2d3666b4ff3f89d267ec90d5356780495f",
+    "third-party/nsh/crates/nsh-engine/tests/engine/compiled.rs": "ed35fbe5be966d3bdd3d3cf6f7d090dce664e1312a8484b36cdab2dbbbeaaa54",
+    "third-party/nsh/crates/nsh-engine/tests/engine/component_bench.rs": "3d9625ac6a683620aff4c277addb251f724ce1fdc20fc1dfd228a7b3fbf17aa4",
+    "third-party/nsh/crates/nsh-engine/tests/engine/components.rs": "8bc03ffd81b3ef86d101cac1d2fbcab88df98aa198bb8d55fe01a1e65653a21e",
+    "third-party/nsh/crates/nsh-engine/tests/engine/counter.rs": "1b0f9981461d121290e72789c2efe495c46dd19df138a9dc908977fa7364aa05",
+    "third-party/nsh/crates/nsh-engine/tests/engine/errors.rs": "a050ab6f85a865b7701563de2230c2c316cf94a40eea15a17702a020d2657c42",
+    "third-party/nsh/crates/nsh-engine/tests/engine/external_wake.rs": "4c114be3b7489e607e9826c8264bbf9bdd161479fbda8f598da6595661ab09ff",
+    "third-party/nsh/crates/nsh-engine/tests/engine/fetch.rs": "30a4ad7fea1aa1f3e481d9774ed3aefcd92832f36f3347841a8ead672e05368d",
+    "third-party/nsh/crates/nsh-engine/tests/engine/fs.rs": "71f693539ff71b4ddccddd925739a52a695e2fd22335cfad396304395147b01f",
+    "third-party/nsh/crates/nsh-engine/tests/engine/handle_bench.rs": "fdfb1c00cbae1dfa73b3b5fcd373bd839774d2f137642a5dd1b09bbc8ad12675",
+    "third-party/nsh/crates/nsh-engine/tests/engine/host_modules.rs": "261558f3b5badd08e89586af65893603f195588508b99e3d6164f572bc045cba",
+    "third-party/nsh/crates/nsh-engine/tests/engine/hot.rs": "98e44b2518e746f86a61ef503af030e7d460becfa3b66891d3a98228bcf8be46",
+    "third-party/nsh/crates/nsh-engine/tests/engine/hover.rs": "555c2bf8043e52d181dae2e4a35d01182fe44258d5051be1c5412ad1613b7482",
+    "third-party/nsh/crates/nsh-engine/tests/engine/images.rs": "775dad08ac5ca247b8cb5388e40c9a70b3583636bcc1bf8bc4d09551aacad372",
+    "third-party/nsh/crates/nsh-engine/tests/engine/js_touch.rs": "dee2b2ac3299459a90ef785e24081e0fd280dc9aa91d650de69e8c938ce61888",
+    "third-party/nsh/crates/nsh-engine/tests/engine/keymap.rs": "85fe9f59f13bc07c66148a1d2cf8ef62858e914a83d84dd451c4d6af7d8ad1a4",
+    "third-party/nsh/crates/nsh-engine/tests/engine/list.rs": "757a325fb32271922cf977d35307431e6c8fb6e1db19d4991cc9cb783e06e1bd",
+    "third-party/nsh/crates/nsh-engine/tests/engine/list_bench.rs": "df4cb2074bf17123776168d8650ce2575595a3b7162796b0dfe793c880e022c6",
+    "third-party/nsh/crates/nsh-engine/tests/engine/logs.rs": "e40d974c261a3b025b80dbbbb2be83e2d58f8ccd07ef9a77b82f740d5795bd9b",
+    "third-party/nsh/crates/nsh-engine/tests/engine/main.rs": "0db1654e25ae62e4d496446e38e8c0b369fc82d1435ea8b791ed5c0e8ab703f1",
+    "third-party/nsh/crates/nsh-engine/tests/engine/native.rs": "91e9f9255e84e0f4f93e40e72fe1953d4bf305818cee95b102be715ba9bf6fc3",
+    "third-party/nsh/crates/nsh-engine/tests/engine/net.rs": "d6b6b5cb734f7a0ded0063d193919ea8ca1d783511102d5078bb4e8e6c07ceb7",
+    "third-party/nsh/crates/nsh-engine/tests/engine/package.rs": "5dd7e22c6d63c010b1ed3d701810442d112120b143fef6481cd44d33c43f09fa",
+    "third-party/nsh/crates/nsh-engine/tests/engine/parity.rs": "bb6e25c44eafe9d1f93b0ff61d6dcc8ad422134bc8336f9b33cb5f400a9e774a",
+    "third-party/nsh/crates/nsh-engine/tests/engine/platform.rs": "5101ae15683f92d51d2d24a1024693eac90f73eec2d999cd1a00e560623b4e9a",
+    "third-party/nsh/crates/nsh-engine/tests/engine/process.rs": "609c863f1cca4206a57e93b1cb8740ad0f1385105989cd9d5ffd48b9370400e9",
+    "third-party/nsh/crates/nsh-engine/tests/engine/rust_animation.rs": "60d6035164e10011e5c2bc369a4273d6677f55fe8f39cd9a50f4200e9f55ed8e",
+    "third-party/nsh/crates/nsh-engine/tests/engine/rust_app.rs": "9fb1620bf8c281da4608f885f6f32c29e4b128cd1167dc4d4babb506b97f6656",
+    "third-party/nsh/crates/nsh-engine/tests/engine/rust_classes.rs": "d50550586e106a4f06f4caa73696cc615de66b85418d6b9f3a48726bc4271c87",
+    "third-party/nsh/crates/nsh-engine/tests/engine/rust_inputs.rs": "db48fb968ddf364ab84746f8b5eeee339138c2806c9f285f5ba0e19c487dcab2",
+    "third-party/nsh/crates/nsh-engine/tests/engine/rust_lists.rs": "1863778e596aec2d756c0d9a23be52cb18b8a7e2c6e09cca4cf41bce8f52bcc7",
+    "third-party/nsh/crates/nsh-engine/tests/engine/rust_media.rs": "6ebb80a10ce2fcc42408af7bfb7de2500553be7e76489f1f7f2adb23a275d883",
+    "third-party/nsh/crates/nsh-engine/tests/engine/rust_platform.rs": "fb79b4034c3472ab4fcef66b11af5f7ad50af6d9818b61526befe2dae9182631",
+    "third-party/nsh/crates/nsh-engine/tests/engine/rust_popups.rs": "70b04e6f936e0dc251230080cb8725f3d49eafc6d327b0f2b822b4ed4266535a",
+    "third-party/nsh/crates/nsh-engine/tests/engine/rust_renderers.rs": "3e274abc6222c2cb1a57939ace396713edbf234d30e7d01983fd8550d2830807",
+    "third-party/nsh/crates/nsh-engine/tests/engine/rust_scrolling.rs": "10323264aaea9ebd2cf9750daf468cc044e9dc57f46ad43db315deab9c2c406d",
+    "third-party/nsh/crates/nsh-engine/tests/engine/rust_styles.rs": "2b7938340cb5ecfbf9d9f7efc73e36dee65b2a0f4c1bb3b76ae11e449c4094be",
+    "third-party/nsh/crates/nsh-engine/tests/engine/rust_touch.rs": "fda20927d126da2318a29231c538ec434adeec5838bf2a633f943d5d75462077",
+    "third-party/nsh/crates/nsh-engine/tests/engine/shutdown.rs": "49e1a5a5f481077081d1bf5b18873970345543f98dc4fa8adb73446844d0017d",
+    "third-party/nsh/crates/nsh-engine/tests/engine/split.rs": "392238c9633892fe6ef0ebd508a1212ab0903b726b327ea87bf0465d7d773f1c",
+    "third-party/nsh/crates/nsh-engine/tests/engine/storage.rs": "271620e86942712de84bbc3c0ed71763f38d8e9f56bee3717fa38ab6494131f2",
+    "third-party/nsh/crates/nsh-engine/tests/engine/system.rs": "fc1b5c7d5417d256cdeb51451110b728f31b85862aab377e3730540df13d4a63",
+    "third-party/nsh/crates/nsh-engine/tests/engine/test_ui.rs": "e5e6f8b9acd4124668deec4fc8860ab1849c1f3be82c1244330ace6e4599b5fb",
+    "third-party/nsh/crates/nsh-engine/tests/engine/theme.rs": "fb247e36f8ebf78c568fa6319e4dd4b5532f2f973783737f6c8778246be97c08",
+    "third-party/nsh/crates/nsh-engine/tests/engine/websocket.rs": "d598ae8ba425749118c9269d6cde057c38fae0f029758b58538d8e79368cf133",
+    "third-party/nsh/crates/nsh-engine/unitless.txt": "608551ec4de1da091099bad8e64d961a352681da134c4af9b58b9a29a9e43018",
+    "third-party/nsh/crates/nsh-engine/untyped.txt": "0e94c66fb47844aa29a7b5deab131001f3ab89ea46e79c1d75679bf618788c10",
+    "third-party/nsh/crates/nsh-ios-app/Cargo.toml": "c1e3ad9e6398953e8fa7df9996304913906fee198d5f9a6574d8c0a01623fc54",
+    "third-party/nsh/crates/nsh-ios-app/src/lib.rs": "d66a265a1c697cade9cc1ad6363b7f8531e8d961eb1c7ef4c6336a1d9219a1eb",
+    "third-party/nsh/crates/nsh-ios-app/src/main.rs": "73e2a7485cf689656d70603ccb31981d01c419a84ba4ae09698567c9e03a29f2",
+    "third-party/nsh/crates/nsh-ios-host/Cargo.toml": "c88a580e48ab783aa69177f821243ac159be6e709331b2d30cd9095a3449ed16",
+    "third-party/nsh/crates/nsh-ios-host/src/lib.rs": "63593399008033d85ab4de3030e104f93785edfbe33983db526b874d1e03e489",
+    "third-party/nsh/crates/nsh-ios-host/src/main.rs": "5fea860f710b7bd5e515eed8b29a8c14a9280670afdf999f16a31ed03857d9fa",
+    "third-party/nsh/crates/nsh-js/Cargo.toml": "0629dcd21dc444ce8081c9bd8be3451d04957bc69f6eb22a35577cdc4c10da37",
+    "third-party/nsh/crates/nsh-js/src/animated.rs": "c5a039fb4c72825bb44664eb94ca4d765a46c29e1f90767d59a3e25007bb85a9",
+    "third-party/nsh/crates/nsh-js/src/bytecode.rs": "59721147154608fb29fc583adcc9f6b8c3c1c9bf0cf1a0499d89173f36f6ebf9",
+    "third-party/nsh/crates/nsh-js/src/canvas.rs": "64582fc7c63bcc552b1a46341f41a9b2975fa62d0f76942fb873497ff4d513e8",
+    "third-party/nsh/crates/nsh-js/src/chunks.rs": "b3f7aa20c22eac8515ab0fff427e70725334beed9d4deb4361ae154da316e89f",
+    "third-party/nsh/crates/nsh-js/src/classes.rs": "34fdc68dbf129072fced8eb162c8773bfc77c3305eb899c8d0ee406260d5e13a",
+    "third-party/nsh/crates/nsh-js/src/clock.rs": "06c083117a5eaa2d2deddcb41e52ab9e1a9f48efa72d6e9a0f27135bd237b161",
+    "third-party/nsh/crates/nsh-js/src/components.rs": "3cd5438936ad8521bd78e83698c74c8ae228019959de336956dbee61ea7e378f",
+    "third-party/nsh/crates/nsh-js/src/console.rs": "2bb26f43b5326680cbaf9ab1fcc58fa0ab049c349feff6dafd39c99d4240f6a3",
+    "third-party/nsh/crates/nsh-js/src/declarations.rs": "d4eb89fe61f41d77fe178512e3f3e570cd3cc23eb1d76b02d1295de9de73734c",
+    "third-party/nsh/crates/nsh-js/src/desktop.rs": "bb5d9d831761b706ebc231009f089db9408a7584d2fdcada3935860ec8215d3a",
+    "third-party/nsh/crates/nsh-js/src/dom.rs": "b75190400a363ed60f5d6737be4cb4d14f8d69e819201bb090bfc4dedb98d56d",
+    "third-party/nsh/crates/nsh-js/src/env.rs": "571522044cb3d43799d185e363edf87622a03580487db85e5827ea59229d0ac5",
+    "third-party/nsh/crates/nsh-js/src/error.rs": "01a5f911656faa39aa30dbcd71789ce30c35b3e740c5f3ec5125c87b85282bd5",
+    "third-party/nsh/crates/nsh-js/src/host.rs": "3740d306e43b9eb5c81f30623044f44ee166828c9100425f691bc3d244e94931",
+    "third-party/nsh/crates/nsh-js/src/hot.rs": "6286e13ee994063c1c72292bfdb44c964dad45b127edb24a2d76461bd163d621",
+    "third-party/nsh/crates/nsh-js/src/input_action.rs": "eb70b0792eff82ccda139f63700656167ac04753872fca2aa63485673d9ab047",
+    "third-party/nsh/crates/nsh-js/src/keymap.rs": "cf6a81a283c6f3ea77b07dabc1ab8ed3d64b88cdc3d51e8889cff6cc757806a3",
+    "third-party/nsh/crates/nsh-js/src/lib.rs": "396374fe32e378c38d5ad936b6146569fcf183c16f5133e6ba8d46b231ba29d1",
+    "third-party/nsh/crates/nsh-js/src/list.rs": "dafec1262d993ed59e80067ed925ba3e1ee4481a68a1a53dd604126e4e81a998",
+    "third-party/nsh/crates/nsh-js/src/modules.rs": "c23d93fbf0bd5d5680fa02e402ed2c95bd574f6c3d6a900e9722bdf55230362e",
+    "third-party/nsh/crates/nsh-js/src/navigation.rs": "23d6bce4611eff5da1516561caf7d89082059b2aaae0cec47f72efe955998401",
+    "third-party/nsh/crates/nsh-js/src/net.rs": "2c1e993f6e58ecb095a78ceac05357ab747cf8d21769507ebbc3c74c63fe6950",
+    "third-party/nsh/crates/nsh-js/src/platform_modules.rs": "26c25867b012588b1d5fc0783a99b0c650915a9a48d797a57f73ecae34008d09",
+    "third-party/nsh/crates/nsh-js/src/protocol.rs": "058fa87197c16aa0bbc76345244eddef44f0fb7a8c669ff974486889648ac4dd",
+    "third-party/nsh/crates/nsh-js/src/reactive.rs": "36773de3b3e8e1368cb9960fe3925d7d15e746dc85df03c659c55527d7683e67",
+    "third-party/nsh/crates/nsh-js/src/rejections.rs": "7873bcd5daa9b755951b0ded491e72ba9c9a82f77526dfc41df829a998fda7da",
+    "third-party/nsh/crates/nsh-js/src/resource.rs": "69be11ea4bb8d06d9d0f3a7b4bc74e80d67d3efe62772276613455510f9b30d6",
+    "third-party/nsh/crates/nsh-js/src/sandbox.rs": "b252cee710e81439a630bef44bf042e588047edf45772d8707f213ad7daa4faa",
+    "third-party/nsh/crates/nsh-js/src/standard/bounds.rs": "4ad2f4d37e9e3c04ac09099400e46f2b5a1a6d32a4659c5de87ccf3523491cf7",
+    "third-party/nsh/crates/nsh-js/src/standard/console.rs": "028e5b41914d9ffc478291c9b2410044033532d16b7437f4ac6461b199927ef8",
+    "third-party/nsh/crates/nsh-js/src/standard/declarations.rs": "35923ae3a353872a6c6762b2d71884bd5983d74579a1c16fa35325cf96302c63",
+    "third-party/nsh/crates/nsh-js/src/standard/mod.rs": "6037762f78c1c58b007e105d922658c0b0d8e32fd71ccb55f94e2a3b34e86c58",
+    "third-party/nsh/crates/nsh-js/src/standard/os.rs": "f7e65e5edaceab1fa982c7080c809a27b7676c4c17e7d641dc9fcdc4484e99d9",
+    "third-party/nsh/crates/nsh-js/src/standard/path.rs": "9f3d2625abbc33dbf243c9c40b539a0d72ad68ddf21882c02e1ce4e5226f5427",
+    "third-party/nsh/crates/nsh-js/src/standard/process.rs": "a6256ff9b135d4ea590f07db077224ad849efd23e328785f398c512432b1e36e",
+    "third-party/nsh/crates/nsh-js/src/standard/random.rs": "62ee219c31d1b8beaff83c6d09e39584b74efa805cc042cde066253c7a9d5190",
+    "third-party/nsh/crates/nsh-js/src/standard/scheduler.rs": "bc2eb7927a1c11cc2c631c9951da91bb28e50cff3ce66fa2bbceb04ab71e7cb9",
+    "third-party/nsh/crates/nsh-js/src/standard/url.rs": "3932ebecfac23274d6d06ea62411e6908ca2bb108d7bc823b5120757a4ab2ab1",
+    "third-party/nsh/crates/nsh-js/src/standard/url/browser.rs": "c03fe9ba7c7e8d3e1405393130af19dcbd93cd853b299f16af7f17881856c5dd",
+    "third-party/nsh/crates/nsh-js/src/standard/websocket.rs": "3a800e85700acbeb0fbd89cda95b6025d4d06984f8552d2413ab7c9056dc3351",
+    "third-party/nsh/crates/nsh-js/src/standard/websocket_fixture.rs": "f4221f21aed6836d5dc3802831fb29aa1afce699c374706917298368ed518869",
+    "third-party/nsh/crates/nsh-js/src/standard/websocket_native.rs": "4ad47c4cd0cbbaaca3792cca0a19c08bbb2a31e3bba385e1042a16ffc00af50f",
+    "third-party/nsh/crates/nsh-js/src/standard/zlib.rs": "25951647e5f4944e7d0666bfaeabf450bf783c8cf1a7e4cf2a9d0861cca22b74",
+    "third-party/nsh/crates/nsh-js/src/state.rs": "e88c9430550d65f46103e65caf592981c4a9396c2a8eed0a7611bcae70471533",
+    "third-party/nsh/crates/nsh-js/src/timers.rs": "e88b6fc8659eabe435b5a2b9561d5c8eeb8bf1c765654dd952ee192ee151574e",
+    "third-party/nsh/crates/nsh-js/src/touch.rs": "820a1cec110f6dc7ba59a0aeb9b5f777c194afb5406f9471cad0b49accdd40cb",
+    "third-party/nsh/crates/nsh-js/src/web/blob.rs": "cd78a0336ace43a9b42d45b667d48292b45e043fa696972374db44a5215dfc35",
+    "third-party/nsh/crates/nsh-js/src/web/encoding.rs": "b958cc2d58500d6ad1a1cb387e08f972ac42efb87a7d1f041aa89af9b5863b74",
+    "third-party/nsh/crates/nsh-js/src/web/event.rs": "7fd97656bb1844a06d2d68860f52fbe4027bde453a790b10e1771c3d06ead54e",
+    "third-party/nsh/crates/nsh-js/src/web/fetch.rs": "0cc2f8c455dd86094d761a206692d2d52dbf66e446d25bc16fac4c06c546e0ce",
+    "third-party/nsh/crates/nsh-js/src/web/intl/date.rs": "5b08b1fece87bb42402d472d74aecf410b8625743a1a9be9b664cdde60776801",
+    "third-party/nsh/crates/nsh-js/src/web/intl/locale.rs": "c0601e395979122307ebbd4fb551c74032e0a496b458da19a402cf1ff66c5d35",
+    "third-party/nsh/crates/nsh-js/src/web/intl/mod.rs": "0ad1f81cdd984f78094cb1d21670d7a8130d92cde627151b7a2fd9ea9661de8f",
+    "third-party/nsh/crates/nsh-js/src/web/intl/number.rs": "eead5bc34c3539d95a0d23e82241c315dd857b42b7e9cb0bdfa287fbc079b10a",
+    "third-party/nsh/crates/nsh-js/src/web/iterator.rs": "b8336670973853dcd6691decd2e7d92682e98e5e693f7dde837ac2988a8271e2",
+    "third-party/nsh/crates/nsh-js/src/web/js.rs": "99f2dc852ed3f24fc82244ef67c7624f30e3a9ed1b539667937dc86620eb88f6",
+    "third-party/nsh/crates/nsh-js/src/web/mod.rs": "ff9ef8d803442098c7335891c1e8d4ab73ac491d1e7f4c3f6ca8c1428619e29e",
+    "third-party/nsh/crates/nsh-js/src/web/streams/mod.rs": "6f142c419aefd7626a08207e97da7291d9fc993426879b8c5b2c74913904d26a",
+    "third-party/nsh/crates/nsh-js/src/web/streams/readable.rs": "c55d8b6b5a986cd00d68c4d9704bc307ed1f65d619a3a1a29960bbae7ce51d81",
+    "third-party/nsh/crates/nsh-js/src/web/streams/text.rs": "a84c73c597baeedbb8dcf13919026fae6178214726233f09ae272eddccf44e44",
+    "third-party/nsh/crates/nsh-js/src/web/streams/transform.rs": "4fdb77783822af8179fa155a6e50e676e3e9c3c40ec5b0fa8262140a2d2d4e59",
+    "third-party/nsh/crates/nsh-js/src/web/streams/writable.rs": "cc84497be44e09a20caee163cbfe5681060519ec3c5ab57fda3bac164a478afe",
+    "third-party/nsh/crates/nsh-js/src/web/url.rs": "cdf3118fedd7b85aa6656b512964cda7bf0f0a68daf5f55e06fbb7a995719491",
+    "third-party/nsh/crates/nsh-js/src/web/websocket.rs": "01e9bcb28cb8ecd67ae25e098dd470c594ae85032247f9f8126f80f8509eceed",
+    "third-party/nsh/crates/nsh-js/tests/standard/imports.rs": "2e79167aa0bd2562426ec36f788871c6ce2d32e3f84afcd51651f6b5290f9353",
+    "third-party/nsh/crates/nsh-js/tests/standard/mod.rs": "d7c77506f416216ac496610299701cd69969c5988a0fb842b514b84dadf256d2",
+    "third-party/nsh/crates/nsh-js/tests/standard/safety.rs": "554fe1483839d2677d73c3c52baeb5e47607c04a8fcdc7e10e7662aafea05fbd",
+    "third-party/nsh/crates/nsh-js/tests/standard/url-parity.expected.json": "5d8e15e64afaa2179bab594d0e00df8844cf86f8761e5de4bdafcbc410be9ea2",
+    "third-party/nsh/crates/nsh-js/tests/standard/url-parity.js": "4dfc2b9be2de137ddc1f0861b594e4afbea770c2dd875ace81034742331cd0c8",
+    "third-party/nsh/crates/nsh-js/tests/standard/utilities.rs": "19d61e1e119383283fd03a7c0c2a65261f5321c37a303af6d389b2bfee9d4e8e",
+    "third-party/nsh/crates/nsh-js/tests/web.rs": "d8dc00b86b0f7fb5ce573bfb762a4d9f16b4d40d6f2680f2cd4fda420fc72853",
+    "third-party/nsh/crates/nsh-js/third_party/llrt-types/LICENSE": "58d1e17ffe5109a7ae296caafcadfdbe6a7d176f0bc4ab01e12a689b0499d8bd",
+    "third-party/nsh/crates/nsh-js/third_party/llrt-types/README.md": "c2ae85c43fa171ae28d4d2d8c2449a95db580de2ac2f50df900a192bd2a77453",
+    "third-party/nsh/crates/nsh-js/third_party/llrt-types/SOURCE.json": "f5ec81d3964fd536ab3c9ec0709b4a8667cf97dfb72f86901ad018b826a1b76d",
+    "third-party/nsh/crates/nsh-js/third_party/llrt-types/assert.d.ts.txt": "809575879c742b5af3811f3a003cff570c237d589c91bcc64cc7f2c16e8afbd6",
+    "third-party/nsh/crates/nsh-js/third_party/llrt-types/buffer.d.ts.txt": "d5c2a5b4691ef176a43c9df94a05f9b00665c795cb8bcb339e7964ecb86757c5",
+    "third-party/nsh/crates/nsh-js/third_party/llrt-types/crypto.d.ts.txt": "748f7185c2116041431d79d7b69f9e1210929e751dd8d29f4dc231b1c41c4a35",
+    "third-party/nsh/crates/nsh-js/third_party/llrt-types/dom-events.d.ts.txt": "9d86dccf921a73a602d6519ba6f89816e6102966c3a262a445d3860f659e084b",
+    "third-party/nsh/crates/nsh-js/third_party/llrt-types/events.d.ts.txt": "5c9e0370d9d25d7d02ac8563a3354a0bbb6a667b45f2b8fdadb6bf9804104123",
+    "third-party/nsh/crates/nsh-js/third_party/llrt-types/globals.d.ts.txt": "b501921a9b27b06d2063c54ec8228ab5f991905f1c84a12e6712d3b01acfca07",
+    "third-party/nsh/crates/nsh-js/third_party/llrt-types/path.d.ts.txt": "d062fa26471cfeb2849f17152e973860bd3969044b5e83735f805c120e96ec6b",
+    "third-party/nsh/crates/nsh-js/third_party/llrt-types/refresh.py": "c6e1feebb374f7e3099efab58eda2fdf5bf20d23c70860c859428ba7eb043c71",
+    "third-party/nsh/crates/nsh-js/third_party/llrt-types/string_decoder.d.ts.txt": "0263398329a1a3d6cc2334970febe178c50de01acdb29abe43112feb1622d166",
+    "third-party/nsh/crates/nsh-js/third_party/llrt-types/url.d.ts.txt": "f2b8632ba1cd6dcf65f7eb41dc16165474a4d2989396448f95e4ee01bbfa2d9c",
+    "third-party/nsh/crates/nsh-js/third_party/llrt-types/util.d.ts.txt": "f488392f03a780f04aba4c1fdc6ce0cc04dfa9beb80e115adbf4a377f8f4da22",
+    "third-party/nsh/crates/nsh-js/third_party/llrt-types/zlib.d.ts.txt": "c09afd8cf8290e4de2e885660be60b8b9380efc45d6df81b6f0c907bd80ddc49",
+    "third-party/nsh/crates/nsh-js/unitless.txt": "8645be0ffc8fc0cfb6809e366e5c0ae3c32d266fc33cf09014288f2878b2c7e4",
+    "third-party/nsh/crates/nsh-js/untyped.txt": "cfb39cae2618837db2ef7d8c9032f580664af9137f37aa78b4ff8728539b5cc2",
+    "third-party/nsh/crates/nsh-linux-app/Cargo.toml": "ddaca3b3a1331f21d1c5a4722e5a1a7ee820a5410986e92d93900bf712a86681",
+    "third-party/nsh/crates/nsh-linux-app/src/lib.rs": "5dcf92576d3b3bcf653f8f5872f780cda7305d84b3e90f0cbc6f2992b15086b0",
+    "third-party/nsh/crates/nsh-linux-app/src/main.rs": "bfa789f9a165831066b8d48dadea6d228cc733717b939d4d632ceccebc4a863e",
+    "third-party/nsh/crates/nsh-linux-host/Cargo.toml": "3005ebfa91edf228adfb8f1b3eb02d91afbb1a44e45108c6fb1e157c48091846",
+    "third-party/nsh/crates/nsh-linux-host/src/lib.rs": "03bc4869f2770f7c3c6bfe4a66009d4e9228d48bf3b4a2c376c9c458d41dc345",
+    "third-party/nsh/crates/nsh-linux-host/src/main.rs": "e3697feb14547186e5962b50df09d53017b8f7d5ec3294a254033919d1592b98",
+    "third-party/nsh/crates/nsh-macos-app/Cargo.toml": "47a7be9e9438f3bc4f4273fd1c6cf09def939c3f24b4fc4ea7d14e488ae54aad",
+    "third-party/nsh/crates/nsh-macos-app/src/lib.rs": "8dd3ca8157841648860d0a827dc3bae0cb8b739d403fd12eafe12f3e258b9923",
+    "third-party/nsh/crates/nsh-macos-app/src/main.rs": "e28b5f9cf85dab098348a037eb38055091eb8c1a29aebb922e1461e661a07807",
+    "third-party/nsh/crates/nsh-macos-host/Cargo.toml": "613ba75342e264f10b6f931da22ca6092b9ce41e85b26c7e6f9219318ca65923",
+    "third-party/nsh/crates/nsh-macos-host/src/lib.rs": "fcfe91af65f5cbb2afb16e47b7545fbff01bf05b7bfa933e93aa849a9b4a5430",
+    "third-party/nsh/crates/nsh-macos-host/src/main.rs": "81be01e39606c6ffed203ce44e4e5fc2f8a19f320736109b394894272b204363",
+    "third-party/nsh/crates/nsh-macros/Cargo.toml": "a61e435297cb0a1f9948564f43989fed0d04cb1909e73914f6381508a17e3551",
+    "third-party/nsh/crates/nsh-macros/src/assets.rs": "3bdbea71df2971a110619ae01340b665f078a6595157f16517d3911b6a2ab5e8",
+    "third-party/nsh/crates/nsh-macros/src/class.rs": "b2d92dc6f83f0715cbcdc0f197c1b244143cd23d983f8f9432e03cecb7655d6d",
+    "third-party/nsh/crates/nsh-macros/src/host_props.rs": "2d1df7e31954c69cd0bdf09797b8dde35258a7d63821ecfb4da2ebe03a11df51",
+    "third-party/nsh/crates/nsh-macros/src/js_ops.rs": "55d84e721ae03cdc08efbd7223929d9f615c615b46403f6dcb88a32b76d68f94",
+    "third-party/nsh/crates/nsh-macros/src/lib.rs": "bad1fcdf3a5c1412fbbb6d65509686a9c44cdd56d92d04a47316834844cc145f",
+    "third-party/nsh/crates/nsh-macros/src/native_module.rs": "0ce37bccd9668da0ca3c3d74ac0682ead536054caa48fd45dbe581f1423461d2",
+    "third-party/nsh/crates/nsh-package/Cargo.toml": "1402055fce9ba79d288b562e2558626cce216deb3214ecafbf140485ca02ba05",
+    "third-party/nsh/crates/nsh-package/src/keys.rs": "8c4e4c213f53b61815bc5b852deb3b0ffab2a6d83f72d3507b047b20de5d76b8",
+    "third-party/nsh/crates/nsh-package/src/lib.rs": "7606bebb08c0bded357ede874ecab5e169fb0c34d7d8a669c423ca78eda06484",
+    "third-party/nsh/crates/nsh-package/src/package.rs": "b52867707a2813cf5adf4643f5bbb7fdf34b5e40559f044f942caf5363bc6446",
+    "third-party/nsh/crates/nsh-package/src/trust.rs": "47257a1d9b5d81a77eaa2093f1abb0cfe9c54df2e26f557002326b386047a355",
+    "third-party/nsh/crates/nsh-package/tests/trust.rs": "48097e716736cb2726e36c1d6913953bdd6a9b6613f39f061e352f3263423356",
+    "third-party/nsh/crates/nsh-platform-android/Cargo.toml": "13c8aabee1f34bae9dba9ca80c6fb7602547c8b7f685d279729129258a2654fd",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/A11y.java": "9889c8d013a46caf26a2156d226dfcb50d6aa65bd5e7a5386e460be7dd6eb982",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/AppActivity.java": "e017ccf0f5ffd3c781239be6b61161231c22db761dcf8bc9dba833f4f19bc0f8",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/BackCallbacks.java": "ec97d83a492e6c191e28bf890624b291e835ebbdfaf1f5c6ac071e5c56363384",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/Backdrop.java": "7e896b364e0caba7e6e6154466a3b3b9ffb32e4998252cbb7c137d5c64111d7d",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/Blur.java": "15df052732317b00c8f873e53a041a2e079296f9fb8842e00af77958ae6c7d5b",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/Box.java": "1dee5cce78a13544ff9359055e50e02be9a04b0b81be2b1797eb1b5f9132cfd4",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/CanvasBox.java": "82764b294511a7cea7248414202ba12688439430a645f8a74c5486057b84865e",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/ComponentBox.java": "f733afa5c86998cb40f26a9f2b7e96a2edd2b4c4235092fdacad71f716ef3515",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/Decor.java": "289ac6a3ea0ab8bb906959d6c602e5ed22209f6098c70498deaa3dd41febbcf4",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/DevActivity.java": "cd05c7f60dca93f8a18d9f1f92276662822aa3cd351246b773f301b7171007d2",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/Effects.java": "cfbfe53cbef6c9feaa71d208b93dc350343fad127da26921b312f8fdb0fbd9b2",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/ImageBox.java": "65f575393de7ed59327eb9d1b516972451f74167346d69475924fb6561548f71",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/Images.java": "db1260cb373f03c467d6f6d6ebf27a30530f6efa7525dc01c1c375e1db4d91c9",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/InputBox.java": "9f2dd15c42b727e5b2fe5da72b12b822a94e42f5acd60912e8bba36aedc5aa5c",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/Json.java": "80d814fa3a0357463394fb0d84d98ec02687abd42b2d3521037db2e1ad20db27",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/ModalHost.java": "a40b13eadf1061ae52d9ef92ea55352d836af64e0d846a48a3e9856c56a4ef79",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/Mounter.java": "6ae84283cfb51b9976a3c1c59550e826c13add4c0c7f00ae4ed59b85dea69465",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/Native.java": "b97b3c79261f9362e07c70cf73c288fe27ea20e7a5f66e9a48a6bf4a8e1017a3",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/Net.java": "891adea10cb4f8cf0020ed3854eac241572b00b32506e129987715db2a183149",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/Node.java": "d16e8e7d2375e3633c3cff5edeba08cf38d08726801f67721b12ba51bcce4e5c",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/NshComponent.java": "70005073c746cc06ea2421a788443abd20447dacbdbe62a9cd4e8b2cbb4b3011",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/NshComponentContext.java": "2c1a1fcb84cb5c9742ff2a51021be1c304a8dd7db5e1841a6078bc3a0fab0d97",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/NshPackage.java": "8f15ba9b542631a20ff0edba6c2a159ff547fe713ea98e1a160e8b52c0c76474",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/NshTrust.java": "9a9027f5eab16e5f54641c72914b319c53e0de2f2502a1baaf3eec941f2ea527",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/NshView.java": "f9e25b8234d2786c8bb13073f02b958b7739d8a38db4f5c122450e2b4a29ebb6",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/Pressable.java": "5bb17da3a0e1fd7519d34498752183f4e86fdc6e8d17102cd2e5a31fb3bdf98d",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/ScrollBox.java": "9fa43f2b9a68c711fbafde8e7c7eda2ac44782838288b1e6ca42c05472d6f9d3",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/SelectionArea.java": "376a3abe901a71c03ca95edd4189a7fce1b3c620b5b4830b269ff68c99de213e",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/SelectionHandle.java": "5c0ad0957390540d21c4b9e351c343a2c7f0532934f6ed54b8cb621102d169a8",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/StackBox.java": "f712333f289b2eba41611a7ef36b677d1f12a7850d69a9fa389e77959ec5eb1c",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/SystemUi.java": "6001517437d9828a2b5cf65f9b4c7bea96380decf5f5f02c81de4991934dc208",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/TestAgent.java": "aebaf9af4985c6502a043f4dad054b0453b84cc4a2f772a031ae00a653c917cf",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/TextBox.java": "6ad8195352f29338e96c144985a4797a8894e3b0fcbf473bf7a1ea297c3ec5a5",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/TextLayouts.java": "bc02e66bdb1408a904d3c799f2d228487742cfa7ceb9fe24391c80fb4e368c42",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/TouchTracker.java": "29d218455c922e29bf69e58d48cc797637e5030c768dfb846e6cb7969cc99621",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/VideoBox.java": "2e7c5fed70f1227353f2f6363dcd6c4fa4d5f277a2739515fe13bba2f675e3f7",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/WebBox.java": "5f49a4b3748f8df0180ec45cb3b3c296694ca0ba3fdf2c7d117cb4e021b39965",
+    "third-party/nsh/crates/nsh-platform-android/java/com/longbridge/nsh/WidgetBox.java": "51340bdf442b737f2271e091ec2114e0550b005e8a5eba02ad0947c53c574120",
+    "third-party/nsh/crates/nsh-platform-android/src/agent.rs": "7ef85fa373ab3d4516afa3b9b6fc221de133edd12d092366d0ec37a372f3e6b5",
+    "third-party/nsh/crates/nsh-platform-android/src/animation.rs": "c1fef8de76e942b48c05e108723effc49ed4a57cbe726d9b73037b77e6704a26",
+    "third-party/nsh/crates/nsh-platform-android/src/dev.rs": "fc60e6257001b3e5c27802d4320e138bebf21f66a561928297a68bbc5de0d5da",
+    "third-party/nsh/crates/nsh-platform-android/src/encode.rs": "1f7b9bb75a90b6c882577af186dd72c41b342f358262f3453100187a07f4b115",
+    "third-party/nsh/crates/nsh-platform-android/src/host.rs": "15101195191e4d8b60fcb04f0a7ae1b02f488dd368c216908256f89151c60b3f",
+    "third-party/nsh/crates/nsh-platform-android/src/java.rs": "342ea89f068da2261731704ba4cc3628835a1c06f5b8db07e071abcac8d4ef3f",
+    "third-party/nsh/crates/nsh-platform-android/src/lib.rs": "f7dd6f6e125ff9a6c488fb9322cea08da0fa84a234e7e03a9e251007b874a352",
+    "third-party/nsh/crates/nsh-platform-android/src/logger.rs": "7fe95c849533e54aa753757090b5747c1131e0523f2f5b24f260fb77bd0aa2f8",
+    "third-party/nsh/crates/nsh-platform-android/src/net.rs": "e51b9e715af5652a6d0697beaa707d021935128c06751010e773c0bda9baaa49",
+    "third-party/nsh/crates/nsh-platform-android/src/package.rs": "f69038eb79ac0e6885cf831fce67572e4b068fb164c21ff64abd40c82ef56fa0",
+    "third-party/nsh/crates/nsh-platform-android/src/selection_area.rs": "f9a88a5300c6162d90abd1426d9415bdf11ca088446e8f502bfe30a79a3b4e15",
+    "third-party/nsh/crates/nsh-platform-android/src/svg.rs": "72b340449f499586ea54382159c7ea951bf6a96bf6a1ea0b15011e899e6e4f24",
+    "third-party/nsh/crates/nsh-platform-android/src/text.rs": "5ca4425a2ab7a7030667c0b012ba3c85b3a126f3f015fafa785c5343cc3b6b8a",
+    "third-party/nsh/crates/nsh-platform-ios/Cargo.toml": "0fe3eabb15eceffb19a896318ce623e6f0752da8b8abb174dfd517162c5dd3c6",
+    "third-party/nsh/crates/nsh-platform-ios/include/module.modulemap": "687c700460603d8f9ca214ff058f91d0d6edc9e3a7350d981015c73872e5cea1",
+    "third-party/nsh/crates/nsh-platform-ios/include/nsh.h": "b8505a1f2a0cb882be5dc798d475249b7bb2ae2850cf5575137a8c9e1c5d174f",
+    "third-party/nsh/crates/nsh-platform-ios/src/agent.rs": "adb7c1b931ad01ccdb88dd42aa6ba9f27e407d7dbbecb34181ef4f4e5ee1e45a",
+    "third-party/nsh/crates/nsh-platform-ios/src/animation.rs": "662ffef6013aa336d05648576e149e7736a35c059ab549cc50f26cbfd75f966f",
+    "third-party/nsh/crates/nsh-platform-ios/src/app.rs": "b307e39e915d38961129c41a5a5c3858198a38b2f9e0e28655d2c020658e513d",
+    "third-party/nsh/crates/nsh-platform-ios/src/blur.rs": "04af7f839f5e5a9d7005638c836b748c2364c804e45174a22d8c8a1e3d7945d1",
+    "third-party/nsh/crates/nsh-platform-ios/src/canvas.rs": "ec7d01bc7ad24798e382b092d41423f45ceb1a09f509d97db492e4d4d1e64c5a",
+    "third-party/nsh/crates/nsh-platform-ios/src/component.rs": "b53803ac0876795ea7b574dab2cfa771c18f30360ebcb2ad2989d716d52e9e66",
+    "third-party/nsh/crates/nsh-platform-ios/src/decor.rs": "bf54501f9a913cd17d03eea457fa3e20a90a765ff7171208bbee11136e5c7249",
+    "third-party/nsh/crates/nsh-platform-ios/src/dev.rs": "6a4d83df5efd1b0690558d817a37d2404459f855c389e7103463e06dc08e46c3",
+    "third-party/nsh/crates/nsh-platform-ios/src/embed.rs": "3e9aa5fbcc4996305604aeee1a90863303e09405864968506205034fadddc64d",
+    "third-party/nsh/crates/nsh-platform-ios/src/image.rs": "67dab1f77c0809b63ffb798989f51b595b0663d3ef1bd3f6ffa93cc2dc982b34",
+    "third-party/nsh/crates/nsh-platform-ios/src/input.rs": "5d6f6d43a3d011c8a513f9208590789408f31b0eed2067845d6ccbd7851712b2",
+    "third-party/nsh/crates/nsh-platform-ios/src/interaction.rs": "10b85e580a1c507a884d62c222c3f0b115ff82eac0f38e944954e17f9219d0ec",
+    "third-party/nsh/crates/nsh-platform-ios/src/lib.rs": "25c0ad2a5615c46eca35d5420d02c3e24d869b092533023569d5599c5a32f6a9",
+    "third-party/nsh/crates/nsh-platform-ios/src/mount.rs": "8c85c83c95e1e3eb9a29b79ea49820ec37b11955ee4998175d6c293b102eace2",
+    "third-party/nsh/crates/nsh-platform-ios/src/native_view.rs": "e73867cf00a330e184a6be6830d7b25894db62c1149e85fbe97b316f374831e6",
+    "third-party/nsh/crates/nsh-platform-ios/src/navigation.rs": "f881a30c8db5b5b01d360b1c497547dd1cbaa228ecfee7c55ccccece87d2a3bb",
+    "third-party/nsh/crates/nsh-platform-ios/src/net.rs": "289365dc5d62b09d9a2da14fc1bcc041cf37f6fed409db24916be830ac850760",
+    "third-party/nsh/crates/nsh-platform-ios/src/press.rs": "3a68966f15bb361d8eba789b9a3cce2b4877c7fa9a7e8aca4f9868e2faeb2536",
+    "third-party/nsh/crates/nsh-platform-ios/src/selection_area.rs": "d492cfabf02baaeac68898eaf8a231141f635c5875d8336a401414346edbdfc8",
+    "third-party/nsh/crates/nsh-platform-ios/src/surface.rs": "554efab1eafd60337541b6fca2278807c182ab525533169717ab33f2fbeb8efa",
+    "third-party/nsh/crates/nsh-platform-ios/src/synth.rs": "db7aef0e5815132a49d334f2f3bc5324ffe00a3913825672af87936854321c8b",
+    "third-party/nsh/crates/nsh-platform-ios/src/system.rs": "3c96018a1a03e54ccad60d4b3cdb3848d4a687864e865558c257ff4a4e4abd2f",
+    "third-party/nsh/crates/nsh-platform-ios/src/target.rs": "994f0a282f57b553a1c392b191a2853dbd50b453b7155fa4e13d7c771e810545",
+    "third-party/nsh/crates/nsh-platform-ios/src/text.rs": "142376f7efed62e4d4c2ed8059d7ab0642356ce95d32db4767cb4f756905377c",
+    "third-party/nsh/crates/nsh-platform-ios/src/text_selection.rs": "cd68c073fed1d2baed7121fd72d2e703e7c14e5b9963fbc4f75098f38a00b6b2",
+    "third-party/nsh/crates/nsh-platform-ios/src/text_view.rs": "b7bd9d38bab972227360ba7bee4050d895283e406de2bc5e153f29dcf2465d1b",
+    "third-party/nsh/crates/nsh-platform-ios/src/touch.rs": "cb910d75ca29435063749c0620df765b116f739e19d79889497572a5c9461f42",
+    "third-party/nsh/crates/nsh-platform-ios/src/video.rs": "aad3d01262fc4520b9523eabff0a68fa6373c71433f0331bf6200e69b6907bf1",
+    "third-party/nsh/crates/nsh-platform-ios/src/view.rs": "042e66b4200c4713809decb8bc0833d15dfffd6b8a2f0f77581732463b2f071a",
+    "third-party/nsh/crates/nsh-platform-ios/src/visual.rs": "dc968d6bbfa977b5791ae1f9cf3d859d3aef5567799f02ac3588b3f280744480",
+    "third-party/nsh/crates/nsh-platform-ios/src/web.rs": "2bf4ec4a10212c735585347f72175af0e784b7fe50b7e44037093c48e56c2844",
+    "third-party/nsh/crates/nsh-platform-ios/src/zoom.rs": "274010fd16832c2c93bde502c2c1d6ad308d59e594cdf859d28d87b5ec6ab865",
+    "third-party/nsh/crates/nsh-platform-ios/swift/NativeShell.swift": "052e146f7bc8c99509f459fd908efa4718ce1e9a0dc5a9c0948786598d162df7",
+    "third-party/nsh/crates/nsh-platform-linux/Cargo.toml": "2ea41863aacd26d6bd568126f0c6f089f682555b4adc8fac5e2a7bd49dde007c",
+    "third-party/nsh/crates/nsh-platform-linux/src/access.rs": "9b9aa4d728b4451dfd80e0c3306deca2d7abf1308bb3acc3c2f0957257ed06b0",
+    "third-party/nsh/crates/nsh-platform-linux/src/agent.rs": "433d0a4d9b12c7373a2941d255c5f65103a34639d27b9c60caf9e6799c3c23d8",
+    "third-party/nsh/crates/nsh-platform-linux/src/animation.rs": "7fc1b4f7ec5b1f2010216bfbe8f4a773b7ac08549b326d439e266f0188be514b",
+    "third-party/nsh/crates/nsh-platform-linux/src/app.rs": "bdc83b899efa9d5aed4ede07303e7ef82803b0ce7b4648f4fa6e0c5edc2b3e52",
+    "third-party/nsh/crates/nsh-platform-linux/src/canvas.rs": "555850bb5a9cb0b9f09438ce360f460fb9f2144c4701001ba0bfd7dd91726dfe",
+    "third-party/nsh/crates/nsh-platform-linux/src/chrome.rs": "b0b1ba6b3e5280a5ede9afe7cc629738c1f99b3f57af3a5864c41ca5038e309e",
+    "third-party/nsh/crates/nsh-platform-linux/src/decor.rs": "9250081c55b8248278ccdcc8971184d6bfb820f2e6893d407ab76e84c21f37c1",
+    "third-party/nsh/crates/nsh-platform-linux/src/dev.rs": "2fdda144529216c24ac96b3c9357c03dc8802315dd4e198d59458ff571d074be",
+    "third-party/nsh/crates/nsh-platform-linux/src/file_drop.rs": "b42601b46176f5669390b3155bab51ec3433636d5c687d21dab47422bbd2d56d",
+    "third-party/nsh/crates/nsh-platform-linux/src/image.rs": "c76d28c097503213c69573184a6c9e9beff7f7b377232e8020d89370d780f3fe",
+    "third-party/nsh/crates/nsh-platform-linux/src/input.rs": "0f4a1404a3ab32f3a993b9d77a517159c6412754495868c8eda1130c36ff83d4",
+    "third-party/nsh/crates/nsh-platform-linux/src/keymap.rs": "f3719f92fd9c9241fd2e327fdc90cc4de0bba59ae2c26e6b77f451fa2b913b95",
+    "third-party/nsh/crates/nsh-platform-linux/src/lib.rs": "1aaa32827f67a6972a7ca427e5b786fbeca3be2334150ed64f16b32dbc04d73c",
+    "third-party/nsh/crates/nsh-platform-linux/src/mount.rs": "e710109b19b0dcf28f538a6e6ccc78606f237e0eb1519e32757b06adb387dc6a",
+    "third-party/nsh/crates/nsh-platform-linux/src/native.rs": "64d57fc40d20b47e70c2b210771a1b3067a51d3985c362b0678a64ab724f65c2",
+    "third-party/nsh/crates/nsh-platform-linux/src/native/web.rs": "0a2002679796e48aaf90ffb0d562e190c98bb015dbc62b9199017e98e77c33b7",
+    "third-party/nsh/crates/nsh-platform-linux/src/navigation.rs": "77be5eef778948105eeea4d91306fbd70f2afede4d43d5432bff377db6b49d93",
+    "third-party/nsh/crates/nsh-platform-linux/src/scroll.rs": "fb7b5cf5843a20d67f1a0550bbb53a1ac807684660ae691367d9bcbef2894310",
+    "third-party/nsh/crates/nsh-platform-linux/src/selection_area.rs": "f38e30a766c3d7f52954c6b0c8aca3a52dbdee94c90c4ad6f21b0b6aff66ea4d",
+    "third-party/nsh/crates/nsh-platform-linux/src/surface.rs": "3182b74b110d3a684fad43616c7542bc61e6bd0017a2932fe974f101045833cd",
+    "third-party/nsh/crates/nsh-platform-linux/src/synth.rs": "ca932e93904d5b3b734a874be5337c2f6eeeea72c35e4c5bf57c04d864c30df2",
+    "third-party/nsh/crates/nsh-platform-linux/src/system.rs": "fea65629cfbcf37eb050fdf9bb9f736e092af0375bfa8dd4f6ea425390f378be",
+    "third-party/nsh/crates/nsh-platform-linux/src/text.rs": "87d1b461b411da98a59e120e13290cc41d665bbd9c7eeb65d62db58c81fcc6ff",
+    "third-party/nsh/crates/nsh-platform-linux/src/text_input.rs": "222a068e401209de8a9953d3fe25d07499ec8db7f4d290489665d51c85d8c29f",
+    "third-party/nsh/crates/nsh-platform-linux/src/transition.rs": "c4958368e3895f768db2e3d8fa2d6bbb67263c25f2f91fdcf710edf8361debdc",
+    "third-party/nsh/crates/nsh-platform-linux/src/view.rs": "22d8daa08a0003f69943b18fb55a3600246104ef327b8d6336ec8d2d4ae11a8b",
+    "third-party/nsh/crates/nsh-platform-macos/Cargo.toml": "7512104eafbccf021a8806c245d452eda969a09d7fb7a619a640ce3d0721c0a1",
+    "third-party/nsh/crates/nsh-platform-macos/src/access.rs": "5bafcc7cb9aa39c5d931f5c0fa5fef547b3d32ee6bcb1b38212cd7f1915c0b25",
+    "third-party/nsh/crates/nsh-platform-macos/src/agent.rs": "db50231031040a91216b29a9b41b6a936016d6ff2d1c8cac2399dc08d8f9b6e7",
+    "third-party/nsh/crates/nsh-platform-macos/src/animation.rs": "2458ba49973e39a739ad031482ef4c158a29e80c69413cf06bc615add190ad29",
+    "third-party/nsh/crates/nsh-platform-macos/src/app.rs": "c1562689dc7c467a0e763a39b874babfebd92b0201b6709ce7c3dadc08af60c3",
+    "third-party/nsh/crates/nsh-platform-macos/src/blur.rs": "04af7f839f5e5a9d7005638c836b748c2364c804e45174a22d8c8a1e3d7945d1",
+    "third-party/nsh/crates/nsh-platform-macos/src/canvas.rs": "6134e252a2751484fb7a6db63f9c5ed95364126f38f988fc016a846de3a54963",
+    "third-party/nsh/crates/nsh-platform-macos/src/chrome.rs": "83129a8a83998c110487f496c04ad9c5e8363c6d6ea6f64666789ac13d1fbb6c",
+    "third-party/nsh/crates/nsh-platform-macos/src/decor.rs": "f32418bc52317ab6000ef9abb6c9ce6a287ba5bc362ffbde9049e41a29061c83",
+    "third-party/nsh/crates/nsh-platform-macos/src/dev.rs": "c985b558d791963b13a83f8dbc5a48395dc1ae105b23abb7637f29d81975f5ed",
+    "third-party/nsh/crates/nsh-platform-macos/src/file_drop.rs": "8cba8f09ee79b5902baa8c1b8b1a7f24d48604ba1eee477421656bffdfd65834",
+    "third-party/nsh/crates/nsh-platform-macos/src/fps.rs": "4fd29f7f2b855d942e65725afb9ecbc5cc4748c133467ab75af02442d59ef914",
+    "third-party/nsh/crates/nsh-platform-macos/src/gpu.rs": "46e103515db651c57316c351d7345dbc812f513c28d5d0e0489aaf2d8c59d599",
+    "third-party/nsh/crates/nsh-platform-macos/src/image.rs": "b786bc2de5953c846dca8238004dfe9ecd692b5dae31cdcd4c549b873bb7f6e1",
+    "third-party/nsh/crates/nsh-platform-macos/src/input.rs": "cf60e299c8d2f1ede22cf97c4cdc9b544e1e39729133972bb10fdd8ec36c93dc",
+    "third-party/nsh/crates/nsh-platform-macos/src/keymap.rs": "2f3e4e6d04186726682fc2f2e28072aa87a3f5bacfd6f3b401a557bbd0a08e02",
+    "third-party/nsh/crates/nsh-platform-macos/src/lib.rs": "bde79eb835e1319fc8b4bd324ef7b35c90a8800d1e6ae8d789fb486606233bb3",
+    "third-party/nsh/crates/nsh-platform-macos/src/mount.rs": "a01d8fa6137192a5d49a5ead055d2aa45f945128ddbbf66e8ad3fb0130d76542",
+    "third-party/nsh/crates/nsh-platform-macos/src/native.rs": "fcd93dea237d95f3defe9bea87744cfd491b19b880de3888f970b7cf73e88f2e",
+    "third-party/nsh/crates/nsh-platform-macos/src/navigation.rs": "318cf562cc15dd88ffccfe854e4baa8aa91d61619092b85c6bf133b83a738f0a",
+    "third-party/nsh/crates/nsh-platform-macos/src/net.rs": "289365dc5d62b09d9a2da14fc1bcc041cf37f6fed409db24916be830ac850760",
+    "third-party/nsh/crates/nsh-platform-macos/src/scroll.rs": "824c167ffa1e9b6cfee91ab7aa1504b557da5c71003b18f736ab96f0872e1bdc",
+    "third-party/nsh/crates/nsh-platform-macos/src/selection_area.rs": "0425f31d882802bdee2f7bc2275dfcffa8274f194c2fe2a5a096efc8b91df4e6",
+    "third-party/nsh/crates/nsh-platform-macos/src/surface.rs": "3068eae4156da32035457523a212c0f03a40096043d6972ca6bcd97fd79fbbca",
+    "third-party/nsh/crates/nsh-platform-macos/src/synth.rs": "c6510dcd66cb600e382e74d2d86352196188303bd86a85f12afb21213cf51776",
+    "third-party/nsh/crates/nsh-platform-macos/src/system.rs": "1e7be08090cecf5741c52799b7770a0b0dc82ffe78a752abee8ff98f2321577f",
+    "third-party/nsh/crates/nsh-platform-macos/src/text.rs": "ff5de5d8db0099f156a8dd643f7d85a804325f78bb9d3b7ea965e36c97fbaabf",
+    "third-party/nsh/crates/nsh-platform-macos/src/text_input.rs": "55ff0cfd0c1dc181ac3c20f02343250023c16ccc667874735bb8743fe367573f",
+    "third-party/nsh/crates/nsh-platform-macos/src/transition.rs": "3beb287758fab9eff7f1d298b229542b43fda013bf5578812ebd06595e6eec43",
+    "third-party/nsh/crates/nsh-platform-macos/src/view.rs": "f8e2046cfc88638430674566a71e32a6195d12c6d3748741b2b9c40dfa0535ec",
+    "third-party/nsh/crates/nsh-platform-macos/src/visual.rs": "87b87844da3d1d269c1f21d53c7c7d2cd1dbc3a6d14e80daf1db0dae72032c39",
+    "third-party/nsh/crates/nsh-platform-tui/Cargo.toml": "8757c1cfc5b97419ea8ac3d7502493c123cace9fe61d5998ebd7f7d6d9926e11",
+    "third-party/nsh/crates/nsh-platform-tui/src/app.rs": "aedfa72f03d47e480ab193f312d30ee1739655b66c9ff1c6a742b45e51d3793d",
+    "third-party/nsh/crates/nsh-platform-tui/src/canvas.rs": "f03e24bb5963be16d17d80215f1d54a3e2350a5a75bb1391c945ead828736ad2",
+    "third-party/nsh/crates/nsh-platform-tui/src/composite.rs": "9a055c1cee5139494a9ffa84eacb588c3a963bfd488301220654abd599cf80c6",
+    "third-party/nsh/crates/nsh-platform-tui/src/composite/blend.rs": "06e3c62e9da9f5a7d58426522545950d1a4214c697ac5112876f3cf49d60cc96",
+    "third-party/nsh/crates/nsh-platform-tui/src/composite/effects.rs": "53a54345eb4eff289f94c2f765ec2a765a4eec06291f54323918898d20ed0268",
+    "third-party/nsh/crates/nsh-platform-tui/src/editor.rs": "a0899c20cbb964af46dd5383e1cc0dd3518a2a1a04d6071409ef8bfb43398f72",
+    "third-party/nsh/crates/nsh-platform-tui/src/fonts.rs": "7c3f13e0d71c127d4257285ab8bd07c5e6d073dfa73babc95825ea284864b06b",
+    "third-party/nsh/crates/nsh-platform-tui/src/geometry.rs": "33bc24359cfd376e9c276031246269349a9badbe78e2984e6d24c08a697f698a",
+    "third-party/nsh/crates/nsh-platform-tui/src/image.rs": "267e0bc3ea5e3fcf90c0836b1e1b0d53ac431971f4c9a42bec600d52dfcfc367",
+    "third-party/nsh/crates/nsh-platform-tui/src/image_state.rs": "d1aa073787dfbd91ce75a7b540a010ed3b9b53b87067db1bc8f8e876d8e84c96",
+    "third-party/nsh/crates/nsh-platform-tui/src/input.rs": "1dbd642f72f67be5757a9281540303ea182afa034a677cda0bb30bfb7cec9a25",
+    "third-party/nsh/crates/nsh-platform-tui/src/lib.rs": "0823dde5eb292c832e87aa9530f9792d5078a4ddb286e78080811c782c9d35a4",
+    "third-party/nsh/crates/nsh-platform-tui/src/media.rs": "f22b37f75d7f15063a2d755c51a9cc8425db8b22bcb49d011d368d97bbacdf13",
+    "third-party/nsh/crates/nsh-platform-tui/src/metrics.rs": "7ee9cb4f47a068dc9e7873d337138bedcf1b31b205a60df792a94bc5ac04f62c",
+    "third-party/nsh/crates/nsh-platform-tui/src/motion.rs": "5b1be5ba53d357405ce123315948d61a926ba1eafe0555086072e50c8309a812",
+    "third-party/nsh/crates/nsh-platform-tui/src/native.rs": "b61d5dbea53853db31e1f5f5e2ab2f70f367058b5961384c4245fb0a0e06da34",
+    "third-party/nsh/crates/nsh-platform-tui/src/navigation.rs": "0c4cd063db7aea9cf8dc42c4ed09973aa4795ad66a192a6cb70a3d5a72288b85",
+    "third-party/nsh/crates/nsh-platform-tui/src/net.rs": "3f8ceb2576dc990ce334adec231bbf8a03410c4058c2b8253e368f751538c133",
+    "third-party/nsh/crates/nsh-platform-tui/src/protocol.rs": "ce736d1a6260f8dedc8b39b264f43f07231c68623a647db016d2b03012b9d11e",
+    "third-party/nsh/crates/nsh-platform-tui/src/render.rs": "db80aae3a0e2b2c8d3365870c11b3d864d58bfd1c664b696d7fa254f492ec357",
+    "third-party/nsh/crates/nsh-platform-tui/src/script.rs": "a0fb944fabd26af711306bdee37342b13fdba26c5066e5752e180e4e916d09a6",
+    "third-party/nsh/crates/nsh-platform-tui/src/scroll.rs": "3a5f2de17609b5e93aecaf3ba89a403c35dc4046d2814106a40c0c00a31caaea",
+    "third-party/nsh/crates/nsh-platform-tui/src/services.rs": "e871114faa1c56ae24ab047ff2da7ae5df4a728cff17797c8bb5e3009904ec1a",
+    "third-party/nsh/crates/nsh-platform-tui/src/surface.rs": "db4cfb9f6bb0cbff8fdb346b0810762a7975a7b1d8d82f0529c2268c6a55abc5",
+    "third-party/nsh/crates/nsh-platform-tui/src/text.rs": "c1e2a055250529ed1cc2888cfe444e306e1ea13c62b3e52f36f1afc1586f5ee1",
+    "third-party/nsh/crates/nsh-platform-tui/src/worker.rs": "0eef61c1cc330015df84793e604d984af732f10fb14e1520c7f989253d354bb5",
+    "third-party/nsh/crates/nsh-platform-web/Cargo.toml": "d49263fc6c477f87e42e5e6c8852c792bf79068c411b40c98055f6415b616167",
+    "third-party/nsh/crates/nsh-platform-web/build.rs": "6e60cd4d9737c2766e2631ff775410cc0aca1fc53d8463356ccce49f3a11f803",
+    "third-party/nsh/crates/nsh-platform-web/src/animation.rs": "b19491130e0b1009a483abccfd0a335684973072137c8e14d500827f7acf65b0",
+    "third-party/nsh/crates/nsh-platform-web/src/canvas.rs": "9fc4c10800eaa2b69ae34903fbc8aa0a3e4a65e53b8151d3390ee883bd8cb4b9",
+    "third-party/nsh/crates/nsh-platform-web/src/encode.rs": "b776129aee4d45596a5d6c1a6c2631a055e6aceb2a8161a96e96dd870a3c8a30",
+    "third-party/nsh/crates/nsh-platform-web/src/ffi.rs": "1ef25ae33cc562695438e574d7fead4a8b9d1536ce9ed78e8619d73c4c616d23",
+    "third-party/nsh/crates/nsh-platform-web/src/filesystem.rs": "34cb25848b20fe11967437368e5f5feda3f1297982232eb54aa27ab2611cfccb",
+    "third-party/nsh/crates/nsh-platform-web/src/lib.rs": "4470f61a9480768ceea2654edc371997e558cdd6ca2001e1696deca8480dc778",
+    "third-party/nsh/crates/nsh-platform-web/src/local_time.rs": "63f2781b1a5364c3914bbefb1bf0538d77876a1324a2e7a9548231711b8241f4",
+    "third-party/nsh/crates/nsh-platform-web/src/net.rs": "6ad23669ffb7f920da1d4c0acd9cdf6bf6a1b8f33317dfd27eb40ce0b133fe9e",
+    "third-party/nsh/crates/nsh-platform-web/src/storage.rs": "fdff261938b0d75b6b1ff633b4788cc386de23aede2b563fb226508042a3c27a",
+    "third-party/nsh/crates/nsh-platform-web/src/text.rs": "611942f9a7265460339fa298dbe798e25fc1bfe424ead8190be8ab2e5950f39a",
+    "third-party/nsh/crates/nsh-platform-web/src/websocket.rs": "4dcbc4ae65c9d8d8833eca7e2117be425241f28ff17cd2e15dba32b7f6a0fdbc",
+    "third-party/nsh/crates/nsh-platform-web/web/index.html": "314dfa65fd6ac02b15f22a22ec00432dd350953f97c1cd1b568aaa966313ffbb",
+    "third-party/nsh/crates/nsh-platform-web/web/local-time.test.mjs": "e8b62dde3208d979eeb281bad19fcb7c19566732500e969ab2ae5c4cf373c9b2",
+    "third-party/nsh/crates/nsh-platform-web/web/mouse-browser.test.mjs": "8f3e5d180558a4d4553d01be86dd080ae80638734c83095d90b5507e2ee65420",
+    "third-party/nsh/crates/nsh-platform-web/web/mouse.test.mjs": "b6db2b6bb88c0e5b13bab082027c0d84162156350e1c86bde91cbf1f98f63644",
+    "third-party/nsh/crates/nsh-platform-web/web/nsh.js": "55bfc70c093b86520a668cb46db9082265fa534b2965363f7c782787f2157cf0",
+    "third-party/nsh/crates/nsh-platform-web/web/scroll-browser.test.mjs": "3f8150ebd2b69d7ab306307868b938b99435308ff37c2c999cf297a0f94fd30d",
+    "third-party/nsh/crates/nsh-platform-web/web/scroll.test.mjs": "4ea1e845ddd2e480a284caef06f2fcb4dd26f85d0d0808ac8216977cfaff0b30",
+    "third-party/nsh/crates/nsh-platform-windows/Cargo.toml": "ca891951f7e5d38889c956e0f00aacffa11da045ed4bb849065c781950c75d9f",
+    "third-party/nsh/crates/nsh-platform-windows/src/access.rs": "47b9fa41f47293270dfe1100c4d3c796473abc9e032eda1940ff3d7a2609c57e",
+    "third-party/nsh/crates/nsh-platform-windows/src/access/uia.rs": "9b37dace78dd3ec658728ff71c73b61d79da7e7852dbaa573a8588d02769ea9c",
+    "third-party/nsh/crates/nsh-platform-windows/src/agent.rs": "a4094f8b42c1096461dd13e2b6145fd497f2dfbf7b171ad35cda3d349ce45e99",
+    "third-party/nsh/crates/nsh-platform-windows/src/animation.rs": "5e849ee6e81ef77bfcd70e255228431f3ea2b67266530a10d962582541b78c29",
+    "third-party/nsh/crates/nsh-platform-windows/src/app.rs": "5f98ffac0f08e7dfc58d21f90cf6d4f7e5f4a346b4456cfe47b76d99c6899ff6",
+    "third-party/nsh/crates/nsh-platform-windows/src/canvas.rs": "ada51da124bade5308b0dbdc3301b5001c0ae0963ec47164800b316174c21f17",
+    "third-party/nsh/crates/nsh-platform-windows/src/chrome.rs": "1d7cddfb2cbcb9e6fd0c02e4ff72ee468caf89871142c3a6a8ffb5207e9717e0",
+    "third-party/nsh/crates/nsh-platform-windows/src/compose.rs": "fb996e3c8fa97934361aa72c27f599255f242fc98c79ee1c6226b4ee94c314e9",
+    "third-party/nsh/crates/nsh-platform-windows/src/decor.rs": "f540f849d531a1f7150e9ede55f1d1c6426d05890abf0ad5d11dc124b9b968fd",
+    "third-party/nsh/crates/nsh-platform-windows/src/decor/cache.rs": "0e9de1b0aa430fdbd0b18e2690dfcb48894df0f346d23a9fe2f43aa089186a13",
+    "third-party/nsh/crates/nsh-platform-windows/src/decor/gradient.rs": "2bd889749dc2f08738e3bf98456cb4c6179e57ec4bf95ff256b286dc409f221a",
+    "third-party/nsh/crates/nsh-platform-windows/src/decor/layer.rs": "971afe6bc036cc45d6cb951acbe2129091de320228aa058f3a7f9c97c4693401",
+    "third-party/nsh/crates/nsh-platform-windows/src/dev.rs": "2d710539e67f8d867f3758aae5da6beead7238f59003c9ec16e2f3605da0b84f",
+    "third-party/nsh/crates/nsh-platform-windows/src/file_drop.rs": "264fea2b33dc2e0e0a5b6228c521fec8bfc32f93b00d4ea4fe0cb1ee1c5c4aa7",
+    "third-party/nsh/crates/nsh-platform-windows/src/geom.rs": "f545bac8767818486dced6f12fbb4cd2fee00114dbbdf9bd77c610268cc9d4a1",
+    "third-party/nsh/crates/nsh-platform-windows/src/gfx.rs": "ef97b47e7ddc28932707c085373295e8400415cb6cff2cab6562934cc080be66",
+    "third-party/nsh/crates/nsh-platform-windows/src/image.rs": "ba1f4b58cf03eef269d8fcabd426ae5f15d0455ba4fe35630612316b3c811cad",
+    "third-party/nsh/crates/nsh-platform-windows/src/input.rs": "55c705f219fc6b8d19bbf2049f8b8d8eaf8439a235c23589bdeeabaa0d6e0e97",
+    "third-party/nsh/crates/nsh-platform-windows/src/keymap.rs": "2dc3b8fa2ba316dfb5c884d9b3a017af6cc1ae23edd31da019323a2ad80e1132",
+    "third-party/nsh/crates/nsh-platform-windows/src/lib.rs": "818655ac867b70a05adf47a52f43718d38cb5d0bb265fd28d66640e24f9b16fe",
+    "third-party/nsh/crates/nsh-platform-windows/src/mount.rs": "1d2b45a793290c26318a28a51655d977c19ed6629445531721e730898b5f7909",
+    "third-party/nsh/crates/nsh-platform-windows/src/native.rs": "6f00f6e07d740759ce3657fa33f5d7159cd11075e1309e7ae1577f30f025b316",
+    "third-party/nsh/crates/nsh-platform-windows/src/native/video.rs": "74838037baaf60bc06bb299e6a1efd8117562d2d153a1c48288b331b1be3fd8e",
+    "third-party/nsh/crates/nsh-platform-windows/src/native/web.rs": "a653cab92ad868e9ecdb589ee4d8dc3edc7a3f5576554ff3cd885db065e3cf29",
+    "third-party/nsh/crates/nsh-platform-windows/src/navigation.rs": "14f19d9461f9eac3b351c990ad8237e51105d63568c880074e0dc76012aca662",
+    "third-party/nsh/crates/nsh-platform-windows/src/render.rs": "50cc1fd242bd15fc495a77ca2383251ce5ed712688a552de908e3fc268d3d9f8",
+    "third-party/nsh/crates/nsh-platform-windows/src/scroll.rs": "28279bf52c6a8e36f173e9e3501470f1c7a17d5b7899390905a08f66202da461",
+    "third-party/nsh/crates/nsh-platform-windows/src/selection_area.rs": "79cc6116c2cfd1d33dd5b5e6bdc15222c3460aeb6eddf288fccc09489417b3fe",
+    "third-party/nsh/crates/nsh-platform-windows/src/surface.rs": "680f0210bcfa893a1f4c182a097b4a96dd18d4095c5ad67f27ba0ff539fdae63",
+    "third-party/nsh/crates/nsh-platform-windows/src/synth.rs": "27fc28c8d4d0b54dec35abfaeaa283f39bc3fc33eeb9d5b1cd9c280a6511966a",
+    "third-party/nsh/crates/nsh-platform-windows/src/system.rs": "0466f5714b717e08d7fbaec35cc7109be0bac8d30d2a997db13420c7eb23436b",
+    "third-party/nsh/crates/nsh-platform-windows/src/text.rs": "da82b3aba6af2b92c2615dbd27bc40ac7cdda0009027a7190faa349a8d2070e7",
+    "third-party/nsh/crates/nsh-platform-windows/src/text_input.rs": "aad1659e84bdd22feee53ac18cabb6d92d7e245575cc1d14739835d9f0f6c25c",
+    "third-party/nsh/crates/nsh-platform-windows/src/transition.rs": "dac21868ca439f92c4ecb41197fec60f4b8cf54e0364213dbcf4b8ae9e01cc24",
+    "third-party/nsh/crates/nsh-platform-windows/src/view.rs": "064cccd47c5b13724fafe4082dc86954b676b746186c01100e466ad764294ea1",
+    "third-party/nsh/crates/nsh-platform-windows/src/window.rs": "84b85a4d05b9194198b647a7244f4dbeec4323df9a85ff6475f73c3ffec46ce3",
+    "third-party/nsh/crates/nsh-testing/Cargo.toml": "a32d7aa17b13e244f7e9c2c6c8a8859cbdec3e878c1ddf1655fdd4b5b7113c0e",
+    "third-party/nsh/crates/nsh-testing/src/agent.rs": "dadd07658ee16f5d6e57f89629ad14233e380ca4b614645d3816df7c6755aee3",
+    "third-party/nsh/crates/nsh-testing/src/agent/forward.rs": "6e62c09570ba63b910caa280eba059fd2ef87f056bca59d2e5413b4c313ad4b2",
+    "third-party/nsh/crates/nsh-testing/src/driver.rs": "9a97ff5d9f7796965e7659298c2b885f214e826ff218c946d64f25f3d7712895",
+    "third-party/nsh/crates/nsh-testing/src/headless/animation.rs": "a38102dc120bd208331b64d94c28cfb2b1aba52845bf31d7f387fa552a6ad18a",
+    "third-party/nsh/crates/nsh-testing/src/headless/keyboard.rs": "986176b5894e26d549dc9d6a1db119e06a4c7b224ff32e4e13dcb77f73e4c44e",
+    "third-party/nsh/crates/nsh-testing/src/headless/live.rs": "97e9ebda01076dbbc525618303316f379397af8f07a4e0fcc3372a89096f6597",
+    "third-party/nsh/crates/nsh-testing/src/headless/menus.rs": "79276a0066e4505bcf3e5043f2bb800415a84e537415633f79815235b122461f",
+    "third-party/nsh/crates/nsh-testing/src/headless/mod.rs": "fc6ed20e9dd3f5ebb55d03ea8129f43d213934c6ba3adf307308c348fa12bdf8",
+    "third-party/nsh/crates/nsh-testing/src/headless/net.rs": "05b51b76f89a71f11b085001950812cd581bc9f13f9111a867b6cb3dc608f3c4",
+    "third-party/nsh/crates/nsh-testing/src/headless/net_fetch_tests.rs": "798c72ea94333a2ce720d313a95b7e5612cf73c1830c9c8aed4ea5550e52f6e9",
+    "third-party/nsh/crates/nsh-testing/src/headless/pointer.rs": "b535b3b01c7d7803b8c92aca81258db65caedeff7d13b59d28f8874def6f6087",
+    "third-party/nsh/crates/nsh-testing/src/headless/stub.rs": "4f6a52cea583a94614c5552ec02b188d40878e69e65cd5b04ff8904a9f73ff3b",
+    "third-party/nsh/crates/nsh-testing/src/lib.rs": "ac12cd696637cae87b62c08396b334a01b565ae9d0698383ebb2623e1f1eb160",
+    "third-party/nsh/crates/nsh-testing/src/menu.rs": "4bc761c4ef832b71e25630b3232d0b0a5367394b6632b2745edabb807248486e",
+    "third-party/nsh/crates/nsh-testing/src/module.rs": "209147852295109003570770a3383fd938a10175849fb8e2be80823c6a660394",
+    "third-party/nsh/crates/nsh-testing/src/run.rs": "69b39dc5e84d927b39269e73b921c7c497b88db2bd073f7475c7ad578e5794c5",
+    "third-party/nsh/crates/nsh-testing/src/runner.rs": "9ac5462e7834dacf12916681b65e2edb7b482f350dba658d8ee338594b220447",
+    "third-party/nsh/crates/nsh-testing/src/screen.rs": "04cd1b008006e1b5aae501c31ac139443bdbff1b901b21038033fa746fb20895",
+    "third-party/nsh/crates/nsh-testing/src/selector.rs": "9567a7d5ecba869684cbe4a9b4d7441c074dab2e6d564ca6463302da0dd40599",
+    "third-party/nsh/crates/nsh-testing/src/storage.rs": "72eb5c29dec32f9a8d9afaa3b8d4053a8fc8cc76b0f2bf31f1f76cfd5ad4020e",
+    "third-party/nsh/crates/nsh-testing/src/trace.rs": "4994ee905345f43bc15d5004300024974b6bb6dd35220b62b17be4cc2c2b9c10",
+    "third-party/nsh/crates/nsh-testing/tests/testing/capabilities/App.test.tsx": "d8c38468e24d9125e53fd8f21503410eae0d829f0cb15148aa1743166447e294",
+    "third-party/nsh/crates/nsh-testing/tests/testing/capabilities/App.tsx": "36c99c0c5e804e2acf1fd6809113f35288971b657867a6d2fec0064382920947",
+    "third-party/nsh/crates/nsh-testing/tests/testing/capabilities/nsh.json": "c5b20dd63cd92f8352d57f2986f11284d268ce5dec79785e71c220bd41ead689",
+    "third-party/nsh/crates/nsh-testing/tests/testing/clock/App.test.tsx": "1efce46434813ee533ca4c4fa7e95ac23cf106b7f4c0c247efce439876e1f6be",
+    "third-party/nsh/crates/nsh-testing/tests/testing/clock/App.tsx": "88a13af9015a64565d9d5a2b208e29a3f92bf5ad42c26f30fb6b52fa588b7e8d",
+    "third-party/nsh/crates/nsh-testing/tests/testing/environment/App.test.tsx": "187831fa2adc650723de6e17ed53e1bd88f80169e91daa946c2b0277c3714077",
+    "third-party/nsh/crates/nsh-testing/tests/testing/environment/App.tsx": "84583720c58d63385b056e0f2145d35b22b6facc1d5eeb6a49ddff86d83cbefb",
+    "third-party/nsh/crates/nsh-testing/tests/testing/main.rs": "9be3af39d046d30e1ca4c5ec969292480178bb1f033037bd605ab7e604941c8b",
+    "third-party/nsh/crates/nsh-testing/tests/testing/platform/App.test.tsx": "0126c606f69d8fd7b880b0a4c046f0da6187db574ab492a21715fedcc65d8277",
+    "third-party/nsh/crates/nsh-testing/tests/testing/platform/App.tsx": "d0a26d35006662ae6f6410493a647defeb5a01dbed7f7fdf78ed9b573b72b956",
+    "third-party/nsh/crates/nsh-testing/tests/testing/queries/App.test.tsx": "cfc603ff619f179002576cd89994cd09c3f07cec4782ebf33538aef55c687449",
+    "third-party/nsh/crates/nsh-testing/tests/testing/queries/App.tsx": "3c1edf65e33d179994531481f7dde7e5d3049ad257962fefcbcde9c2606abddc",
+    "third-party/nsh/crates/nsh-testing/tests/testing/suites/Only.test.ts": "86107880de56758eb75244f3768bb072584d78bd2cfc2a824c7eaa1f9c0d546d",
+    "third-party/nsh/crates/nsh-testing/tests/testing/suites/Suites.test.ts": "0f9acdc4ab916e946b73477f1d5358f4973710cf03b2f4c532b45575457340dd",
+    "third-party/nsh/crates/nsh-testing/tests/testing/todo/App.test.tsx": "ff53ef5e9318dee3b496d70a3b2ba424524a02351776dcdac0a23bd9bf330160",
+    "third-party/nsh/crates/nsh-testing/tests/testing/todo/App.tsx": "ae08db41f7d5acf2866e85db981ed6b78991ae2ba5c8208f3dfe1b0470eeae4d",
+    "third-party/nsh/crates/nsh-testing/tests/testing/todo/Broken.test.ts": "9e895c0417f95a438f5a8c2f1b21a1f631acf4ebc98e1d556894357256e12e53",
+    "third-party/nsh/crates/nsh-tui-app/Cargo.toml": "5b9fe5f35d5890f352a0772e2cfdecb6d3f80a05aeaa2fe982f1b9673db4f9b2",
+    "third-party/nsh/crates/nsh-tui-app/src/lib.rs": "d180e1419503922a996a7eb2109e0dd6377c9ba8efd51b378627decf7b7fa4ec",
+    "third-party/nsh/crates/nsh-tui-app/src/main.rs": "88800ea66bf7487d8d7658dae6a7c04565bdfa598150d22aaf581157cfcbd114",
+    "third-party/nsh/crates/nsh-tui-host/Cargo.toml": "e2172566f4e724af0d2be84510731060cb01f43224d404795281256d147601c8",
+    "third-party/nsh/crates/nsh-tui-host/src/lib.rs": "0230140a2f8a4aa826050cede116b132fc194df3710725eb8a5b35de0b89463f",
+    "third-party/nsh/crates/nsh-tui-host/src/main.rs": "10ee3c1fe1bb3fc1f06b30456a02e05e54f5a64672121e9047424a0e54b374ee",
+    "third-party/nsh/crates/nsh-windows-app/Cargo.toml": "2cd82b1a599dabc67c1b9f010f583e84a1241e1c17841ef8fc65b051cf7a3ecb",
+    "third-party/nsh/crates/nsh-windows-app/src/lib.rs": "ae8f7c9986f93c5ce668664385d65e05d16b768f4107b6b8786996641ebcfa34",
+    "third-party/nsh/crates/nsh-windows-app/src/main.rs": "49ec1b65ea1f5d009c263a7f757a043d6085e548ee894c019d9a50f8631d98bf",
+    "third-party/nsh/crates/nsh-windows-host/Cargo.toml": "701f8021a291aed0edf57fe87a09e506eba67c917795581829d5216e52b7139c",
+    "third-party/nsh/crates/nsh-windows-host/src/lib.rs": "d04c6b7abdf139102a038c247c76d7b7a9cd50c7fa3432e9cf870ffe6369653d",
+    "third-party/nsh/crates/nsh-windows-host/src/main.rs": "cde1e857a9ebade549af80b1b56e1adb57fd0038dac6b15c16edce6541cfc16b",
+    "third-party/nsh/crates/xtask/Cargo.toml": "c1b1877a437ab353cff91daf283a5bf6877cf74e2b6397fb95f2d230aad7e8af",
+    "third-party/nsh/crates/xtask/src/android.rs": "d1dbd5bd6c603bd3a7de20a778d5d22fb77e666011d9a84d0a38040dfdd3e916",
+    "third-party/nsh/crates/xtask/src/compat.rs": "5511e1d357f6e94978fb455f4f9874c2b62fccbfa602bb48d882e6f152d958b0",
+    "third-party/nsh/crates/xtask/src/dist.rs": "ebc6af21d7e322bdf90aa81d0c3fc814d1dde9bb7f639de5b3140af9048a1c1f",
+    "third-party/nsh/crates/xtask/src/ios.rs": "5343c250feb010350f7a5374b90a94003dbe86df1d38f95a7551300be5d94cde",
+    "third-party/nsh/crates/xtask/src/main.rs": "e02d818006a77c1fbb37c3d28b3e6862b71b0231731a752bc0697e33908fb2cb",
+    "third-party/nsh/crates/xtask/src/run.rs": "0862c5a701ed6bf204d26808c4851cb393f81ad409610368730a035be7b0c21b",
+    "third-party/nsh/crates/xtask/src/term.rs": "c37f86f12a081dce01cac4ba3d48443b9c0b13700706d40959138edb97c774e9",
+    "third-party/nsh/crates/xtask/src/web.rs": "aa219e750031d0fffbee998617f2d6554279f6d56288eca79996113706ef1545",
+    "third-party/nsh/docs/README.md": "921081813d08e3298ac20fa01f6bf375aaa79073659cf3b4703d0b184d6113ea",
+    "third-party/nsh/docs/dev/README.md": "f6c199e9444747648f80e342ace30a586596c68abd9e7662daafae0b20f2565d",
+    "third-party/nsh/docs/dev/animation.md": "f56e07178875bc9d7528ae471a8c017cc80b86b3501b9c2c38b549e42191fb46",
+    "third-party/nsh/docs/dev/api-naming.md": "5286d04f523bd17c9ceaecb37612a145c52a91684889293b43fbf6f0da7a9363",
+    "third-party/nsh/docs/dev/architecture.md": "dd96d2a3ea5d26d23d17e0db36a1b280486be933eb83452f8fbb5d4c87023951",
+    "third-party/nsh/docs/dev/canvas.md": "e6c644b1198801f9242aac91339dc04b5c480d876dbcbe378c58b4953f3970c2",
+    "third-party/nsh/docs/dev/compatibility.md": "0307638db496f5ea70fd6c996ae5839336c54e370ed495b8fb06d860eb6a02bd",
+    "third-party/nsh/docs/dev/components.md": "9f4a41c405a016275002fc9d850a222dcf941eb47f96201a1a384ba3f8a34914",
+    "third-party/nsh/docs/dev/dock.md": "51527992aeec0387fe7ebdb82b7d24ed4ab6f0dc19b3332e23236cb7a3ad1041",
+    "third-party/nsh/docs/dev/elements.md": "94da584a4b2a7dfbd54c83799329ed05220ce8f2c86107df1e556148dd2b790f",
+    "third-party/nsh/docs/dev/embedding.md": "db9490c56c428005722ff46a5c1a2e632b6f6dfd4a1283b99b766629cca58c5f",
+    "third-party/nsh/docs/dev/file-drop.md": "ee9e7e263e32789d03893108e68b47d2447a0fa19b29be6b348f269884cb81b0",
+    "third-party/nsh/docs/dev/geometry.md": "cc747bc4cea9d983b1ac3d634be58a8eac27254ecb912c2940173f168de8f9a9",
+    "third-party/nsh/docs/dev/gpui.md": "15cb649e427c84858f177b0d85ae0540dcd4ae23a3b8b3df414a9f1dab6b0284",
+    "third-party/nsh/docs/dev/images.md": "9e797fd623bf317a5e96fdc7d04ac1bf85f2fc82d267a2d220e3e39c9a6f187a",
+    "third-party/nsh/docs/dev/js-modules.md": "991718901c2e0ee19c3776a7f806d30717c0a1842a5f4c5f1bfb18343795ebb8",
+    "third-party/nsh/docs/dev/layerfs.md": "df9b16b2f5f1e61f9693f63b61438a51461d05b535a0046d50ac9ba1ade12b8b",
+    "third-party/nsh/docs/dev/linux.md": "4441ec64b6edc5c03084bd203aa5114c066f9e2c0541ee320be8f17b6f82c3fe",
+    "third-party/nsh/docs/dev/macos.md": "827c809b5774681c77daf05ac6603342c027dfd459e78f55558044861711dcd3",
+    "third-party/nsh/docs/dev/native-pipeline.md": "07f803365af6ac90d5247c70d2e85ce9e03393f0e9e122c46690f85e381a0c55",
+    "third-party/nsh/docs/dev/performance.md": "c40be7a2052abf26542b024775ec10219247af26a473bb3f784c02e4f4a5209f",
+    "third-party/nsh/docs/dev/pitfalls.md": "b8dc2e12cdb09531c2903898028fa963104f13fbbee34677db37762781f13343",
+    "third-party/nsh/docs/dev/reactive-components.md": "cd447fe8cfbe9026d7cadd5fa42d9c387e4c1b1b7e1c5adddd55c3f1beb94a4d",
+    "third-party/nsh/docs/dev/rust-classes.md": "1f70015213dbcf56e6d6e4641019092003c22eb57ca324d9c4a85578b4468139",
+    "third-party/nsh/docs/dev/rust-modules.md": "f793bfb12272ded93e80876fd2c72ff8dc0f1bd0337977f39b750af495a83592",
+    "third-party/nsh/docs/dev/sandbox.md": "4dd889e136fc64a6024a60e07372868e9b25753128a0cf3925966f083daf7f27",
+    "third-party/nsh/docs/dev/scrolling-and-lists.md": "158f7fc20773ad96683db9f6c6b2588f97274e7c9ed4e2958dc925b1ecf0e750",
+    "third-party/nsh/docs/dev/signed-packages.md": "6e762f506428d53d347106e3619921a5595391105128305090da8eb8a20c220e",
+    "third-party/nsh/docs/dev/styles.md": "fcb5410f36c3d0ec08c300a7d624b19ad9d62404f665e9f4a2c61dda001ae532",
+    "third-party/nsh/docs/dev/text-view.md": "ef89f0a8af990356b33b5bfdd0f79e9d86342024e04ad8e08aba9e9ab13c6693",
+    "third-party/nsh/docs/dev/text.md": "7a4f09386899d5e6a5c3dd7c886063db73fcb5b288b47d0ff37cbfc8b4911dfd",
+    "third-party/nsh/docs/dev/tooling.md": "1e605160ca6bb185136e1ef28f1cb703c4db5ac24647570c2c7b5a7c80f65fee",
+    "third-party/nsh/docs/dev/tui.md": "47b56095f90ba9caa3efc65acc10bb3e255b674d9cf05d71fd5a30f7a43b1770",
+    "third-party/nsh/docs/dev/web.md": "7c6f900d89b7f46f840cbaf271664f5979130ec9175b5695eed8afc30cccbbf4",
+    "third-party/nsh/docs/dev/windows.md": "099245b28187723d0ce93f9b6f0b4775bb19f25c625e8b3db558fe175dd0bb6e",
+    "third-party/nsh/examples/bench/GridTs.tsx": "e1388190424c85d044232f9dfdc897acc69fc4464b23b57db149f9276336e3b4",
+    "third-party/nsh/examples/bench/README.md": "75d32dc5f73955e42cd171baaeb7df39b19cbdd25e67e661df7976a887ca3506",
+    "third-party/nsh/examples/bench/RowsTs.tsx": "dbf29d668ed1f8bb9a776777eb6a86764f250ffecb9f21b66e86384a06d47af3",
+    "third-party/nsh/examples/bench/TsButton.tsx": "98e98ae946037db6e6d68ac472eb01fc2412e381e94c877c187b664e987df48c",
+    "third-party/nsh/examples/bench/buttons.tsx": "535a4718dcece3c67359802aa2d3f09d29cd7d658c93811886a6e1f44b623c60",
+    "third-party/nsh/examples/bench/tsconfig.json": "9cc30d6cb1f4394c49a8aaf0e4e0126a9a137ff98e2e102ba38a8cd405689dea",
+    "third-party/nsh/examples/counter/App.test.tsx": "5e908a7ed89f28914bcfe638ee93b36d892870615b21d250fe90995bd4132a64",
+    "third-party/nsh/examples/counter/App.tsx": "0826b79a030056151d0bab4a67fb7cdb0875cb46b7d0392781e1c14ceffc4141",
+    "third-party/nsh/examples/counter/nsh.json": "f0175e5263b669586692995cc52382d9fbb6d08bdfa81bcc75ce63efc4452905",
+    "third-party/nsh/examples/counter/tsconfig.json": "9cc30d6cb1f4394c49a8aaf0e4e0126a9a137ff98e2e102ba38a8cd405689dea",
+    "third-party/nsh/examples/desktop/App.tsx": "069c5a14642c56403f8786b8b96187d226f08e4078f37a7551f253433c65b49d",
+    "third-party/nsh/examples/desktop/tsconfig.json": "9cc30d6cb1f4394c49a8aaf0e4e0126a9a137ff98e2e102ba38a8cd405689dea",
+    "third-party/nsh/examples/embed-android/README.md": "2694fb610d63a1e2bd816533240fb0bac3c66d203a0be7e076d06098c75f2573",
+    "third-party/nsh/examples/embed-android/src/com/longbridge/nsh/embeddemo/MainActivity.java": "482e4f1f734450f2a4acb9dfacee0995ef69947e70ff25e7fa2ce93c6cb2c782",
+    "third-party/nsh/examples/embed-gpui/Cargo.lock": "16bedb298e480edba2cf2548b07cd3583c7471c3ef7aac852c86da70da7b2886",
+    "third-party/nsh/examples/embed-gpui/Cargo.toml": "a1f4727ec5fbc760f3678bcabfb14e3d34d37d71fb0b243e40920e55b8ed1f21",
+    "third-party/nsh/examples/embed-gpui/README.md": "bf86ae2881ad77ff9bbd0292d64e2572927b0b197461fdb52c67a049f99c9dea",
+    "third-party/nsh/examples/embed-gpui/app/App.tsx": "bfa298b218d3547a6470434f4e58b9279831a429a5dd21f5175ed0d00c63e8dc",
+    "third-party/nsh/examples/embed-gpui/app/nsh.json": "0f5f72bacd3233d1585d5dfe497f0c624f96c2c02688fe691f249f4cc83adbe5",
+    "third-party/nsh/examples/embed-gpui/app/tsconfig.json": "9cc30d6cb1f4394c49a8aaf0e4e0126a9a137ff98e2e102ba38a8cd405689dea",
+    "third-party/nsh/examples/embed-gpui/app/ui.tsx": "93aa154693e1749453d864e4caf31401f2cc8b39f3ff7ef167c2fd71beb0864c",
+    "third-party/nsh/examples/embed-gpui/build.rs": "b31997572befb7a733680199925e8694d62db88a4180c6797dfa6a31bb5e894e",
+    "third-party/nsh/examples/embed-gpui/run/Cargo.toml": "6e61baaa6166c8170430ecfed0805e1090bf00a0ae7a00e1236823aa01456c1d",
+    "third-party/nsh/examples/embed-gpui/run/src/main.rs": "22eaa7282271453d46af87a713a79ccb2001bf78cdce367eb207a5153c920607",
+    "third-party/nsh/examples/embed-gpui/src/layers.rs": "459415df61315172a95033c0abf53373c1996d67f76fbaa019f9e36d6664e747",
+    "third-party/nsh/examples/embed-gpui/src/main.rs": "64e78833db57cb92ede02ae96fd69fdc09b037bad4ef01f810318e07c6e33b1d",
+    "third-party/nsh/examples/embed-gpui/src/switch.rs": "1b359acc66f8b1cc9e75e7b18cf1b32c207c877468719cb73cc2ca67086220b7",
+    "third-party/nsh/examples/embed-gpui/src/theme.rs": "4e215f1b6313b51fa1ccf7adf75b9808848576abc7f7da1b387989e0e6ec5ef4",
+    "third-party/nsh/examples/embed-gpui/src/trading.rs": "d74b621e04b6a04a622033c319574c8eca80051bb7bb2619a872377c42ebdefd",
+    "third-party/nsh/examples/embed-gpui/src/watchlist.rs": "7d46e105a6f00e31a3d225e5b1430616f0360cac5b7ac8a63add0ebdb6397ce2",
+    "third-party/nsh/examples/embed-gpui/themes/violet.json": "7da650a48cebde43683ef6f50bbb27a5000dd79911763e46982688160a59e2ab",
+    "third-party/nsh/examples/embed-ios/README.md": "a5f2a52371ad660b6c5e24333f7282475e4b544a564770035f10efbcb1a6937d",
+    "third-party/nsh/examples/embed-ios/main.swift": "6c2bb633521fc06e45351115ff8b34d5b182106e7171e5ab4c8d376585962020",
+    "third-party/nsh/examples/embedded/App.tsx": "11c06c478613046c7ebb3b936366d08abd66e4f82e3b45037ea1648d01cacb27",
+    "third-party/nsh/examples/embedded/nsh.json": "3ee671a3404ac47b07142fc0803df84417f265279c139a0616c37f772580c8ce",
+    "third-party/nsh/examples/embedded/tsconfig.json": "9cc30d6cb1f4394c49a8aaf0e4e0126a9a137ff98e2e102ba38a8cd405689dea",
+    "third-party/nsh/examples/gallery-rs/App.test.tsx": "7aaa088af8ed0749b5dda6bb90e7c8746db0735d0706b7475ff0b38e1d8bc27e",
+    "third-party/nsh/examples/gallery-rs/README.md": "ae1169fdb328e12bab7fc0b85832712e1d962f6c460a92573ac94465bade8147",
+    "third-party/nsh/examples/gallery-rs/animations.test.tsx": "d642f1e231d6a400c57c6447bea65e05057a5fedb3be880ebf60a850c98516d3",
+    "third-party/nsh/examples/gallery-rs/canvas.test.tsx": "99c603e9c4a1e3fe61d298801b5f9f382a209215af336b609755bcc0e93054dc",
+    "third-party/nsh/examples/gallery-rs/chat.test.tsx": "59f0b4b016cf8853f750a15ff7d814ce688831459dafa093cff9b266f23c79a6",
+    "third-party/nsh/examples/gallery-rs/components.test.tsx": "2483f42563bd24598a5db7bbd923e971d7ffb8d5bbf6f2a409fc5d941493c2ba",
+    "third-party/nsh/examples/gallery-rs/desktop.test.tsx": "68d683ac3c3fa303dda0ed191a1b5e971c572ceadd1c58489611eced2b7942b3",
+    "third-party/nsh/examples/gallery-rs/form.test.tsx": "1249a5c4ac01e199e2e316061fd854b9ed7a28f79328d470744ed0cae6095de8",
+    "third-party/nsh/examples/gallery-rs/gestures.test.tsx": "215a1cc2f86a914206f04528a7821d459287dc01b10fe2fe59773031b243a0b4",
+    "third-party/nsh/examples/gallery-rs/icon.png": "9a7291004ee88f60e4d830ff974db21c38263a367ccca7b804badbcbabd1398f",
+    "third-party/nsh/examples/gallery-rs/images.test.tsx": "6514efe7252bc834ee89130b1af6d0b823387d6001e6b3acdf36fcdf5e57bcfa",
+    "third-party/nsh/examples/gallery-rs/index.test.tsx": "4e9a744287f708adb0dbf14e508183388749fb8973cc3a52c50dc68a9b933ca2",
+    "third-party/nsh/examples/gallery-rs/lists.test.tsx": "5d6c69d0aa0c837a642c8ea3f4f4967ec1ac03cdf039ee5c4abc544c0cb01c3a",
+    "third-party/nsh/examples/gallery-rs/media.test.tsx": "21330571f87739cd57f869e64806a10ee4ab751ff891cc541ca5cebea4784667",
+    "third-party/nsh/examples/gallery-rs/native/Cargo.toml": "cf03a90d5e05294151d2bf527f59042e48f3c873d091f89cd9be7271ee0550cf",
+    "third-party/nsh/examples/gallery-rs/native/assets/bounce.gif": "205cd6ffaf6d4575d52ae4eadd01c1a6c689ecb60b3a350f1902a8d63ca3b1ad",
+    "third-party/nsh/examples/gallery-rs/native/assets/fonts/OFL.txt": "a47e5daeda73568969395c656823102678f2eefb0d7d7ecb47aac4cc17e42204",
+    "third-party/nsh/examples/gallery-rs/native/assets/fonts/Pacifico-Regular.ttf": "5b6c0d5334a7bf77dea52b975c5a0c408878c0f7115ed5b6fb151f634b7bf701",
+    "third-party/nsh/examples/gallery-rs/native/assets/logo@2x.png": "ac8c8d7b052f7ca39f8bba0a2a89ee8f971dde02ef9fe86f75b94535e8d3c48c",
+    "third-party/nsh/examples/gallery-rs/native/assets/spinner.webp": "43b19bf2baa2704f8387c7b28b02f9349814d1030f5679ac9825fedc3495047b",
+    "third-party/nsh/examples/gallery-rs/native/src/assets.rs": "014abf967e609b190ad3c64f2e4a0fff0f093c945b1629c0d21f20010fe730fd",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/animations.rs": "5cbb1862977913543ecf85d8becd8c6dc42cbb9b4db4e4ced5087189cf1befa3",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/canvas.rs": "cb4282d43d7a7330de1bcacbd252d5ef1ddab39584d7afb4b68a3956386557dd",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/chat/glyphs.rs": "feebb983816c09255321d8e72da80e7c581586d147e2afe2f08f7bdcd2177a71",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/chat/markdown.rs": "12b463f902a64ab6f210b895646453742f14d4c7bb74ea9d60b87941edf09c85",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/chat/mod.rs": "14bd88fe6c5be5ddc1559d6e6cbf55047fee8fb769456a284c7f22fe3d63c484",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/chat/parts.rs": "9b2d845a0a75cb7900eddf4a28832dde58090374e26fb9e15187691d08a6781d",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/chat/scripts.rs": "633b1cde09978a1ea80f115a82b25e4d0eeb0a05ae5fe19bcae88b8aaa0ef91b",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/components.rs": "7fab675ce18691e28692a1c6132d27127b2217a9c71c161619399258409109ef",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/file_drop.rs": "7cf3221df3fdc967f2baaac7ee95010a9ff8ac3288a13feebac5f72a5dd598ce",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/form.rs": "e857c8a368cb61278d0872bb55a603542c4ff9b57b574cc0fe0094f1cdc4693f",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/gestures.rs": "3c077f4f48e73be5b84f824029cf2fd4d50cca1cc5000efce24fafcd5d227609",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/images.rs": "6a627af3eb98403a427e398859e37d0a63312403a7e8232d9d84ba52213e497e",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/lists.rs": "cfad2663b35e01df71f7a2d236f08b8c5190f6f0c6397c83c65aa1dfbb8e85f2",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/media.rs": "9eee71cd97c4c3a7520aa2d431b5dc172d4a39e7db942e0ab7fdbd719a442385",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/mod.rs": "84407b700a3c2720da6f88b359be64bfa8231723d8f7bc13d32feab98435af60",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/navigation.rs": "3092dbf16b9060d63781af5f365be8f280b8d1ad6a7719217e8af60276a294da",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/photos.rs": "0c4a11dde6399ec2504071b1e3276bfcd2a33076926060c65a7554236f293f7c",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/physics.rs": "a22952d32aa3e65fb909a55dd29778048228fe92c1168bfce46378bd6b93e01f",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/scrolling.rs": "e7969109c7fe65367784064887282a795fd16e5396ae74f48954e29a06b08e2f",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/stocks/book.rs": "efebc53d4de6166e5d13e0536ddcdff3c1f2ef4100fdcb03feb4d52dd4c323ad",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/stocks/chart.rs": "6c57aeae5f75875c664f029603d1e9b4a872beafb518ee650fcd89f203b46c05",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/stocks/detail.rs": "1724332769a8a24066c58aa2170fb8379513e77b5b8b10677e98a980df69e097",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/stocks/market.rs": "d572f7867475df22bb1207d5bb6dc5adee120f0d5f749d5572d5bdf23a4ee0fc",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/stocks/mod.rs": "93d3a7eefcc170cdb05b99c053055adbd4b380a3f0a31fe3e38edbe50f0574fa",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/stocks/parts.rs": "a69be3afb45efeb5238d45505860acf47ca608321fc0f74c3c00f6457ac396f5",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/stocks/tape.rs": "d42e6c6a069d03aaffbfb41d5905c956fcb70cd991bcc8fcf42de7b3f3957157",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/stocks/ticket.rs": "a85cef8be1f6199fd5a27a8b0d32d77740a7fc38bb5bbcd23f1118cd8fa17c4d",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/storage.rs": "cac989854f4cd0da96566bfacec6c6005b31a3dc0f5d4e5b4f4ed0853f6c791f",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/styles.rs": "d50fe790205a0a00d1126b5d3cf95b25e4a502b3c4082fcd4b53a2b7ac24f42c",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/system.rs": "1da0ee5d4eb0090a3bbf1466bc3cf6289e6df238e53ee6a6f0c5f0021e93faac",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/text_demo.rs": "5157799d2adca872b8a6f653ff8f0c312af08a58da1d266445f9e83311d6a30b",
+    "third-party/nsh/examples/gallery-rs/native/src/demos/typed_styles.rs": "fc333a35d9a086cac772f22fd23010e1ea9a3dac6d534b070685d4cac1cc4fbb",
+    "third-party/nsh/examples/gallery-rs/native/src/lib.rs": "4bff6c8d15cd6bb297e2bc690950ce7e9d3f78e4f027c35a7311335f5bbe7f61",
+    "third-party/nsh/examples/gallery-rs/native/src/main.rs": "61f75e4a2da44822fd3c6779b06517c30d9d029bc0bd6f6a4d10c1d00f429589",
+    "third-party/nsh/examples/gallery-rs/native/src/nav.rs": "856597ad090f8b614b2187c834d73aa2d4253f123fee2b3852e2260a8eae9024",
+    "third-party/nsh/examples/gallery-rs/native/src/shell.rs": "0ae7714f8453c66f43067a8e0e81b2efa2f97d1097b1a1e7f8768646994b7510",
+    "third-party/nsh/examples/gallery-rs/native/src/ui/animated.rs": "aba5269369cd306ce29f0bab2d5d4e4fb5ab4325ebd2eab16914d2ad8520d81d",
+    "third-party/nsh/examples/gallery-rs/native/src/ui/controls.rs": "92b907e2a232d8693bf6eabac31286dfdac76da8f5164bed1565acfac3b85647",
+    "third-party/nsh/examples/gallery-rs/native/src/ui/device.rs": "0ed3dfde7a48ee5417ac0cf11f322643374481360a70ecdcfa15da940bbd3f16",
+    "third-party/nsh/examples/gallery-rs/native/src/ui/icons.rs": "3e13f8faed39dd6b7e9ab471c10e74abe2fae6f40e3b61e6dd0203c257f1eea5",
+    "third-party/nsh/examples/gallery-rs/native/src/ui/layout.rs": "3fa890753c969ea9bdc7a37357b08cf1e318a4ac9b906b7656734c783814a76b",
+    "third-party/nsh/examples/gallery-rs/native/src/ui/mod.rs": "de569c4e9760711f4f6c0ee7584974ffd4977ed50371a7427f9a3599b0923a28",
+    "third-party/nsh/examples/gallery-rs/native/src/ui/page.rs": "f06048495a1054ea123902373fa0e4ccab178d9f08ce836af06ddfbfe585341c",
+    "third-party/nsh/examples/gallery-rs/native/src/ui/parts.rs": "bc058da2c8c3160fc647fcb48fda30c9171606b1d5dc4a495f1f73821b8308b3",
+    "third-party/nsh/examples/gallery-rs/native/src/ui/shapes.rs": "73dabe1b0cdc10616dd1ff838caf419af48465db826b0b818f0d864fe28516b9",
+    "third-party/nsh/examples/gallery-rs/native/src/ui/sheet.rs": "7105dc4d27439e797fbf3a588310a3c94214f0a2ad3d5a64683e40d6aa844e81",
+    "third-party/nsh/examples/gallery-rs/native/src/ui/theme.rs": "9d28865f4ab19af7a5848bac8824855c2d2d857766874a018aca52610faad80a",
+    "third-party/nsh/examples/gallery-rs/navigation.test.tsx": "7a2c52cf3a8c42da112dcf8258e82b6ff1823d9a426ba906b62673c0820963e6",
+    "third-party/nsh/examples/gallery-rs/nsh.json": "2fb24c4e6543bc2bff092de362985f73327222af560010bf252a6297789dcd53",
+    "third-party/nsh/examples/gallery-rs/scrolling.test.tsx": "e031f61c45c5cb8ae72589dd098b82717151bc399833798cdeb0f124f912a19b",
+    "third-party/nsh/examples/gallery-rs/stocks.test.tsx": "b4883203b73dbe1fcd7969380b74366e78fb686bcf7eaa245d667c22551173c4",
+    "third-party/nsh/examples/gallery-rs/storage.test.tsx": "2742a6248f6eddeb8edd7e3c54d0392296aa4769513f359f0720d7510f958234",
+    "third-party/nsh/examples/gallery-rs/styles.test.tsx": "1d0e4dc648565509ab1d72ee00c6530c674ce34f3c6e4147a7e3c252d11def86",
+    "third-party/nsh/examples/gallery-rs/system.test.tsx": "7631fb02f1dff502323cf0574d61683e48c2a109500b1a909cfe8d962235bca9",
+    "third-party/nsh/examples/gallery-rs/text.test.tsx": "65b3649a460488742786c96231694c67f5e02eff8dc1f798a32e5d539ab0295e",
+    "third-party/nsh/examples/gallery-rs/theme.json": "7c54621c9c3b0141f1462c689dbeb9e4523463b9c40350735bfcd37151b7a28d",
+    "third-party/nsh/examples/gallery/App.tsx": "23abdc7932398d05aec445e6ed9069be679e1ba6dce1c4b5329e5ed773a9c525",
+    "third-party/nsh/examples/gallery/Bench.tsx": "be900be7d344e643d2af34a072411034d51c88e458b9b219553d88f3949b0ce0",
+    "third-party/nsh/examples/gallery/README.md": "3405f56b12e92872b39c2535f8824c042f9e0fb3432e4e922d630e5c5e589165",
+    "third-party/nsh/examples/gallery/TitleBar.tsx": "6d69ad1fdd30af882cb2fb41cdb5fbb6c52e14887c698ad7e734c09f7f0f8abc",
+    "third-party/nsh/examples/gallery/bounce.gif": "205cd6ffaf6d4575d52ae4eadd01c1a6c689ecb60b3a350f1902a8d63ca3b1ad",
+    "third-party/nsh/examples/gallery/demos/Animations.tsx": "0dc3e53d5bbae41aedf9d809e1588ae0f765348814e984fd37f95f05c09c8cfb",
+    "third-party/nsh/examples/gallery/demos/CanvasDemo.tsx": "32c67d2f9e0fb912b9de43cb894cb2eded2925709b377275e18fcfda5f3eda30",
+    "third-party/nsh/examples/gallery/demos/Chat.tsx": "f7059dd9cd629daf2f7773b986913eb4006fbe6242db2d552ee2e127c9f2167a",
+    "third-party/nsh/examples/gallery/demos/Components.tsx": "b624d75b8624a26190207a23930977facc3d08af9ff486f5e4358cf1c3355d9d",
+    "third-party/nsh/examples/gallery/demos/Controls.tsx": "b43645ead8ae3bd2ab266c32991fa633aed9c38a5c44a4f230d7caeeaa23731a",
+    "third-party/nsh/examples/gallery/demos/Dock.tsx": "978502d170548a5e37d0874b8ac79e441d139233ea1bfc283bf7887cb24f8f45",
+    "third-party/nsh/examples/gallery/demos/Form.tsx": "bd202ff158d6b97d52c17bac8113e285bacddcf340b1f0b3d6a994defb8eaab9",
+    "third-party/nsh/examples/gallery/demos/Gestures.tsx": "d7f73c71bb27bfb5958c611f4d9ba756715d9ce3fea82e4ee5984d1e823db06b",
+    "third-party/nsh/examples/gallery/demos/ImageViewer.tsx": "459fbad0bfaab745e33c749d05b42156043e632dee0c7a219c134ea2b86c879d",
+    "third-party/nsh/examples/gallery/demos/Images.tsx": "95a10c486ecaae820b7e80ab8ac78c45b38b8b379228b3d863d4673ae648f415",
+    "third-party/nsh/examples/gallery/demos/Lists.tsx": "6582ab387279515df8c0cc685e2db62cfb215fa5f7fbb47c90b86db9a1bfe202",
+    "third-party/nsh/examples/gallery/demos/Media.tsx": "fdfddaa2b0407224a54a8b39d32a2d9705c8659917e8bccafe83ee02e6492ff8",
+    "third-party/nsh/examples/gallery/demos/Menus.tsx": "d2799fa49942ec4f7db0890efa8fe8a16f697996854cf6f22a82097122faba2c",
+    "third-party/nsh/examples/gallery/demos/Navigation.tsx": "1a534a80026c9802ec530b9c6b7298fa0e384f40ba96eba27bfd388ca51fbb7f",
+    "third-party/nsh/examples/gallery/demos/Overlays.tsx": "0a8c389b4adbbcf370f86532343b0fe853825656fa47e173169270974552a0f1",
+    "third-party/nsh/examples/gallery/demos/Photos.tsx": "e067ab01360afae1e1ca0764a18a0316b72480418d57db691cc90198e78b0e79",
+    "third-party/nsh/examples/gallery/demos/Physics.tsx": "b35eb1f513c7cb4d97b699950791184ca08ee8f6137ee66e6a5067d51a3525ef",
+    "third-party/nsh/examples/gallery/demos/Resizable.tsx": "0e2ddea81bd16cdefc9693798073c0e320a976f825048858777852ed849b4b42",
+    "third-party/nsh/examples/gallery/demos/Scrolling.tsx": "12ca1a552825ffa82ffdc7e9654f548a107e282a70ba2940aee4efd8c94ba61b",
+    "third-party/nsh/examples/gallery/demos/Standard.tsx": "5bcef6ddae59b320541950e9c581d97bfd503f094f1fcce5a1fd8d55f80f033e",
+    "third-party/nsh/examples/gallery/demos/StandardActions.tsx": "6e190f605305fe0636fcb63f29ac0a739aeac363f02e2bfb8e0e05a0124118a3",
+    "third-party/nsh/examples/gallery/demos/StandardWebSockets.tsx": "afa814cfd645d0baabc7dfe02da8de68dd2dd181cbbc4f9f76ba4e7d890adbb5",
+    "third-party/nsh/examples/gallery/demos/Stocks.tsx": "da704c11e49a0a3e068374d5e5cca312fe80320297fe6c7c515d9f4d599202d5",
+    "third-party/nsh/examples/gallery/demos/Storage.tsx": "c22cb17fbe1424723b44ba253b79c7ff81e4b0d480b4601c81a37ee1010cf931",
+    "third-party/nsh/examples/gallery/demos/Styles.tsx": "16b974a2a5323e60d89be5e94fda7d488379223f09f3befae47a219d1bed0cad",
+    "third-party/nsh/examples/gallery/demos/System.tsx": "43875fcc2afaf04a40f3c10617d5d6c3c300cbfb1f2a13df1864a40b0030dbb4",
+    "third-party/nsh/examples/gallery/demos/Tailwind.tsx": "70b9b99baa076eb14bfbca2dcdc6ddfacf01532659d9e13cd9cd075e39e185cd",
+    "third-party/nsh/examples/gallery/demos/TextDemo.tsx": "20bcfd43dbfa074187c4926cd38f5b1bf217073a4ee9a9467f99eee46300ff21",
+    "third-party/nsh/examples/gallery/demos/TextViewDemo.tsx": "2a5c345d3370a26c957470e92d9497c097055bda66d188e192cfb9651acc5319",
+    "third-party/nsh/examples/gallery/demos/chat/glyphs.tsx": "d78348397874fb8320d94ee53fc1db5678f5726514b98fadb6d4d6a080a67f90",
+    "third-party/nsh/examples/gallery/demos/chat/local.ts": "db4aa41fca179bacaa4acaec9cd5e0ad93ac56209f4aa5d7578596af6ebb6719",
+    "third-party/nsh/examples/gallery/demos/chat/markdown.tsx": "d81a616cab362fbf92176b20f7864c5385c33992a4253ce2b56bc1bc9321ed0d",
+    "third-party/nsh/examples/gallery/demos/chat/parts.tsx": "0269c21403b67663463e30c18ce83eac46e07423f6654cbce638499f7daf502c",
+    "third-party/nsh/examples/gallery/demos/chat/scripts.ts": "2a9b3b5cb871c16af71eb88bb2fe0882cc26a375b5b002e3c3cebb350bb5a10f",
+    "third-party/nsh/examples/gallery/demos/stocks/Book.tsx": "f789e36d585901d8f0037e7829644d645856bf0c428242cdf95ea4c554c90db6",
+    "third-party/nsh/examples/gallery/demos/stocks/Chart.tsx": "b1a527fe9e6b6a82cc99672c272cdb03aa49b313be7e16b284254e28b7f13b9c",
+    "third-party/nsh/examples/gallery/demos/stocks/Detail.tsx": "8ce26063e7c815631d9e678e79dcbc0bf1407407ab11a7537319fb71594642d0",
+    "third-party/nsh/examples/gallery/demos/stocks/Tape.tsx": "e3e8cb4eb5ceb01298c23edc2c880be7844b07de872a5a2aa8cf9b692101381f",
+    "third-party/nsh/examples/gallery/demos/stocks/Ticket.tsx": "5e09e782f194b1d44731d60b2cf3a1dabce53021ff83e4c2f58d0607c39a1b96",
+    "third-party/nsh/examples/gallery/demos/stocks/market.ts": "0bed9ac90a020615e6dc01f7d7daf7bccb11766829efae605da31d2b350db839",
+    "third-party/nsh/examples/gallery/demos/stocks/parts.tsx": "a38a28cafabb933683d728864e2de505600995e1cd50f1ed19a70de5c0832edc",
+    "third-party/nsh/examples/gallery/fonts/OFL.txt": "a47e5daeda73568969395c656823102678f2eefb0d7d7ecb47aac4cc17e42204",
+    "third-party/nsh/examples/gallery/fonts/Pacifico-Regular.ttf": "5b6c0d5334a7bf77dea52b975c5a0c408878c0f7115ed5b6fb151f634b7bf701",
+    "third-party/nsh/examples/gallery/icon.png": "9a7291004ee88f60e4d830ff974db21c38263a367ccca7b804badbcbabd1398f",
+    "third-party/nsh/examples/gallery/icons.tsx": "9e9fd1a218fa14e8ba66694574136224cae8f904f355072d4e889f3d2ac4ba1f",
+    "third-party/nsh/examples/gallery/logo-dark.svg": "d7eb08459a0624c40d6332c0562e8773e5e90bbb62fa110f5b9c7a43f6705516",
+    "third-party/nsh/examples/gallery/logo-light.svg": "4f5a84e5419c54d00da108070bd1785f1e1dd8d09d1c9fa6634fa1cb64f12396",
+    "third-party/nsh/examples/gallery/logo@2x.png": "ac8c8d7b052f7ca39f8bba0a2a89ee8f971dde02ef9fe86f75b94535e8d3c48c",
+    "third-party/nsh/examples/gallery/mark.svg": "a2a315ee0bc3a366e7287aa27c09e7df031baba90e1e6860d08d1cc872187ff7",
+    "third-party/nsh/examples/gallery/nav.ts": "8c5d5a486060a2d8b6364620a02cbcb338f3205b57406f824ac0e71ab9e469be",
+    "third-party/nsh/examples/gallery/nsh.json": "434d367db167db3be3f78c6837b28dcc98809a5c32d82a01e4042c97fcf88587",
+    "third-party/nsh/examples/gallery/spinner.webp": "43b19bf2baa2704f8387c7b28b02f9349814d1030f5679ac9825fedc3495047b",
+    "third-party/nsh/examples/gallery/star.svg": "1d3a1718dc70730c937a7f4aaffc857279360ba0cb46364aa94629e49ea5c6ed",
+    "third-party/nsh/examples/gallery/tests/context-menu.test.tsx": "9e79c3bec515230f44e161c0f794a1a1a6ef80545ca864bf0f4d22389fba12f7",
+    "third-party/nsh/examples/gallery/tests/controls.test.tsx": "09175e91a6c688e0a9e536fe288edc6bbfc122a38272428f1d70eeb20990b65e",
+    "third-party/nsh/examples/gallery/tests/device.test.tsx": "172db9aab15889b245c23952be2ae2a89d0468a5444b7c9251eecfed7690c66e",
+    "third-party/nsh/examples/gallery/tests/dock.test.tsx": "e036272c678080734a416bb04aefe792a919f3dbaae8c072afd8bf7d651b6e72",
+    "third-party/nsh/examples/gallery/tests/environment.test.tsx": "01b64b766ae475845934d25978d469dadb3ac0796ea776e7b7287f9cb102379e",
+    "third-party/nsh/examples/gallery/tests/error-boundary.test.tsx": "f71d9c316fcbea37f15a7b3be31b7e82aacb09c6b550553f3636dccd9534e94d",
+    "third-party/nsh/examples/gallery/tests/fixtures/error-boundary.tsx": "94516c85cc83f4824d71bcfac24ba972d5dc3bf6ea39060752a5d6e097ecca7a",
+    "third-party/nsh/examples/gallery/tests/fixtures/list-search.tsx": "ead5f110c6bf3885ea230b10c2a80fb0891d26c69ba46e33a437c6e89c381143",
+    "third-party/nsh/examples/gallery/tests/fixtures/press.tsx": "a91869ba8b693abaa3ca130a46bea568a4c251f20e4cfa7db6965a45a456181e",
+    "third-party/nsh/examples/gallery/tests/form.test.tsx": "8a82127b536f73bf3fbcf23881cf802b30d0346314d2783bcf9da52d45e3a49b",
+    "third-party/nsh/examples/gallery/tests/gestures.test.tsx": "adf7fcf2afe5029f2441eaf048251a1d33530467df91747f170968fbdc6f3a08",
+    "third-party/nsh/examples/gallery/tests/hover.test.tsx": "dae609cc2f03243b33ef3d46f58b1dadef73645b1223f1796c3f246606baa5bb",
+    "third-party/nsh/examples/gallery/tests/links.test.tsx": "db1b97338bc81b437228d2015926f55a469fb1ffef35cdd57961977952003963",
+    "third-party/nsh/examples/gallery/tests/list-search.test.tsx": "80eaf7e15d7f285662f1c29c662ac075722f04a0cb44220f8a1a5c55033f1ac6",
+    "third-party/nsh/examples/gallery/tests/menus.test.tsx": "2db06b0b97d2a3dfcaae959fcec37452980158e93a97a94ceda2e318a2f39313",
+    "third-party/nsh/examples/gallery/tests/navigation.test.tsx": "76fcd06532791d18abb88afef2c951ab950adf148f10ecd1e8fe32cc3a718569",
+    "third-party/nsh/examples/gallery/tests/network.test.tsx": "aaab1989a62f65e9c92c69ef8fe56fdba65677db382a00796b37b21199bd7d15",
+    "third-party/nsh/examples/gallery/tests/overlays.test.tsx": "f1e07399e01354e592cb2444a51bae46db6812870ff3d3badc99c37af8bf34e8",
+    "third-party/nsh/examples/gallery/tests/photos.test.tsx": "7d8823e844d517c85439f28bccc909c242f5ae4bfaeaaa9c422025c6f81805ef",
+    "third-party/nsh/examples/gallery/tests/press.test.tsx": "264fdac63a1fd6df10d865b5f3eee809664dd2e77f3f05497bfe7865d7d0fa13",
+    "third-party/nsh/examples/gallery/tests/resizable.test.tsx": "35ece487be79c234116627e82c41858371f92fc1fcca1c197a9e53a366a1d3cc",
+    "third-party/nsh/examples/gallery/tests/shortcuts.test.tsx": "50429ff08d7c11cc3664841cdc53395f64b60b130ad0913201364500eea4f5cc",
+    "third-party/nsh/examples/gallery/tests/storage.test.tsx": "70580dd3e0165d4e7e5dc971d633ddd2ce58cc80b504e0a45fd52c9f97ff6712",
+    "third-party/nsh/examples/gallery/tests/text-view.test.tsx": "b14aa31a954217c7aac1ad5022c55082a607fc8010d52ec470bcdc74900d69cf",
+    "third-party/nsh/examples/gallery/tests/timers.test.tsx": "2e89d1097247ef6bed7ce0dc92ba6ac06ed5504cf75ed10cadd2993149f2f855",
+    "third-party/nsh/examples/gallery/theme.json": "0a8a68062681820514e2cd00fe11b8dc37e39d654a9e5b2dbadd873b81857342",
+    "third-party/nsh/examples/gallery/tools/echo.py": "4d39f83c3c71d9ba114d4bdf68ab34b145a728763098f6757c7a351697969953",
+    "third-party/nsh/examples/gallery/tsconfig.json": "9cc30d6cb1f4394c49a8aaf0e4e0126a9a137ff98e2e102ba38a8cd405689dea",
+    "third-party/nsh/examples/gallery/ui.tsx": "f53027f23a14db45280d65587f1a087879ffc948c5d35bdf1ccd8ac31a4c75c3",
+    "third-party/nsh/examples/hopper/App.tsx": "85d70a0d3c3d990d268c5c7e7ab1e0c31cd82f744a69792b51baf8eaa82c34ae",
+    "third-party/nsh/examples/hopper/FINDINGS.md": "91d87633939eec8a47587b5e7d33d6c0730784f9de1437638bdb5c064747f14d",
+    "third-party/nsh/examples/hopper/cards/FlightPlan.tsx": "3f2550f44b7ae44ebdd55f3ab80b64f0ac3965afefd7f236c4736de76b216acb",
+    "third-party/nsh/examples/hopper/cards/HopLog.tsx": "f8468e750c65b07cf708f67a2a0561d8d8d202caf3f27d58b28487f0e35b034e",
+    "third-party/nsh/examples/hopper/cards/Mass.tsx": "bf3f2cbbaded48792d21b056326e742f8eb8dabdb9d8f1ba045650534392778d",
+    "third-party/nsh/examples/hopper/cards/Rcs.tsx": "6d394e99d537a9517d602d45b87d8f4e7b14b72baca63cadce2cd22bd58be502",
+    "third-party/nsh/examples/hopper/cards/ThrottleProfile.tsx": "39d0b0914050c9a73271ec22fd13a9dd94e20087f8c45125d664568dc09f0588",
+    "third-party/nsh/examples/hopper/cards/Tilt.tsx": "86c7ad768f27397e9abb252cde7a41f502f952fd851d97b678bcd546086a2738",
+    "third-party/nsh/examples/hopper/icons.tsx": "24eb3890fba80a03878d95fd926e9500bf3b4ce0cb14ee4ca1a72e49009ebe54",
+    "third-party/nsh/examples/hopper/nsh.json": "09e806d0b189e178cfbb19b54fb536b66340e786f38b3cc6d2d46d06d162ac79",
+    "third-party/nsh/examples/hopper/store.ts": "883dd9d529825737a3680e1c1c5c51733cd317d53d274eb8c5aa45c7cc1d106b",
+    "third-party/nsh/examples/hopper/theme.ts": "635f518b81e7408e5969ca59dbd25860381857f37e9980d225a1a54ba373a38b",
+    "third-party/nsh/examples/hopper/tsconfig.json": "9cc30d6cb1f4394c49a8aaf0e4e0126a9a137ff98e2e102ba38a8cd405689dea",
+    "third-party/nsh/examples/hopper/ui.tsx": "d896dfce94d4c96585275f3b47e2e418e2867ef8aeec5c6148adf3401155f8a0",
+    "third-party/nsh/examples/rust-exports/App.test.tsx": "98df2fa881eb3b6d1c383c0b6f77d6753d178e93df556111258dbdfc66db7cec",
+    "third-party/nsh/examples/rust-exports/App.tsx": "3c64df906f96cc4495f481c133713d33e9dd95c493f449a0e7aa7342a34b315b",
+    "third-party/nsh/examples/rust-exports/README.md": "6e6e2798773876a6c586ce914d31680f2a2890c0d65c3067c794dd946d86c2c8",
+    "third-party/nsh/examples/rust-exports/native/Cargo.toml": "54ba0ec3b6f4aaaad8cf17242c53af6129eb79e89a278582f7a28d3fafda647a",
+    "third-party/nsh/examples/rust-exports/native/src/account.rs": "00be7b67204269bfb97e20c1ae83b592a271903302e1219c7f877bee7b150ed7",
+    "third-party/nsh/examples/rust-exports/native/src/gauge.rs": "78580331f71349a55d3eee6fbdd54f85d080bdebceb0fc6307e2b300915fce88",
+    "third-party/nsh/examples/rust-exports/native/src/ledger.rs": "2b43ad8867aee12785762c9e7c69b619c8fd7fd0925d31c299a3140d13f81c3a",
+    "third-party/nsh/examples/rust-exports/native/src/lib.rs": "b5ab3ec195c9c05574852da024394ed2325dba69fec1e7e63db8ad0fe7b5fbdb",
+    "third-party/nsh/examples/rust-exports/native/tests/rust_exports/common.rs": "ad4d858cc72451ae1e2d643783a7074cab52526a4339972c9233a56c36621dd5",
+    "third-party/nsh/examples/rust-exports/native/tests/rust_exports/declarations.rs": "727b615e3e693199ad1c872fafc8d2c998eb4f9a6b462965f652d6a88655368c",
+    "third-party/nsh/examples/rust-exports/native/tests/rust_exports/main.rs": "3f741597450df613a9aa2ae97de97ba7b0630b5b3258cf0147c582726c46bc54",
+    "third-party/nsh/examples/rust-exports/nsh.json": "faf81eb8d80f38b694a9eda7cf922f1bcdaf57aad533158bb69d7d91baf49890",
+    "third-party/nsh/examples/rust-exports/tsconfig.json": "9cc30d6cb1f4394c49a8aaf0e4e0126a9a137ff98e2e102ba38a8cd405689dea",
+    "third-party/nsh/examples/terminal-workbench/App.tsx": "2c90204422607f3ff8fc2c2bffc98f60db3d481b211c7c7e2a6d58acdc90c17b",
+    "third-party/nsh/examples/terminal-workbench/README.md": "ddf52e57485cba0b71d056163d948c6416ec5fe4337f050bf43f8b202515252e",
+    "third-party/nsh/examples/terminal-workbench/assets/OFL.txt": "e1b964e3f56697598c46363a8864f0a7b883c86a0c01a9a6a4e90e6949d60ba2",
+    "third-party/nsh/examples/terminal-workbench/assets/Pacifico-Regular.ttf": "2c847d07b2b6950021d984fa38cb2241554254d97944718613cbd88a32d2c07d",
+    "third-party/nsh/examples/terminal-workbench/assets/runtime.png": "ac8c8d7b052f7ca39f8bba0a2a89ee8f971dde02ef9fe86f75b94535e8d3c48c",
+    "third-party/nsh/examples/terminal-workbench/data.ts": "d8c8292908d26aa8d3cb335a0a4136850d6f9cd53baef532b77a187c01322fe1",
+    "third-party/nsh/examples/terminal-workbench/inspectors.tsx": "cefda642269996b368b5b8bea8554e40bc3e9bad80f4de288bafda5a91f4b643",
+    "third-party/nsh/examples/terminal-workbench/nsh.json": "7e0d5ea84d1b6fb20b3e1e73ac25f0689a9fb8e15d28290030f5d52d8f48b0d5",
+    "third-party/nsh/examples/terminal-workbench/theme.json": "011311ae936946054c7348c8a2e566a27e662141dc085ed58ffec79f75a1a1f2",
+    "third-party/nsh/examples/terminal-workbench/tsconfig.json": "9cc30d6cb1f4394c49a8aaf0e4e0126a9a137ff98e2e102ba38a8cd405689dea",
+    "third-party/nsh/examples/terminal-workbench/ui.tsx": "8a83d61ab55f4a3678cd6d09ef71fbfe28827b3a5bb283b0e3a198875a381779",
+    "third-party/nsh/rust-toolchain.toml": "2621c6abe1f37e10afdec13bb974ae920a5de538367504725d2e20792ea79029",
+    "third-party/nsh/scripts/layerfs": "be28fd34d5316cb799d0f2ea042395b478ebc5c3da6dd300c63907efa56ab273",
+    "third-party/nsh/tests/compat/cases/android/App.tsx": "4955fb9e19e6a54908266f59c8d12c30b6a29e745bd2b11479044d86f68858cf",
+    "third-party/nsh/tests/compat/cases/android/base-dialog-android.tsx": "1e5c87c083856c8691bd4e95d0209d150c56f11b486a95e95d8d6896866412d8",
+    "third-party/nsh/tests/compat/cases/android/nsh.json": "5ba36bc6e298ca19a83a93c24fcfef0645341bed68564870f74b4b8c88e7d5ed",
+    "third-party/nsh/tests/compat/cases/android/props-platform-android.tsx": "673ad7ff955f51a56dba48d12d0a8430582129907f2cd531f1681bb806072667",
+    "third-party/nsh/tests/compat/cases/android/props-view-android.tsx": "a14407c8d93dd26d709c420f0a58a820697943af1d0c4c9a5516b5516a45a557",
+    "third-party/nsh/tests/compat/cases/android/script.txt": "32fd798589800e9d1515885da38dd4052d74ccc623789cb5e1475c87faf4f147",
+    "third-party/nsh/tests/compat/cases/base/App.tsx": "4dc9afa59e0486f59af881da594a96c3517cea2c5d2af2f1b073d63fab3ab232",
+    "third-party/nsh/tests/compat/cases/base/base-alert-dialog.tsx": "0c7123c3ff9cfa130edb8c327b8dabf3834ba29366adc38cfb6e2e8f0c46d18a",
+    "third-party/nsh/tests/compat/cases/base/base-button.tsx": "686514fc9f01b558d0cb673ab4fadbfda56a60c727870c7856155c0eee13817d",
+    "third-party/nsh/tests/compat/cases/base/base-checkbox.tsx": "3999f9b6ac962d616be733b8d729e79b14ac853467b965dfbc0ebfc53ce8f01e",
+    "third-party/nsh/tests/compat/cases/base/base-collapsible.tsx": "47803b6410ae6797abd38392fceb626286e4977941554d83211bc0c7f1b82501",
+    "third-party/nsh/tests/compat/cases/base/base-dialog-backdrop.tsx": "331cc62be8aa96b87bcb74755ee3271b730746501e67f6d7bf064b4fcccd673f",
+    "third-party/nsh/tests/compat/cases/base/base-dialog.tsx": "d81698c49ce4fee67b514c950424d456ba8efa0c1f84eb2f4346aacc748640ac",
+    "third-party/nsh/tests/compat/cases/base/base-dock.tsx": "c5c7a4d9bfb77994f1cad20a21c7f2be7937a5d899db6c0792b4d570d043aeec",
+    "third-party/nsh/tests/compat/cases/base/base-nav-page.tsx": "abeb2bec820acacf03f2e36a1d0c92cff9151b2df75d37e762e3e17de8979d4b",
+    "third-party/nsh/tests/compat/cases/base/base-nav-stack.tsx": "8896001549d81fc426ad065e339516cca65461987423b4455378ef1080925a4a",
+    "third-party/nsh/tests/compat/cases/base/base-popups.tsx": "913c32eb06277965eb336940988e1a73d5bec24be7f23bdaba5033f75c54a5eb",
+    "third-party/nsh/tests/compat/cases/base/base-progress.tsx": "b8e3871f8413e94a5a678e3686cdb24b157480d18b8918562f04962f184635f5",
+    "third-party/nsh/tests/compat/cases/base/base-radio.tsx": "ca426caa1f06b9d3dfd9926115234d4e7b9a312d1e478c6d842c7a9b734348c4",
+    "third-party/nsh/tests/compat/cases/base/base-resizable.tsx": "5f5a3988b4cd9b0403c26e24a814d65dc7bdcb4f2087a3b9afc14fb50681ec60",
+    "third-party/nsh/tests/compat/cases/base/base-safe-area-keyboard.tsx": "6d892d2c955368475cafef4f2942991e2004c987e7bd4c150b0000ce641c2e51",
+    "third-party/nsh/tests/compat/cases/base/base-selection-area.tsx": "9a29f332145be63b366d2880249d19aadcf4696b7b7ed308da103889f620d0dc",
+    "third-party/nsh/tests/compat/cases/base/base-status-bar.tsx": "bbdf1ccd78c9a014eb872936d973eda83431741291254012eaaf14c723aeb93c",
+    "third-party/nsh/tests/compat/cases/base/base-switch.tsx": "a9231f5d8d6fc6ecadd3314a8e7b55319688bbcefab593f4e82c447f8d1f5fe4",
+    "third-party/nsh/tests/compat/cases/base/base-tabs.tsx": "4bfd3ad3e8ec7010281c45a9a2ea12f82de615d101af96acdd4b47f3991bcc76",
+    "third-party/nsh/tests/compat/cases/base/base-text-view.tsx": "86464dbbb402a61d0bd34ea5376b3b17928bfe8938370eb10237cfb39e99f616",
+    "third-party/nsh/tests/compat/cases/base/base-token.tsx": "37abe78636fd087039b3eec86850ebacc4e91ea264bf3f20428d97e1fc5950b2",
+    "third-party/nsh/tests/compat/cases/base/nsh.json": "4252ae25e6e83b77c786ff8ff5286ed99522a48fb687ddde878c25bd7008ca48",
+    "third-party/nsh/tests/compat/cases/base/script.txt": "cb01f6afd308a9a3d7c32404e17b13a425b0ef775043ff3e6e7f55aa8a01aced",
+    "third-party/nsh/tests/compat/cases/browser/App.tsx": "72b4f42309816d782c54a9a47cd5449f666f3a0ab1395a6eb86eef80b855c6dc",
+    "third-party/nsh/tests/compat/cases/browser/base-popups-desktop.tsx": "c8a3f5b9fe085cec13ec3597ab3ba217adf6a388acec272c3ba57a8019be49fa",
+    "third-party/nsh/tests/compat/cases/browser/nsh.json": "cf16c9baa65e26e70482a5940097af2ea41afc3aced88748ca68dc765bd7c5f0",
+    "third-party/nsh/tests/compat/cases/browser/props-media-webview-desktop.tsx": "776bb9f011f3763094095a607e30be378e9e99c662b11157c748be1e623ce76c",
+    "third-party/nsh/tests/compat/cases/browser/props-platform-web.tsx": "12c78651a7af29d5ea404b2a82428d7117bb26ae1a699d1da9c2a292dec81dc0",
+    "third-party/nsh/tests/compat/cases/browser/props-text-scaling.tsx": "3b2b2e6acb31e2558c87db0eef35b32b0f1f3912cd3139e165624ab6fb515d86",
+    "third-party/nsh/tests/compat/cases/browser/script.txt": "205c72d1805faf19c9812ab3b932b2ffdde3aa5e9ebcb42ae3b65b6448b1a9c5",
+    "third-party/nsh/tests/compat/cases/core/App.tsx": "3a2c8a4bcc21ff3e0b5ca249040c26d6f3098ce3969f35b69bdea5ea065d0ca2",
+    "third-party/nsh/tests/compat/cases/core/context.tsx": "fa753baa976168d9a7cb9714c5627c599ed40990eed28cf98661b08a3639345e",
+    "third-party/nsh/tests/compat/cases/core/core-animated.tsx": "3ca4583291070c4d65423c5678ae87d73551886f4e23c06e2bf3254574d53456",
+    "third-party/nsh/tests/compat/cases/core/core-canvas.tsx": "844774320ca0950753e5e519b15a20324aecbb1366b86efc21c3a6f9f217cd48",
+    "third-party/nsh/tests/compat/cases/core/core-elements.tsx": "01a11f0e26936bbfe2d9711c7d2460d9fafb61504437efa3b7e8b12218372635",
+    "third-party/nsh/tests/compat/cases/core/core-error-boundary.tsx": "c2de89bed501a5483446830f8ec19e0a1fe7131fe0af8c0fbf8dcb6b9942979a",
+    "third-party/nsh/tests/compat/cases/core/core-input-action.tsx": "9e6c67b4c7cad5580219045666bd1f5d91ea377c3a371717adb9d25950194a59",
+    "third-party/nsh/tests/compat/cases/core/core-list-binding.tsx": "b9e52b8e5f875188a98b09226d410410318846c3df9f97b1852365e063fe7dbd",
+    "third-party/nsh/tests/compat/cases/core/core-list.tsx": "1851cf6e7c7b0bdc7794eb2fa12b316b8e0d96fea3dd1e99398e54d1c013ec9e",
+    "third-party/nsh/tests/compat/cases/core/core-overlay.tsx": "96a006df0796850f1b9dfa68cc4fe5ed6868988635ec7f47713523c47fa303ea",
+    "third-party/nsh/tests/compat/cases/core/core-primitives.tsx": "2dc25a3b00f0f6c3450128d85b52c6354e42618f0ce6599cd7b3196bea81df12",
+    "third-party/nsh/tests/compat/cases/core/core-reactive.tsx": "bcde98c407709730db5a6d2a620f01f322804d9184f0f727626034660ad2f5d3",
+    "third-party/nsh/tests/compat/cases/core/core-ref.tsx": "d8c7dc4e6d0248c486c142d2660e3d8db14ee03733a2e5511c143e58ca202311",
+    "third-party/nsh/tests/compat/cases/core/core-resource.tsx": "cc3d33c1321a04615b7fef7ac0d759fa5d76e7a3f5aae671c5ebff050a2769b5",
+    "third-party/nsh/tests/compat/cases/core/module-url.tsx": "8bf4a7a606496d4d5f321a8f722892de01e845d56bec5f42d9767ab3c516bb1d",
+    "third-party/nsh/tests/compat/cases/core/nsh.json": "c4354909c4780abb723666fe31c2c82d50cbe3839f62c169dc0ec2f145d8a728",
+    "third-party/nsh/tests/compat/cases/core/script.txt": "46009ab58c932240d2aa0997b14d47eac6a9d01c92cbe845b73df3abcd7d0bd2",
+    "third-party/nsh/tests/compat/cases/core/steps.tsx": "bcfbdf96ffeb91d9d4cc5abd0a562cf612fe73c04ddf9d8bfdeb5a7d14aacc37",
+    "third-party/nsh/tests/compat/cases/core/tsconfig.json": "9cc30d6cb1f4394c49a8aaf0e4e0126a9a137ff98e2e102ba38a8cd405689dea",
+    "third-party/nsh/tests/compat/cases/events/App.tsx": "cec0a2e9ebfbf3c0c0b1d6e05760023d66bad7b30ec1e27b0213ad6752eeee38",
+    "third-party/nsh/tests/compat/cases/events/events-composition.tsx": "a346687f3b7d8bf0de0164e6c9ba5e39b73d9ba1a5f6446f6f4f2eee53a80c81",
+    "third-party/nsh/tests/compat/cases/events/events-context-menu.tsx": "fc7f7576555e1843c465a209691cb41d07cd9f9563cbd8796f4462aae4a8141f",
+    "third-party/nsh/tests/compat/cases/events/events-gestures.tsx": "96dc73c2db962f20eb131d6c64d28bf79cb2222d04a216183556de09c484871f",
+    "third-party/nsh/tests/compat/cases/events/events-input.tsx": "5a193a435aed58408410c58c00c169f4d28fbbb2623ecb82a32de0e3d646f6c1",
+    "third-party/nsh/tests/compat/cases/events/events-layout.tsx": "e40bac5244adab769b96f9ad9c8148bf2ee52360fdb2d3847f97d5f9f627e4c6",
+    "third-party/nsh/tests/compat/cases/events/events-media.tsx": "93b2eb15f65e675351aa45ab2d0537fc92b5f9b16b23b9e90b295bbddc91f25f",
+    "third-party/nsh/tests/compat/cases/events/events-pointer.tsx": "8138debab8e52f7d2cfd98b958c7d9ed3545a800c3ebe8516392802c3ebae99b",
+    "third-party/nsh/tests/compat/cases/events/events-scroll.tsx": "27e05af229046eab261aac7890b438bbe9609c7c666b724977cf041ff1bc4bc0",
+    "third-party/nsh/tests/compat/cases/events/events-touch.tsx": "af366a7f9f1115ca567a09f851decffba8f1f856af19b55892b1823c7b850f39",
+    "third-party/nsh/tests/compat/cases/events/nsh.json": "c099a37bbbf26400764fb60d9deddee5fcbb3f7069012b12a9f90e9d7c95ca8a",
+    "third-party/nsh/tests/compat/cases/events/script.txt": "824ffb994af579b1ace0f890ee5631e9be428cae46897bb964681bdf9aa007b0",
+    "third-party/nsh/tests/compat/cases/layout/App.tsx": "afec2a27757cceca246919fc43cd2403c733414bc6428a912b095804f7180ef4",
+    "third-party/nsh/tests/compat/cases/layout/core-theme.tsx": "0805a87b15fd825a41d973bcf1f60276894eca4e1f36e268036fbfbb2a6ef56b",
+    "third-party/nsh/tests/compat/cases/layout/fonts/OFL.txt": "a47e5daeda73568969395c656823102678f2eefb0d7d7ecb47aac4cc17e42204",
+    "third-party/nsh/tests/compat/cases/layout/fonts/Pacifico-Regular.ttf": "5b6c0d5334a7bf77dea52b975c5a0c408878c0f7115ed5b6fb151f634b7bf701",
+    "third-party/nsh/tests/compat/cases/layout/layout-box.tsx": "c07b612e606ad27840328e97e3f04b59937c7f5d97ee484d83599c33862a7498",
+    "third-party/nsh/tests/compat/cases/layout/layout-direction.tsx": "56777df7c495a2a66a0f5fcb1c6060d053607d264dd3e3b3c8a8de2a3af9cae3",
+    "third-party/nsh/tests/compat/cases/layout/layout-flex.tsx": "1ffd6ecd282963ebadd1a023f16ab3f56b5e8ca0f4f9b9e7b76c7985965656ac",
+    "third-party/nsh/tests/compat/cases/layout/layout-grid.tsx": "8877078e72481d34b9d913baff1b29d418d4b205a0f4b9fef88f309939e2b241",
+    "third-party/nsh/tests/compat/cases/layout/layout-sticky.tsx": "57232d29e7aea1052b62bb4190210e8c3d13cc40d647130d3ed9ee0bea89209e",
+    "third-party/nsh/tests/compat/cases/layout/layout-tailwind.tsx": "d3cb3521eb4b38882170a52b8098cc85f0096b52ec87734ea3ea9f28753f8720",
+    "third-party/nsh/tests/compat/cases/layout/nsh.json": "99fa38b7ac5170fd2dc0b243978b5bd2a80fd5e39e4168a2cb3a0f01a58d603a",
+    "third-party/nsh/tests/compat/cases/layout/script.txt": "f20ce8c3685c181069b5eab1ac64c8201205b7380a5a5b1a5141011b19c7fb87",
+    "third-party/nsh/tests/compat/cases/macos/App.tsx": "ecdbbe3e42fbe5641ad68a42a7ff95abd6ca87e0c5f728ef5eafb135153fd838",
+    "third-party/nsh/tests/compat/cases/macos/base-dock.tsx": "a0da2afcf9902aca8229acf133dd1c92ad5661b8e84694d8682cbd50a435bb0d",
+    "third-party/nsh/tests/compat/cases/macos/desktop-props.tsx": "25744e1cc4b46c73761b9a09c8ab059abf97b62ed83e211e9fa27d379e19d751",
+    "third-party/nsh/tests/compat/cases/macos/mod-standard-files.tsx": "3021480d7dbb7c51f28be40c64c2b7a754ea8f4692d8c2896bf6edc8e3054fdf",
+    "third-party/nsh/tests/compat/cases/macos/mod-standard-system.tsx": "17363588e50524931b2a21b06b7319c39864ef77c35d65cd3708524c185337e5",
+    "third-party/nsh/tests/compat/cases/macos/nsh.json": "81592a22d477fd7aa971a58119b710cd6b49d58517f6dac65e2f091567c4c020",
+    "third-party/nsh/tests/compat/cases/macos/script.txt": "adfe51bb062be578136db927b767640d286ee3b4e8847f3446b0cb47a5847514",
+    "third-party/nsh/tests/compat/cases/modules/App.tsx": "a96f5194e1ccd1fbfe3c40d03ab18d4edc78465ffd15c00e768bf041372d40da",
+    "third-party/nsh/tests/compat/cases/modules/mod-accessibility.tsx": "139148dc45f9402dee9aaaf78587690fa4ede4a209ec39c23c2e3eb379ae1e6b",
+    "third-party/nsh/tests/compat/cases/modules/mod-android.tsx": "0bc2aca9677c91fa0d1e3693110581c5f76fe32ea2e0eb3f8fe5d4470395c8f9",
+    "third-party/nsh/tests/compat/cases/modules/mod-clipboard.tsx": "0ca63a3ad7e0b77672e688fb3e5ba3d1fe79904fbd5640646074c1ca22d4951c",
+    "third-party/nsh/tests/compat/cases/modules/mod-desktop.tsx": "23c2fa95911c0ac2be36fd1fddf78c1c7aacfcf7e79e66f0df89b416e8cc3909",
+    "third-party/nsh/tests/compat/cases/modules/mod-device.tsx": "6b384f6830bb0da03344986ec02a1e394d307a5b5ef13dc1fd53ba272d04de34",
+    "third-party/nsh/tests/compat/cases/modules/mod-ios.tsx": "15398c7e334c6067bce708ef6303d534380b1b2d3cf9ca90c7fdd6423fa85b3f",
+    "third-party/nsh/tests/compat/cases/modules/mod-keymap.tsx": "d3d40c3ec2a9d72a42a33335255b93703e1b87f6c94a693837ab79b69ff16ae1",
+    "third-party/nsh/tests/compat/cases/modules/mod-standard-access.tsx": "c6f8c9d94ac06655950666e356af86d219379f95b4d6978c9b81a07077f5fd5d",
+    "third-party/nsh/tests/compat/cases/modules/mod-storage.tsx": "cfa8ffaf50301e957f0da33a075c6f4a8be93e758555d720dab07f7ae473410d",
+    "third-party/nsh/tests/compat/cases/modules/nsh.json": "8aded49d92a6f2cb8db2e005d097aa70f60f26e5e6639b98f45cd89154f3feb2",
+    "third-party/nsh/tests/compat/cases/modules/script.txt": "25dcfb68b52245396ca162aa57b002b0ce100c6c10c5fd48b472de9f9b9bb8aa",
+    "third-party/nsh/tests/compat/cases/paint/App.tsx": "c8bcbb4b62d5ecabe0fc98c7e6524e451193952701215ebe614a92168107c316",
+    "third-party/nsh/tests/compat/cases/paint/nsh.json": "56f891ce05e7aefa7949e3445a603cb477313be037897c75acb12f136c1a85a8",
+    "third-party/nsh/tests/compat/cases/paint/paint-borders.tsx": "388fb9d77dced948c4a014ce42af65f3509153347ad574778983b0263277a428",
+    "third-party/nsh/tests/compat/cases/paint/paint-effects.tsx": "92d6330e45bcd2d69390df6a9fdb8bf9b3624e54e5b2fd18f94c98e37e0093b3",
+    "third-party/nsh/tests/compat/cases/paint/paint-inline-align.tsx": "abfa08e742051af6d51b6f93f70a5606a157163b339b3179abc722242fc7dd9e",
+    "third-party/nsh/tests/compat/cases/paint/paint-misc.tsx": "c2b624c1ecbfd4e3cab81912a0c4d04f94e0bfa9068455d6641c4162b395af0c",
+    "third-party/nsh/tests/compat/cases/paint/paint-motion.tsx": "922a0b7f15ac6954f51790f46b40ac72da90b614c0110021c450547d951dd685",
+    "third-party/nsh/tests/compat/cases/paint/paint-object-position.tsx": "a07c933d99229bc81d28149bfaf2e3979ea1757179222e506b3912e8b36af66b",
+    "third-party/nsh/tests/compat/cases/paint/paint-shadows.tsx": "f2db4d7a911cee37492806b8ac58364327c741336fff62e26825d754629a533a",
+    "third-party/nsh/tests/compat/cases/paint/paint-tailwind.tsx": "cfbd605e4fae8899dbcf5c5bf4e581b4ca449247f59c11773479079a82a18bf9",
+    "third-party/nsh/tests/compat/cases/paint/paint-text.tsx": "a15785ac6930fb23f993a075c609920e8e27ae6d5944d5337ce66d218ebe4b57",
+    "third-party/nsh/tests/compat/cases/paint/script.txt": "4e3e95f94a3673b0418ac17a29aab44742db100604b673226a47041c9de9cd52",
+    "third-party/nsh/tests/compat/cases/paint/state-checked.tsx": "901da26b71b8788c59613c30e76caed42bf06af2d03eda7f93ce82e93f2870cb",
+    "third-party/nsh/tests/compat/cases/paint/state-indeterminate.tsx": "5c4f151a319a825a6d126d2a9261fbdcd8bfa15cf4559702f6ab198121ffcb52",
+    "third-party/nsh/tests/compat/cases/paint/state-styles.tsx": "54a0e10429a2936f088bd0caa72f624f618959e7acb652955b54b0fc8a596b4a",
+    "third-party/nsh/tests/compat/cases/props/App.tsx": "f39be475cc19e72cc2dd2029ddadb6f485261691876d0f12770b4524662cefb0",
+    "third-party/nsh/tests/compat/cases/props/images/flag.png": "9d0f5b97591776503e613b5af88ea88bf6d60bd512f67f1972b56419dde9d997",
+    "third-party/nsh/tests/compat/cases/props/images/flag@2x.png": "8d363bf57a0d07fb8f2a68c5cb584b2c0f7d9ca4985cfb7879a8ce0f9d5749ca",
+    "third-party/nsh/tests/compat/cases/props/images/flag@3x.png": "80b0490836734e9f764ac8ece4dbae4b1410b69bd5e991679e0651bca099f18c",
+    "third-party/nsh/tests/compat/cases/props/nsh.json": "0935bbc40c95dc723fb99570b350a3fb32aa6445e6ec82f41d39d8cd814b36af",
+    "third-party/nsh/tests/compat/cases/props/props-gesture-values.tsx": "3dae98ef930052b4db2379a3fe8d5ae408973a2c6330da312ebcfd16eab8215f",
+    "third-party/nsh/tests/compat/cases/props/props-input-config.tsx": "7b336e6d630a19dc98cd72edb1ef92b4f4f3d328bc5ab22aa540136ed027a3a1",
+    "third-party/nsh/tests/compat/cases/props/props-list-events.tsx": "7e1c7de5888a6d8697a627dd23758626d4caadaed350074313ad3bc93cac9eb9",
+    "third-party/nsh/tests/compat/cases/props/props-list-follow.tsx": "b56d208fe8792e49a70ba92c05f37a49815aa64106b08506b0d1a5c025678642",
+    "third-party/nsh/tests/compat/cases/props/props-list-layout.tsx": "8abecc55d234ed69ede5e03aa1d3f00b3ab74f17a123d3c5a51438cd75e55ee0",
+    "third-party/nsh/tests/compat/cases/props/props-list-sticky-offset.tsx": "96867fc653727d144795a2e757f7d8f03dedbe637ed0ad6486c037d447a75e9d",
+    "third-party/nsh/tests/compat/cases/props/props-list-viewport.tsx": "90266c7f58051dca93d7cc24a2a388a44460c432554c3875930ace87beb53dbe",
+    "third-party/nsh/tests/compat/cases/props/props-media-image-inline.tsx": "ae390ac48ad38dcfb2ab687cf854594bb19bad5bfe57615c3c33816938e434a5",
+    "third-party/nsh/tests/compat/cases/props/props-media-image-variants.tsx": "71f3ae02ba210bcf139864deddb4aa8ceecb87b2886a8882f8925c66f51d88c4",
+    "third-party/nsh/tests/compat/cases/props/props-media-image.tsx": "14fac5c4951d70ba551bf01bee0f6ea0970f8eef4a4200de6a986096b80daebb",
+    "third-party/nsh/tests/compat/cases/props/props-media-svg.tsx": "aa67f5ce0ff73d0d26f28986a5508a655a58f36f7fa71bc9a7f1f075d835a8d0",
+    "third-party/nsh/tests/compat/cases/props/props-media-video.tsx": "e707c85cb28b9b5ff0e72257107839573d7260423d09521ef45a610905a2400d",
+    "third-party/nsh/tests/compat/cases/props/props-media-webview.tsx": "f0cfdcfb71f243fa43fff1b202960e96f194e8477aead25e8acf8feaf8352a72",
+    "third-party/nsh/tests/compat/cases/props/props-scroll-behavior.tsx": "da54666957ebfe73a402c4062dd2a3717a3b0e98bb78bd97178df9e1f804db50",
+    "third-party/nsh/tests/compat/cases/props/props-scroll-zoom.tsx": "e9daae6d8dd587dc6abfb155553ffb4132d54b23529867438fba994afb0925d3",
+    "third-party/nsh/tests/compat/cases/props/props-text-lines.tsx": "3710024948e542991ab5cbf874820b50e3bf42aef8f45735e09a1ce69a469759",
+    "third-party/nsh/tests/compat/cases/props/props-view-accessibility.tsx": "f59ad246eb6c125fa7e6c8d56d21b8d4004a002900dea3794de4c0fc0b351151",
+    "third-party/nsh/tests/compat/cases/props/props-view-styling.tsx": "ab99d0e7bfcdf5706312337859f4c197050b9323463454fe784ac21d664c6612",
+    "third-party/nsh/tests/compat/cases/props/props-view-touch.tsx": "cd63fe3a13f94c2dce9e2514d25d85a036f8ac35c76d5f7f0ed3af36fc01f4b2",
+    "third-party/nsh/tests/compat/cases/props/script.txt": "de2ee21e342be1c46a21200bff347a26cce5e19f5c63ba19f5424511bb1a96ee",
+    "third-party/nsh/tests/compat/cases/props/svg/badge.svg": "4c54331a184060435bbbbfb08cbb87853f7993eced9e41da4d73ea9795ba0964",
+    "third-party/nsh/tests/compat/cases/props/svg/mark.svg": "3d466606db574e99f4a4fc4d5d16b0f21ef67c57b4237f52a44c6a931f7e042c",
+    "third-party/nsh/tests/compat/cases/props/svg/star.svg": "29fcd6276b0ffac4e8007306c2a515d8a98f8a7acf4c81d229f367c5b6227dfb",
+    "third-party/nsh/tests/compat/cases/web/App.tsx": "6ab18901354bb197e72177dededb13c0215c62523c4973e76c39cc038da62166",
+    "third-party/nsh/tests/compat/cases/web/nsh.json": "226cd25798893c74e788be269fa4271fbc9778e07897b0262cbdd2983b8beb21",
+    "third-party/nsh/tests/compat/cases/web/script.txt": "dd1238102ca5329b55ce7e5212efb8e7884b4bbd21c5eb3ce2757c12ccb6b08b",
+    "third-party/nsh/tests/compat/cases/web/web-blob.tsx": "28f222752686fcc59bb86c5b1be3bcdffe912d56f85ec8288ac7f848ebb3a949",
+    "third-party/nsh/tests/compat/cases/web/web-control-flow.tsx": "120c64484e943359843cf0c041e17fac89b9b671dd825c9c6b78d20b9dff6d1a",
+    "third-party/nsh/tests/compat/cases/web/web-encoding.tsx": "2ce2ca7933e1a6d464d07d5e1bc3ee77d35f6d7748917d073bd2460c8479ab79",
+    "third-party/nsh/tests/compat/cases/web/web-events.tsx": "defa1c23fda40014e024c823392080d627d4e705e44c9138922440f6ae192eaf",
+    "third-party/nsh/tests/compat/cases/web/web-fetch.tsx": "e48a9b40f40926d7ea04ba6ba1e31776063f5deb48c97ee772ff022a9c8509ee",
+    "third-party/nsh/tests/compat/cases/web/web-streams.tsx": "2003a705974ba9c73f60496d532765964963e4514aca7cc017b2ff354fdc695b",
+    "third-party/nsh/tests/compat/cases/web/web-timers.tsx": "690eabefcea105a35961448620ab2f349a303b6a9a8ed17e6d987267ec2c4983",
+    "third-party/nsh/tests/compat/cases/web/web-url.tsx": "1cde155574de45e7e0a88e983abd2c8ce645c29de67f4cc7bbdcf262e7f1901d",
+    "third-party/nsh/tests/compat/examples/counter.txt": "d02c27854bcbe0f3513eddc181661479192587819a21248a1c787dd17de19849",
+    "third-party/nsh/tests/compat/examples/desktop.txt": "aee55e96c06e7341561411ad355c9eeba172d35d0a39b2fb660dc73b0cc6aed1",
+    "third-party/nsh/tests/compat/examples/gallery.txt": "83cf68ecf6fb51e9eba4490e0fdb6b00241098a7b19a386eab7e98c9c1e88059",
+    "third-party/nsh/tests/compat/examples/hopper.txt": "e047d4738ffc5751afbbfd96ebdfc6b17a9aa9e994d0e7a06e9dee0d8952a8aa",
+    "third-party/nsh/third-party/gpui-wgpu/Cargo.toml": "9ae627feb2ef7089c9bc9568eeef06e5f1e39917e667042fa01036b9ecf49191",
+    "third-party/nsh/third-party/gpui-wgpu/Cargo.toml.orig": "eaa62bfde1c8f05bc838aa1f77506a15b25469bbfa8f8f9adba1e141007a34ab",
+    "third-party/nsh/third-party/gpui-wgpu/LICENSE": "5f78a733701db49b73da93addad8cb74f816f3789ef30c3c0e959e943ecd99b4",
+    "third-party/nsh/third-party/gpui-wgpu/README.md": "49729562e4e3bb4d573b334918675d5bcbaa7eea808a6a5157baca5a2d317880",
+    "third-party/nsh/third-party/gpui-wgpu/SOURCE.md": "015301fbaf7c543d28ca564eb93a81efa82929468fa72449f5c5beec69f38dd3",
+    "third-party/nsh/third-party/gpui-wgpu/src/cosmic_text_system.rs": "cb8750213d25a2e4ccf8ae0f7de726dc702bf49ede069a769832663d445cbdd5",
+    "third-party/nsh/third-party/gpui-wgpu/src/fast/bind_groups.rs": "db7077cc45cc6eac8d30e4dd6840c40b4dd29675abaced53b4f7e21fe830fbee",
+    "third-party/nsh/third-party/gpui-wgpu/src/fast/composition.rs": "1127163f913c2e44f6cdd5ebde6fc9932838eb4e68c7ce528fda32dc0cbac7b4",
+    "third-party/nsh/third-party/gpui-wgpu/src/fast/frame.rs": "825141acad00c3be5dd76414b826921890285ea1b3e6e969de1e0667b2ae816b",
+    "third-party/nsh/third-party/gpui-wgpu/src/fast/globals.rs": "823c5c491879bd4589a92d5a54775a87fb6fb4d29677b5021b348fe29f3781f6",
+    "third-party/nsh/third-party/gpui-wgpu/src/fast/layers/composite.rs": "1b74d15677712b8783b075593247da2f853c95178fb75388e7caf71f912693aa",
+    "third-party/nsh/third-party/gpui-wgpu/src/fast/layers/mod.rs": "9eeacc33e599a381961614cc236debcf47622f60e223a7e9a2bf073ebb7c5ab6",
+    "third-party/nsh/third-party/gpui-wgpu/src/fast/layers/raster.rs": "451abd4f93e63244c0f095b0df845d1b9c6a26c9f5a1bd92e00fab2dbdc49184",
+    "third-party/nsh/third-party/gpui-wgpu/src/fast/layers/rounded_clip_texture_tests.rs": "f0fce47482f7586a8acc8c9c8dfbc32791d5f172ee96748d48d35a14a4ab7b0c",
+    "third-party/nsh/third-party/gpui-wgpu/src/fast/layers/tests.rs": "9b9a1143da405e011cda3a905c05549780a95c7d24db635e46223909ff18cc1e",
+    "third-party/nsh/third-party/gpui-wgpu/src/fast/layers/tile_cache.rs": "95aa0808492b178b20d1185084001b8ae8af97ff0385b7cdd064fa09fa4a4285",
+    "third-party/nsh/third-party/gpui-wgpu/src/fast/mod.rs": "8c064f5afaa48e98588d3d977e4596f6cc523e0b0c7adb9ce2a0b7375988b58e",
+    "third-party/nsh/third-party/gpui-wgpu/src/fast/pass_state.rs": "7e58784ac9e22f0e06d4ed05251947ca21c653da68fbea56e31627ed0a8179df",
+    "third-party/nsh/third-party/gpui-wgpu/src/fast/rounded_clip.rs": "51986b905e4bd2ecddd0873153a9e337405a8f162ce4813bf598104e6c69cbaf",
+    "third-party/nsh/third-party/gpui-wgpu/src/gpui_wgpu.rs": "ae1090ce2777f680840817db1008ddf2074fb175f839abc47ad940fcef3cda62",
+    "third-party/nsh/third-party/gpui-wgpu/src/shaders.wgsl": "bf22f0bd45bdc2da6fc88e5c678e03549941d270d6d85f5a2d1044f875f75729",
+    "third-party/nsh/third-party/gpui-wgpu/src/shaders_storage.wgsl": "5e7935445569ec610b2f7ab520c6d2b3ad8613248fc4465072e8dfae941017ca",
+    "third-party/nsh/third-party/gpui-wgpu/src/shaders_subpixel.wgsl": "d48e5dbb6dd3b278bf34e748c01d6c60bf30e400cacc074c576e0e6b0869d59b",
+    "third-party/nsh/third-party/gpui-wgpu/src/shaders_webgl.wgsl": "d0e1f65206d720604371f2936fb1c64d9e58def4f7ec39a70b9edc3640f27b3d",
+    "third-party/nsh/third-party/gpui-wgpu/src/wgpu_atlas.rs": "0d6a93a49364bddbd205770e6ba059930e1091c855675bbcb418d5e5934a02f5",
+    "third-party/nsh/third-party/gpui-wgpu/src/wgpu_context.rs": "63ee9349b15fa94f7d8c6e00231ac4fb101b0dac5700fe1e45b6fdbf49e4c19c",
+    "third-party/nsh/third-party/gpui-wgpu/src/wgpu_renderer.rs": "bd898c6d0792cc322a9403fab241db713eee4e651a4243c299aed3fd02433e10",
+    "third-party/nsh/third-party/gpui-wgpu/test-assets/IBMPlexSans-Regular.ttf": "975dcda37d80f038dcd143c22e33ca2d97a0cc5a929aace1c749153b0fe1afa5",
+    "third-party/nsh/third-party/gpui-wgpu/test-assets/IBMPlexSans-license.txt": "91c25c350d3cac39da2736d74f7ba37ef648f5237a4e330a240615bc8d8c4360",
+    "third-party/nsh/third-party/gpui-wgpu/test-assets/Lilex-Bold.ttf": "3369214e2ecddb45ae5024b11d45dd637e99e9d2127ab729817d41d72b8a9c68",
+    "third-party/nsh/third-party/gpui-wgpu/test-assets/Lilex-Regular.ttf": "8a467ad5a1941dc7c9cebaee34e3ed9364a73b48393034e363e4b528bd711d04",
+    "third-party/nsh/third-party/gpui-wgpu/test-assets/OFL.txt": "a356708a399e3f54b937ec7d9b722c26dabba21365b60f95c56eb7ebca0dee40",
+    "third-party/nsh/third-party/gpui-wgpu/test-assets/rounded_clip_fixtures.rs": "3311656ed7d47e7c785729bbc4ca888c783f0c87a232e117b0e90dd3734918e9",
+    "third-party/nsh/third-party/gpui-wgpu/upstream.json": "2ef84c5d0d1bbfcbea3e49c134b0dee137bd3f55373fd3c4df8f724313fccf8f",
+    "third-party/nsh/third-party/icy_sixel/Cargo.toml": "68c6932184739db442fe69aadd5ef5bd851be7717368445fbecb5b821e00db53",
+    "third-party/nsh/third-party/icy_sixel/LICENSE-APACHE": "66aaf920a0396276850341369ef155613b76ee53115eaeca2df61efedeb27043",
+    "third-party/nsh/third-party/icy_sixel/LICENSE-MIT": "7110f70a51841ce71ec9a2a156db30561aba84d3ad2323ef88ede17c9aa34ba0",
+    "third-party/nsh/third-party/icy_sixel/README.md": "8964c44e5fc7198d78b81df40757768b0e90f17e08faef60f73562ce1abf9765",
+    "third-party/nsh/third-party/icy_sixel/SOURCE.md": "1c507e8c7f79e1685d0ad39fb0368c4ead70695abc0a52f789f4e5ace038b60d",
+    "third-party/nsh/third-party/icy_sixel/src/decoder.rs": "2ace4e24d1232d7e8b18d7c2e9f5df0bcb37617e169834b31359a4f41c9fb60d",
+    "third-party/nsh/third-party/icy_sixel/src/encoder.rs": "9f2941a073f3df5d1216bb4f71487a3c43b5ceded1ec88cd13a804b4d7e31999",
+    "third-party/nsh/third-party/icy_sixel/src/lib.rs": "126c4edada7c430377a73839c9da93cae95f9191be69c1401fb4ac1cad9cbf5e",
+    "third-party/nsh/third-party/icy_sixel/src/sixel_image.rs": "1e968370dd0ff8c69751213a1ed11cfce6783feabb30c2b5074ac1c4ba3d8503",
+    "third-party/nsh/upstream.json": "ee6d5280d85722915ba22122b8ffe4f8f5b6bf41d1bb13f1139f124471526681",
+    "third-party/nsh/website/DESIGN.md": "f4c18401d414c8881de312ac1c5810af271dfbfe793d8cc0425f09a56b382c83",
+    "third-party/nsh/website/README.md": "50de9faed8cd3b0751991d6168ac6e33a6437dfd36aa15dc30d35b13dfb94284",
+    "third-party/nsh/website/astro.config.mjs": "0cfae54c7791bd915865dc535669b311e4f76001efed09fdb2772d332812924f",
+    "third-party/nsh/website/demos/counter.tsx": "a8db0e3717624d4d572197588029183be407a4844c8f0bda490f9f8de1d7f996",
+    "third-party/nsh/website/demos/el-alert-dialog.tsx": "2c4219a23444e423aa0d7046184f6850f957304e3e99a5c8e883d6f61ae14093",
+    "third-party/nsh/website/demos/el-button.tsx": "cac50c70f502f8c89e8ef5c77340bad858286b9fc3f56c1e3fb893ef9eac816c",
+    "third-party/nsh/website/demos/el-canvas.tsx": "d1a56322db7f5c5bb8504d6c7c343df943c37e2ab33077f88f58df4a57606749",
+    "third-party/nsh/website/demos/el-checkbox.tsx": "e618b37ea739eab3986f177b329cd4fe34c8e355a4530c04b6258a1f7aee6c70",
+    "third-party/nsh/website/demos/el-collapsible.tsx": "e982c8064c8e4e523856c9b7088b5a8a45fd06acd82efdf7f5ac4485c4da8274",
+    "third-party/nsh/website/demos/el-control-flow.tsx": "180be337ffa6a7f5b91b69e98e8539d5f525c50ec1585eb7cd2b6b5c59459f46",
+    "third-party/nsh/website/demos/el-dialog.tsx": "f3ce315672ee344d6ad0c2096bfddfee46e3bfb4b9f34d63a119779a83adbee4",
+    "third-party/nsh/website/demos/el-dock.tsx": "ac9dfd0ad41b816aa38b93d8022724ba806d4586590d353606e5b1f49f34beeb",
+    "third-party/nsh/website/demos/el-image.tsx": "bbeeae85194c4a706b1cce31e907eb6cbf58eda37656fc0d7e9d121e1f2643f5",
+    "third-party/nsh/website/demos/el-input.tsx": "78b6e0151eb635795affb8f75134cd73d6816ea15438ee86a209ff905a3b5431",
+    "third-party/nsh/website/demos/el-keyboard-avoiding-view.tsx": "6ee1901ebeea1d3b33571fead61fe5bc2e04a861f5a96044bd73bcc92dee8b6e",
+    "third-party/nsh/website/demos/el-list.tsx": "ae5cd4c0c79a872103c1ebce57aea0be8cdcac756cb56d8c66e611b37a544109",
+    "third-party/nsh/website/demos/el-menu.tsx": "b34261d5a4ed5212b03ebca2f031050283b61564699a019ad53d584a1c3ff339",
+    "third-party/nsh/website/demos/el-overlay.tsx": "bcc826fb98f69d383ca2e1f7a53ff910abc5d374377b9e804531651289e05889",
+    "third-party/nsh/website/demos/el-popover.tsx": "5c6f5435d81ef30004ba5793dcd738051767adb2253c3aeacbeba600d241e092",
+    "third-party/nsh/website/demos/el-progress.tsx": "d9e5f6ff8fda8fcd78b5221e70b46094127ed127aa14846ad474b98cc4c38b33",
+    "third-party/nsh/website/demos/el-radio.tsx": "52daa00b1b8507ee967f19dc13752a83c9035a8015ef0e23c5c75150d59f1a89",
+    "third-party/nsh/website/demos/el-resizable.tsx": "15f4b9be46aa76267d309f962350eb2d2fdba5e21f53e21a9038815b840e67cd",
+    "third-party/nsh/website/demos/el-safe-area-view.tsx": "cc5c64b54af0a9b87740de2a2b6d9c2b746cfad935bbaf832b96e675100f053e",
+    "third-party/nsh/website/demos/el-scroll.tsx": "f15e7edde219214a38e778d30a96385f1d614fed6250fbd15917c16085274d7d",
+    "third-party/nsh/website/demos/el-selection-area.tsx": "3bbfb254c7cb248632990941e30424bce83a0b153f07b68ed52056026fa906aa",
+    "third-party/nsh/website/demos/el-sheet.tsx": "de9f391f481ca70cc1ad6e108ef703c796f21dd425d492d62cfa0ee5ec6e649a",
+    "third-party/nsh/website/demos/el-switch.tsx": "02f078fa568f23d5a265c04171c130b32b7fc86e9cd26d4b7f987f05134fb0d7",
+    "third-party/nsh/website/demos/el-tabs.tsx": "536a69f41f69ebdec40a4e50ceeff435f174f929ec5f1eecefa89223ad7ca52a",
+    "third-party/nsh/website/demos/el-text.tsx": "b9e97520688e15d7cfafcbc0586a54605adc261533d43dd745d7e542069c1d09",
+    "third-party/nsh/website/demos/el-tooltip.tsx": "3ff60d93f50c091afa394a8b79d0fd0ea531c76d15a81622ebea9d4113ebb795",
+    "third-party/nsh/website/demos/el-video.tsx": "2305cc5fddc56d82bebce77df2ce2f262cf7fad98b2d6527a82bde454ab179c6",
+    "third-party/nsh/website/demos/el-view.tsx": "d20d6c05b4664290c0bdde004fc821a0ff0b7a45ec2d6bb0311ff8c06f83cd8e",
+    "third-party/nsh/website/demos/el-web-view.tsx": "899a5ec24de8f2b7fec3c4e6c5c26291b5a581ac190352f4601956df607734c8",
+    "third-party/nsh/website/demos/graphite-theme.json": "308ee316e99631c55403b85c26971a984570d9167104a8c86e2b7b977c964efe",
+    "third-party/nsh/website/demos/guide-animation.tsx": "205e4f5eee9effdc161b1934d1006074591bff974690096450a68b6d378ed419",
+    "third-party/nsh/website/demos/guide-canvas.tsx": "6ea2d56dafa1181c059abb06f00e7a95a274a92d4c72a143577ab246fc0d8549",
+    "third-party/nsh/website/demos/guide-components.tsx": "fcd572c76ff56b2b40d5e3cf6493bf8aee88882e367a8ca6b37f8490a17f2148",
+    "third-party/nsh/website/demos/guide-device.tsx": "cb33c863faba501e5a1d12b3e8c15b441a8b57cc8c591b6caf2ef71cb97bd938",
+    "third-party/nsh/website/demos/guide-forms.tsx": "23316f0f7c69c8a9e2c1f47da5cb3dc19a35e26fb16dc837343f0fd7d981c273",
+    "third-party/nsh/website/demos/guide-gestures.tsx": "97b3e821b188eaf7cf0b8a18f50b975907c28488aa0630a8956ee6b9d332c492",
+    "third-party/nsh/website/demos/guide-getting-started.tsx": "0c0221e39722705bebba70da253412bc231052b79dfc88727030c3d7de32b094",
+    "third-party/nsh/website/demos/guide-layout.tsx": "6978306b31bd0e19c428c64157ed3ce3d8ff1d7aa7125a0066fbc85fd060a02e",
+    "third-party/nsh/website/demos/guide-lists.tsx": "13417d343c77c2838c66d0f05ef0c99b80fb8b766344a0c4320223aa4d24d980",
+    "third-party/nsh/website/demos/guide-reactivity.tsx": "ed8adbe914a15f72e9d503e19d13088f068232718252f1d9863e2dd551702ffd",
+    "third-party/nsh/website/demos/guide-scrolling.tsx": "5adc6d839929fcce0f0e71b7ae85ebcfad2fbc26a17ebd06dbe5a3ffc4c04764",
+    "third-party/nsh/website/demos/guide-styling.tsx": "68c981670eec856e71c751f72d8836c16498142406dd5d470da65d0d13e20a1e",
+    "third-party/nsh/website/demos/guide-tailwind.tsx": "2500b22e28be4c5074054ac747c8a13ae7725b6dc1d88702348ea7ee75b1bf6e",
+    "third-party/nsh/website/demos/hero-chat/Chat.tsx": "2f271991838e59af5695826eff4624371ad475d07cbb8c70ea3190df345af2a0",
+    "third-party/nsh/website/demos/hero-chat/ImageViewer.tsx": "878292f92d1db0f31db42191baa22411d7e687a5e3717b3d4cfdb8aa25c8eded",
+    "third-party/nsh/website/demos/hero-chat/chat/glyphs.tsx": "d78348397874fb8320d94ee53fc1db5678f5726514b98fadb6d4d6a080a67f90",
+    "third-party/nsh/website/demos/hero-chat/chat/markdown.tsx": "f81e4352e1c1eb317d6c3aede5d97b636e4fef6e7179954a11bffd60de461e3d",
+    "third-party/nsh/website/demos/hero-chat/chat/parts.tsx": "6ed9266ca5ee6e170e0a9626cd516b22ceb48db5a013cd08de3c206dbe2427bc",
+    "third-party/nsh/website/demos/hero-chat/chat/scripts.ts": "838820429f437697bff3b9f5109149b52b62099a349d7d8ff500a54bb6f6b64b",
+    "third-party/nsh/website/demos/hero-chat/icons.tsx": "e51a00112338946cdef8cb7d77f0fc58b918302703c5986c346b600a60739eb8",
+    "third-party/nsh/website/demos/hero-chat/ui.tsx": "36291119249891182b2a95e6592c1a5249ae015c81e249c90d651188910ecc15",
+    "third-party/nsh/website/demos/home-chat.tsx": "658fbe7a1730726092d91eebfa5c4cac759daaf26ed2a1ced288c7054a87e431",
+    "third-party/nsh/website/demos/mod-animated.tsx": "f468f2b5ff736e5b2507626cf33444196f6c1a09a39589a459bd7a77e1d47911",
+    "third-party/nsh/website/demos/mod-canvas.tsx": "97210a9fd0315b8734c12f83315e9fb004d2c59bf414845cfb9f5b41e3e970f6",
+    "third-party/nsh/website/demos/mod-storage.tsx": "a0cc6ee3d3d86111f7028334507efb68e393f11a4f5a7a8b750b65d0e8f6f925",
+    "third-party/nsh/website/demos/nsh.json": "b3400dd7513299f0f28f95778d13e37ebf4a2f3cc580c1413e51f94ca47d8642",
+    "third-party/nsh/website/demos/palette.ts": "82173a588bdbb75f0a1343e693ccfeba80ba2a65e65da0d48a95ac9be8f2e341",
+    "third-party/nsh/website/demos/text-view.tsx": "6f4a3b1e0d87a18de7edea1dfe2a3a538f73060c641f56b94c2bc612e9083cbd",
+    "third-party/nsh/website/demos/tsconfig.json": "9cc30d6cb1f4394c49a8aaf0e4e0126a9a137ff98e2e102ba38a8cd405689dea",
+    "third-party/nsh/website/demos/ui-navigation.tsx": "0ede3abc087bc9a66a69d3efb9f1997dfc0da76008e7c88311b5a13ee4c2e01d",
+    "third-party/nsh/website/docs/accessibility.md": "acc7f899e192a16af5d3a07395a26c87e3ada2e05dfbad8bf453779e461fcb51",
+    "third-party/nsh/website/docs/android.md": "0b9610041d5419f13d07c88c0f3a13b8e4448a6722818f73d44e6d01549f48ca",
+    "third-party/nsh/website/docs/animation.md": "74859043103a0e12b3e2cf22f5b29ecf3cca7dd9e4009801b38c9d5d5aa2ceed",
+    "third-party/nsh/website/docs/architecture.md": "1a7f3fa3704a5e1c5f4dd6c2df4986c07cdaa247977f7b1e3a13464bfd82a8e5",
+    "third-party/nsh/website/docs/canvas.md": "5589e8b7ceae1856e21081b30d3dc424dc977064fcbb711331f25165c962b4e7",
+    "third-party/nsh/website/docs/cli.md": "a62a929b93aba13d6074966228300854273c7cec3e00d9c631f6465cda98017d",
+    "third-party/nsh/website/docs/coding-guides.md": "38953161931200894317fdb0aaa25e5fd65a52b28ac2ac03e2196f771050dca9",
+    "third-party/nsh/website/docs/comparison.md": "f57b203b9d56e03427a11baf68125dd1272a8684e25d2589edc7d09783f8703f",
+    "third-party/nsh/website/docs/compatibility.md": "f2a0af8428dd5232052921e94a6a08914ee4e523c8f3dbac0db51f25c0da6650",
+    "third-party/nsh/website/docs/design-guides.md": "4dfe088c5fe6082cd3e28ec6e88dcc79dc4f8549fc172c562b38daae32277a41",
+    "third-party/nsh/website/docs/dev-server-and-debugging.md": "452ff7754cda3deac1e40ce02e97fde7f3d5b08aca0120a35b677925426928e2",
+    "third-party/nsh/website/docs/device-and-environment.md": "917e119e31b188881f476fe32554db44850680eb396398f982b2953c26e5495d",
+    "third-party/nsh/website/docs/fonts.md": "b0ae53f3e01e979463db256702b931a32cc6a7f426f9b1f3f24eb565048e6bb8",
+    "third-party/nsh/website/docs/forms-and-keyboard.md": "a3a3a439fe04a70ab3d999463eda2fce0aec43331a42cdaa829ef55275ac82b2",
+    "third-party/nsh/website/docs/getting-started.md": "2a8d1e38fcc84969f0284d606606afde0d0894f6ac4c714b8435d259a33b9601",
+    "third-party/nsh/website/docs/gpui.md": "7d6d8be7cb24db6f7dc8478dcda6229aafe043ea7343a848a00bc0c179a02430",
+    "third-party/nsh/website/docs/images-and-assets.md": "25b3f1455863969f1ce2dcb8961a30783c425c3d8015fe51a4ef5a134cfc2aa6",
+    "third-party/nsh/website/docs/index.md": "a1da36647d015a2cce6e01be206bed89c88335d94647fa68278cfb6c585277c8",
+    "third-party/nsh/website/docs/installation.md": "a7b1a6804f151719d35b8b62eb5b3861712a24cd90175730266ee5fb0874027d",
+    "third-party/nsh/website/docs/ios.md": "44c65186662b24a7735887ff1862d58d73d4d03f078d28e513108223c084d0e8",
+    "third-party/nsh/website/docs/jsx-and-components.md": "75c24c3cb56503befc7c06d9eaf67c844318890d9fc989427231ecc9e6e9e627",
+    "third-party/nsh/website/docs/layerfs.md": "827ff94d53cb27ed7a686776b2532de70d0cfaebf0cfc7ba39b433f42ec5342b",
+    "third-party/nsh/website/docs/layout.md": "80c8f0995e88d01959766d6d95e86ead1034599b848e6e572ddc0c554fe5bf89",
+    "third-party/nsh/website/docs/linux.md": "6df424ab04997a1c29fa85ec34ec883c150aaab1f1165d631445f0699a217616",
+    "third-party/nsh/website/docs/lists.md": "b59033e583a9c147c0a7cf7309bf22b3744946b0a6a6bac3ee1a3f079aa51d54",
+    "third-party/nsh/website/docs/macos.md": "83aeb6c4d8214a401cb6413c32cb74b0d62243d59bbbececa32a6dd4ddd18420",
+    "third-party/nsh/website/docs/native-components.md": "cd8272bfb271dece1f395009077a762c972c282bbd9246265ee9f6a4ced0e656",
+    "third-party/nsh/website/docs/navigation.md": "8a4a9ac5d9a44ce8e9a30680b4ab9c0a4d6d4bfd556b8c7347074eefb3ba6357",
+    "third-party/nsh/website/docs/networking.md": "7447d4ffeefffb33318ada3594160ce30a47adabb4c59bb66bd360a465c5a2b4",
+    "third-party/nsh/website/docs/packaging.md": "74a12258a9d6bba2369a5260b957c7a11213e15849b689e9c54fa0c9208d6f7b",
+    "third-party/nsh/website/docs/performance.md": "f6c4652eef83d81abeee6f2d2dfb370b14a7bb78b2dbb25313afe3a25a20dece",
+    "third-party/nsh/website/docs/platform-specific.md": "acca9b1bce6444f64370e60eb2911b6e8467a21dbf2078823236ab22c95ad872",
+    "third-party/nsh/website/docs/platforms.md": "ab8b6bc08448af0307c0080f4fa653daa364c25e9f7dba7efc8437a6fe97406c",
+    "third-party/nsh/website/docs/project-structure.md": "8465844846b69eddb6a2bf532b2cafa8a63e583c5b1ce246952c73d972588230",
+    "third-party/nsh/website/docs/reactivity.md": "8c6731f9556ec0c3a4f401c7861c7198cca53a4bd5e95b57f2f773e7acdbf7a8",
+    "third-party/nsh/website/docs/rust.md": "b3d18c6b202c136d7efbba0f7f87e9d0ae26d2469551f1bb09f47e955333ed34",
+    "third-party/nsh/website/docs/sandbox-and-capabilities.md": "4938ef6da08859de906c236ead2a8e70a478c599580dbbfb3ed2201de4bb0dc1",
+    "third-party/nsh/website/docs/scrolling.md": "54356ccb5d65b3f37263339c91e1fb0ee2bc5db32729a9e9b235f2cce51e6850",
+    "third-party/nsh/website/docs/signed-packages.md": "203da373bbcf21d84240b2626d91860e4f3d745733cbeebc22a42a042d0185ee",
+    "third-party/nsh/website/docs/styling.md": "30ecef6fd8f7e881867574898cd05dfb7bb943a996a8da48db2dbfa8af1c4bd3",
+    "third-party/nsh/website/docs/tailwind.md": "0bfcc244e1cd81cdb3fdbed95c36af126a1284a2f559712007005927c4bea4af",
+    "third-party/nsh/website/docs/testing-and-trace.md": "a0713c55a7c8c1091c85209fd43fd74911a1bba4bf78f871de0676a894b9112a",
+    "third-party/nsh/website/docs/text.md": "afecd14b1f27f340c52dd22666b26f014edd698f1d4ce96dd61188d5203e74c1",
+    "third-party/nsh/website/docs/touch-and-gestures.md": "4733ec6aad04835324c174900e099737e39bb6cffa84227959193d95c5d2c39c",
+    "third-party/nsh/website/docs/tui.md": "28f225fcce009393ab1a3a1ac672b3cf3a599e3712fbd344516ac0d3b8a2f7a4",
+    "third-party/nsh/website/docs/web-view-and-video.md": "249dc38d55b3549052396f782f8087d3abae3e81c57fc64b24589f352acadd5e",
+    "third-party/nsh/website/docs/web.md": "1aa3728395fd9a551a0f8fa34d02d384191d8fa82ab52ed85e852078951ba817",
+    "third-party/nsh/website/docs/windows.md": "e715393ff39d08901c3a21add178277da9fdf6c38cf1b32d7a2921aab3896ea2",
+    "third-party/nsh/website/elements/alert-dialog.md": "ee0f2bcd0d4a622a5e1521dbd9c854cf3e315b5848104ef3f07ac8f6033d9e5c",
+    "third-party/nsh/website/elements/button.md": "0ee605f47eb3588b4efeb8771bf36b63962101cacc1ed1883d8d22a7a3568da9",
+    "third-party/nsh/website/elements/canvas.md": "c55d6fc031c3b04f91962ea80714c0593db133fe60b228412097b4c97ca20490",
+    "third-party/nsh/website/elements/checkbox.md": "f7a80fa31b3dfd15d2f559d1b0b7996d2812caeb444c37811a073b67e47e1bc7",
+    "third-party/nsh/website/elements/collapsible.md": "fe86a51bfca75d54c6cea67c3478cb49b4600342f388fb8e398585df45cd1b99",
+    "third-party/nsh/website/elements/control-flow.md": "437776ad77c3dd7700bedc283435c5da6e7c56b2adbbaa046678663a7c9945a4",
+    "third-party/nsh/website/elements/dialog.md": "3d620dbb978c555a88c110cd6672cd09104a547278751bbb7f6dab527dcd6b09",
+    "third-party/nsh/website/elements/dock.md": "86a57856dac72b4c423e35d23b819c3874a37ca9ccf50929616da23ddbbb5a17",
+    "third-party/nsh/website/elements/image.md": "c6b783f5be1f157da336afe43934277df4f6658816b5bbad94bff9ef037babb1",
+    "third-party/nsh/website/elements/index.md": "9ebb2752c3639eaf5af7bc18b7702db72fc4d73eddc466b292fff2062bdef5fb",
+    "third-party/nsh/website/elements/input.md": "e092f63b3c610e2255717c0d9608743095ec6ec266c8928ca2eecfcd44fa797f",
+    "third-party/nsh/website/elements/keyboard-avoiding-view.md": "dfeb1baa54bdb1607e1d1fbbb6baa27d7aa082219ee89d7382c6e85fa4a75797",
+    "third-party/nsh/website/elements/list.md": "2a6319ca623e5245251a631929e3bea682b83befd0c60048fccad7de910794b0",
+    "third-party/nsh/website/elements/menu.md": "95a3fe32b1b1aba6e88d651677172dbe205d38d6d27e3d3a716d499ca24ba196",
+    "third-party/nsh/website/elements/nav-stack.md": "84cf0f7e84c64ca64e7e56538d7a9f4577be70829600c212a2a3d4b006e8903b",
+    "third-party/nsh/website/elements/overlay.md": "9de88da1b2dc18d977362b0fa4a0fcee6b4e308501581a83caf4f8b821c295a7",
+    "third-party/nsh/website/elements/popover.md": "6c50ca933851bdbf9c5f22823cda75d2727a406a5ce4d687058f7ffdf61509ba",
+    "third-party/nsh/website/elements/progress.md": "1ebfea33570da895ec7615065346251f912eb7e261ce23d27953a6df6e5c8dc5",
+    "third-party/nsh/website/elements/radio.md": "e11761fa4ed8cb11bc155aec14aed24f7bf938380713d28139f0209929a10197",
+    "third-party/nsh/website/elements/resizable.md": "1ba932eeceaac96697f65ca967b12d3435fb7a79c6970e73e6119748d78fe64d",
+    "third-party/nsh/website/elements/safe-area-view.md": "cff8e15b0e93796df0aef8ebc9b83e79751469024fcaf59ee7ad8d8c7aa956c8",
+    "third-party/nsh/website/elements/scroll.md": "c7a75b03db4f59fafefb76123b582860c4ff71a5d5ac7ac9015ad14476124ed7",
+    "third-party/nsh/website/elements/selection-area.md": "1cafbe4644e5f9c9fc56a630c1ce457e09d24ef59aa9d91419e107232a7e024a",
+    "third-party/nsh/website/elements/sheet.md": "10599510ce372108d1c6e42042464bd3b3150bc16fc3a5887221b5ddbc51f0d0",
+    "third-party/nsh/website/elements/switch.md": "ea31f1b030ca96e8e38d959612b2a02f2c6fe9f0c6510b03547bfdc62e5524f3",
+    "third-party/nsh/website/elements/tabs.md": "bbafc520328fb659853b92c4891ac008ec587844b5095de3317b35b08bc0e72f",
+    "third-party/nsh/website/elements/text-view.md": "200bcd70b36d85e802ff5eddb2ea340d59a2ca34326b3490ef1cb5e9bfa5be1b",
+    "third-party/nsh/website/elements/text.md": "2ee592d12927f93e7b2947b907e40f42b8bd2d0e3adb0dec96c337beac6e1970",
+    "third-party/nsh/website/elements/tooltip.md": "af7d620b741a08eb9a616e9a0d3f7624b73d5eaa26fca13667142a5e23a3ef56",
+    "third-party/nsh/website/elements/video.md": "695cbd156797e5a39d2417fa556ad8fd806dbf471d3db031d2c4adf64b4b63c4",
+    "third-party/nsh/website/elements/view.md": "a532351633e057acff510fa3dc45c6380724fb166a5784ed15b928b77a13dc37",
+    "third-party/nsh/website/elements/web-view.md": "7a9ad687ee2afb124f317f4e103572eb07fa8a71d7202d09c8f971130feea591",
+    "third-party/nsh/website/modules/globals.md": "2c4c6b555c0cd2d0aea5dbebd478d1eb0597a419c379fda4853d55d8f79b8215",
+    "third-party/nsh/website/modules/index.md": "ecd4c0b82d978205fa9e75673e854f04b9602550f0056cd30f2fd864a65f6fa8",
+    "third-party/nsh/website/modules/nsh-accessibility.md": "c446bab2d7fe6becb274bf60546d49e13cd4bab1fe17a80ab494c2f7b3ee775e",
+    "third-party/nsh/website/modules/nsh-android.md": "3bc295d3913732b6f1b75d78a8e879e32fd00f8e65424c7b8468ecb80185a8bb",
+    "third-party/nsh/website/modules/nsh-animated.md": "f50131304ae97c0537af4927bf4ab62524c91068806ce81f3b9daeae6f09662e",
+    "third-party/nsh/website/modules/nsh-base.md": "360834ec0f50ee88b97f1f8414b70187b6f0faf63a1bcebd43e572c48c385af5",
+    "third-party/nsh/website/modules/nsh-canvas.md": "0e800bfc10e2d8d7c2533f1d6959f3d29eebf960c2a3f1047cb61a21137980a5",
+    "third-party/nsh/website/modules/nsh-clipboard.md": "41bb55db93e55c6e12809b90d1bf8582a76d1efa596f24daebf1a6bc722d6a78",
+    "third-party/nsh/website/modules/nsh-desktop.md": "74d5b00ac1d1e27da1e439aed901745108146f9495bed44ef114696e1abb5c85",
+    "third-party/nsh/website/modules/nsh-device.md": "5a49c9c522b883559d6f56ec648dd8502833c69223d52737eebf74bc8f12460e",
+    "third-party/nsh/website/modules/nsh-gesture.md": "242251b48db3e0c70247cfdb243468a0e2641608e70b66914b696450cfca8bfa",
+    "third-party/nsh/website/modules/nsh-image.md": "9291d338ebcc168cedbfc597188691994ac25d7ac800da3659bcc83b356a197e",
+    "third-party/nsh/website/modules/nsh-ios.md": "2c6ea1a8c6c25bb06064e6cd6924cd3ab8a890921b151107d206880ab870eea6",
+    "third-party/nsh/website/modules/nsh-keymap.md": "b45421fbeb6179a5910a4bf2c2e001ddffbd22037a4e87d7e623a63d32d7c206",
+    "third-party/nsh/website/modules/nsh-list.md": "91d2b6895835c0327bda430508c483f08d1403d5218e99988555eb2928b38b0d",
+    "third-party/nsh/website/modules/nsh-native.md": "6bcbcbebb59cafdf01ab56b9c71c6731b941bd8f8431e353cb87bbafd18b18c5",
+    "third-party/nsh/website/modules/nsh-storage.md": "4d2918fcd5d8a19ff6a2716fcd5717191350f66b39af22c4ca37985387a4c1e2",
+    "third-party/nsh/website/modules/nsh-video.md": "9c483265a6fbc95e7324eed842d111a11f7ab35739cd03a64785e8534318c2b9",
+    "third-party/nsh/website/modules/nsh-webview.md": "7ee744224afac754f6d1c1c046e609c3c6cb7f25548c79797a9e5f71a5727db5",
+    "third-party/nsh/website/modules/nsh.md": "6e093ef2421b1671906f80eedf1bc2c8216c489a959cfe9d825048938fd186f9",
+    "third-party/nsh/website/modules/standard-modules.md": "6f0cec39ee86a5f98aea89debb89206e92219421068eff0cd62244d9e9f7b190",
+    "third-party/nsh/website/modules/style-reference.md": "7bb42d195301f7bce57ce5179524c3e7d17561f276b8cb1e71989d274995a651",
+    "third-party/nsh/website/modules/tailwind-reference.md": "0217676f08d5ec2e44dee24510f394e3cb11d84c4bfb699ec75262298d8e14c0",
+    "third-party/nsh/website/package.json": "a367c6e94eb6617e51eea15247f1611b9bc8602e178636ca7269cce004d9c335",
+    "third-party/nsh/website/public/CNAME": "231e9e72291e9315f208db1548681a0204a6f5cd92907609631f79be8e3cca0d",
+    "third-party/nsh/website/public/apple-touch-icon.png": "f022cefb84973be49fc008bf2aa79231314bb6541f7abf5535388c1faf7748bf",
+    "third-party/nsh/website/public/diagrams/ai-flow-dark.svg": "b26098bcfad01e65a3defcba163f995f4fae545c659c9355e6eff25170601f54",
+    "third-party/nsh/website/public/diagrams/ai-flow-light.svg": "b40bae2cb38b8a38ad2cd99f447eeb1a14a22bce7b0f2ede59b0d62f553d7f76",
+    "third-party/nsh/website/public/diagrams/alignment-spines-dark.svg": "c03bdc56ec513182255c86be56101131a99ca77acba3be3247ad1a597087f5d3",
+    "third-party/nsh/website/public/diagrams/alignment-spines-light.svg": "2426efc297bff569a18dcacc7f7bfb83698f6332da7f78c1b2fe5a493090cad2",
+    "third-party/nsh/website/public/diagrams/application-layers-dark.svg": "dabb4b03d9b62b35dce385b52123f2b5c98e8d96d40eadc7ebde236b265043b8",
+    "third-party/nsh/website/public/diagrams/application-layers-light.svg": "dc8497256da596ffb74dcd0f0b0d0d049c116bb268f7424fc8ffe539d7e8ee5a",
+    "third-party/nsh/website/public/diagrams/architecture-dark.svg": "78e70f576e30058f7d272d5f2225f45eb5319bc2298e6fd60a2e2b90c036b2af",
+    "third-party/nsh/website/public/diagrams/architecture-light.svg": "b2ce0e8fb220e5223d2ac49be2d38c822f4467c64cd331a532b34a3efebe53db",
+    "third-party/nsh/website/public/diagrams/host-app-dark.svg": "7e083531c9b73e8ba352dbb737f1240965f8722955d80cbef9b4dccd080cd784",
+    "third-party/nsh/website/public/diagrams/host-app-light.svg": "b9a615fb036bdfcbb9190d106b5cbcbb0b4c140b4cc1509f552adcf2fbcdff9b",
+    "third-party/nsh/website/public/diagrams/platforms-dark.svg": "540c0e2b0561f225a026298de949c015cc19a97d9b792794fedceae243f113e7",
+    "third-party/nsh/website/public/diagrams/platforms-light.svg": "8bc2638165450b7b34451ac1fda00f3b1c7bdbe741aa9670bd6a0fb0d1c28e44",
+    "third-party/nsh/website/public/diagrams/radius-hierarchy-dark.svg": "78f7c9fd311886b125eb64854c28430b4cb55cbb886a74d2a68dd25635abffb3",
+    "third-party/nsh/website/public/diagrams/radius-hierarchy-light.svg": "05ae732d31b22947d88e00769d2acbb9875f926180b02eb8f9ec914ae1a60447",
+    "third-party/nsh/website/public/diagrams/signed-packages-dark.svg": "96326d8254dc3d6b909f8ebf62be8bb331b07c9c27c4b4ac42cad1316ebea5cd",
+    "third-party/nsh/website/public/diagrams/signed-packages-light.svg": "399018f9d0268148bf730e5e06e3cfd9579748fa23be78155c97d9c174d0eb56",
+    "third-party/nsh/website/public/favicon.svg": "0c5bf9c637f8e5317523991406a5f8c3ee5f67472f45f35481708f769c913a89",
+    "third-party/nsh/website/public/icon-512.png": "4eb335e4b9b596108d4bf520008036d1a601e7d1cfeebd6f14323ca5720c2cd8",
+    "third-party/nsh/website/public/install.ps1": "2e99d5f7ab46fe87f1d7e820b826b8847d0454922704d26644137b67010314da",
+    "third-party/nsh/website/public/install.sh": "ae90e12b7c84c876b888266d94202c15c8dcb37903a4ba9086888925b8040a1f",
+    "third-party/nsh/website/public/logo.svg": "b5406bd1194c1f739f2126298f2f74c5e51fc9a9a5cf56b734a3852a80d7dc7b",
+    "third-party/nsh/website/scripts/play.js": "e28474ec94685aebf3e2c7cd1781fe8c3ed73fd97d82eae96caa91c6544745fd",
+    "third-party/nsh/website/src/components/DemoFrame.astro": "5412a67d352efb242a83b1c021a40c9bebf888be77d8ea79a85a46d741e52fba",
+    "third-party/nsh/website/src/components/DocPage.astro": "2e99d9cd0b6117a7297f2f24bd9c4e1d144d7e6d04f4c82a2e14483156fafc89",
+    "third-party/nsh/website/src/components/DocSearch.astro": "307737b68f753a710ab4df6a3c1ecdd9560973c4b1917ed2dbce218b767669c5",
+    "third-party/nsh/website/src/components/Gallery.astro": "69c4fceb79a1f264c15274e693c39ec6930c360f141387ab91d05c27935e5bfd",
+    "third-party/nsh/website/src/components/HeroField.astro": "f0c411892b430d77d3a87df7c9b0743b283c629b1b257687a1d417f3a9571a18",
+    "third-party/nsh/website/src/components/Home.astro": "24683ac53220a1d62a712421a7ad37c06f761b8ee9ad1908b5b7a3e5aac0cb0e",
+    "third-party/nsh/website/src/components/Logo.astro": "87e1331cb061ff1fc4fa148151f106c384311921ba310dec610867ba67c8a397",
+    "third-party/nsh/website/src/components/Nav.astro": "815885985c301d2c3956228fb06b947a7aec919f3a2e4460ad9d050326e0ed78",
+    "third-party/nsh/website/src/components/Playground.astro": "9ff3de1359e423e38507eb32f3f7c55515a65343481213ebb31d52c43dce44f4",
+    "third-party/nsh/website/src/components/Sidebar.astro": "1b9376ee3e62467f6573592041d653d7cb24d352c15ec0ea1fd6a0620cfb6134",
+    "third-party/nsh/website/src/components/SiteFooter.astro": "e75a8e3a7c8303d9d636e035fafb84be8bbf60f963dab399030e4be626a802b8",
+    "third-party/nsh/website/src/components/ThemeSwitch.astro": "4577309af53d69de8e039ee1f3c39088cb3f88f62899fbf8234d5c73147d4d80",
+    "third-party/nsh/website/src/components/Toc.astro": "c2a7e68ae12d7def345f326d399d4ccbfe1a17ffb591ebea6d95e7d92c7244e3",
+    "third-party/nsh/website/src/content.config.ts": "cb687143731ddd2a2620659cbb36b1eec9355f4d37449bd31ca1d0949f5ac2d2",
+    "third-party/nsh/website/src/dark.theme.json": "f0f26ad7977362478ee03c2722890d89550a0bb03853b85f9b33378ae0766e4b",
+    "third-party/nsh/website/src/layouts/BaseLayout.astro": "60961a37ed77b151267150f985459b53fe2030075fb2b9cc99a2e575097b092f",
+    "third-party/nsh/website/src/layouts/DocsLayout.astro": "3ff1b8ad53b9bb389fce2405da0dcb443f4946702c3ce6f446531e5dbe8526f3",
+    "third-party/nsh/website/src/lib/code-tabs-client.ts": "80746cc8f4cc3ac9df7878a57bef98723378ab6c11300a7fce92dc301d82ba93",
+    "third-party/nsh/website/src/lib/demo-client.ts": "d389471f98b41bd63f60a63bb4fa31186d4a8a7fbdfc5bc56145926b321e9060",
+    "third-party/nsh/website/src/lib/demo.js": "f6825d6daa35887f479bc202a88b742beddd38b0add573de4fe5abce4ac1f9f6",
+    "third-party/nsh/website/src/lib/llms.ts": "99341c1cd10682368ef3efc347d16a78925a23a8502282e498ca8cff035b0325",
+    "third-party/nsh/website/src/lib/markdown-endpoint.ts": "1d551af7145b0c1148b4ead6d13d772115e64504e5bb5ac070d2890cdc796488",
+    "third-party/nsh/website/src/lib/markdown.js": "1da143867f85b361dc8b46753a8bc98062055b48ab4ef550b2036be4989f0f50",
+    "third-party/nsh/website/src/lib/play-dev.js": "a136486f79c173809f405d401a5da283fcc088935dca59413036aa4f4f60b50e",
+    "third-party/nsh/website/src/lib/playground-client.ts": "f624b6a1e98407d4e3b1d77114f9e1fc01b5bf77187ff90913b8871b5306f2b4",
+    "third-party/nsh/website/src/lib/rehype-heading-anchors.js": "0c322cfdb0ff1b56f9757829650c82eec089a9ed846a909cf733cb043d5e3ef3",
+    "third-party/nsh/website/src/lib/remark-callouts.js": "8722f4720a9939e5800ab41403b3faefc7462c690886d25648ea707cdee8c67a",
+    "third-party/nsh/website/src/lib/remark-code-tabs.js": "e53fe3fc8d242cf893c027c3dc46e28108a272923bd10af4d217fc656e1059d0",
+    "third-party/nsh/website/src/lib/remark-demo.js": "8bd91961c4d78319953be9e5600049cf6166bc1c19a60f6ac5d6a425a17d1713",
+    "third-party/nsh/website/src/lib/remark-doc-links.js": "4d1305578398c7171eab60b413d4593d2c0682aec39544c2ad2969b847dbe160",
+    "third-party/nsh/website/src/lib/remark-strip-title.js": "3068a83d3a0cbc8e5acd00e40cb658b5ae130dfa74f6c7b5dcef7e90a76c7038",
+    "third-party/nsh/website/src/lib/sections.ts": "dd07e17c5bc50cab1faab1d19ded55d568964a0dbf8f24aa5b8e64c77ef0b044",
+    "third-party/nsh/website/src/lib/site.ts": "d350a51eaa05b71fda9014ecca91413270b7ead25f515f953800134b2c1d421e",
+    "third-party/nsh/website/src/light.theme.json": "6f17f1644d1037c2028526d36af10093590d9a87d02e417366a75fb93754461b",
+    "third-party/nsh/website/src/pages/404.astro": "2931f5edd7a4697a17e7039d75373d26ebaa6a9029f7d8419ae6861f969f4a29",
+    "third-party/nsh/website/src/pages/[section].md.ts": "06ce163636180ef2c277f041a7b5042558fe8551e73ed98dd53735791ec3e296",
+    "third-party/nsh/website/src/pages/[section]/[...slug].astro": "abb1589376d34d85f57f948130fd0950c74da1e0bb83a7337824eba9f2ce16f8",
+    "third-party/nsh/website/src/pages/[section]/[...slug].md.ts": "9c2e72504e51527ddb0cd90b3b59252222f9d98c6c4ff5eed88cd41023a24a38",
+    "third-party/nsh/website/src/pages/gallery.astro": "61ed4203558357d96859bf9842537e7b5daaab308f9ad735e21ec92507732140",
+    "third-party/nsh/website/src/pages/index.astro": "21e8ff5494906fc0ef1c8e94d546c9bb875058a12369b24f23a06fba7efea6c4",
+    "third-party/nsh/website/src/pages/llms-full.txt.ts": "c27d063b5afbe2649c282023cac102c31a2bc091e70ea0be8713de00ec9e20d5",
+    "third-party/nsh/website/src/pages/llms.txt.ts": "008654c7fbd89b525a127c3f0c89d435fe6cbaa31232216593afb51e89f31174",
+    "third-party/nsh/website/src/pages/playground.astro": "219233d1e91a9a2adb15cf0701725b595ce18af8523d9c207a21e0c4aab86a1f",
+    "third-party/nsh/website/src/pages/robots.txt.ts": "9985af4005121448362df9a41aa1f4fc507080d59d93438f5acd6f61f914cc93",
+    "third-party/nsh/website/src/pages/sitemap.xml.ts": "4fa6c2b101659a25b0f0516fa28c3f0446dae293756bf7f504e0bd8fc0eff5f1",
+    "third-party/nsh/website/src/pages/zh-CN/[section].md.ts": "66663cfc51cd615e873b0cdec857bcd331f517bc9dda983d73b33bda2d8f53d4",
+    "third-party/nsh/website/src/pages/zh-CN/[section]/[...slug].astro": "ee09974de95eaf625c2354a550dece0728090680e08cd0a26ee5efd754d041bd",
+    "third-party/nsh/website/src/pages/zh-CN/[section]/[...slug].md.ts": "f6e8aaa3c2d33d5f8311296291786e8bf79e8802ad858984dac4034d81c9f07b",
+    "third-party/nsh/website/src/pages/zh-CN/gallery.astro": "1452289ad1d3e8792097890d3e40de472a0b534e241a615d081070618a92635a",
+    "third-party/nsh/website/src/pages/zh-CN/index.astro": "d4adf1298bd8844abb528b4a1f4ebe1511af7a378a297fc6c656aeb3e1451c5f",
+    "third-party/nsh/website/src/pages/zh-CN/playground.astro": "e7c84a4744dfe5359699e9834680743f973cf7a2da38dd7780fcf9e92e6233d8",
+    "third-party/nsh/website/src/styles/global.css": "1b303c43f43abe3ba8908f4ceb25173eec4435a86caaa1f3368e370d3805d5aa",
+    "third-party/nsh/website/tests/code-tabs.test.ts": "3918f478bdf0c95814cfdce4358649ab7a14cc2acfe17aaeb045009c7d431613",
+    "third-party/nsh/website/tests/content.test.ts": "105d2614c1e1320b8af29f436f4ab1b11fb0db2eb2a1231acd761b8ab7a34207",
+    "third-party/nsh/website/tests/links.test.ts": "f6412e9693e69b809f694c8600ec8ea5e06315b84a84410215e57003c661d47e",
+    "third-party/nsh/website/tests/scroll-snapping.test.ts": "85297df76fa6807ceead15a7bcabc2a456c1e8739657698d4a4d3b9dfc3abdd2",
+    "third-party/nsh/website/tests/storage-keys.test.ts": "ac813dee8f2aa6a4db11dde2c7d677e8aad46be7b63d209457e0511095673459",
+    "third-party/nsh/website/tests/storage.test.ts": "4711c006141dfea8792fbb1fe2c219746155f57a32650e0fc80aa56b404d1804",
+    "third-party/nsh/website/tsconfig.json": "7b292fd267352f901284513544cd818de4a8a8fe15880f662b3a0900b2a93c99",
+    "third-party/nsh/website/zh-CN/docs/accessibility.md": "63977505bc163dfe40b4d0e40168944c28153dde29a73be1db9931d90bb29bde",
+    "third-party/nsh/website/zh-CN/docs/android.md": "940e22c54c19d26fd25d2c2ac7a35fbd90b1e6e4415664eb1460e9a00b4b040b",
+    "third-party/nsh/website/zh-CN/docs/animation.md": "a6d266e73b250cb3274784b48dfcc99ad791897ffdc5d6788e80a11db4fdebd2",
+    "third-party/nsh/website/zh-CN/docs/architecture.md": "6759f09942a51486476a68a37e12c833be9430012e8b2da137d9123632c00294",
+    "third-party/nsh/website/zh-CN/docs/canvas.md": "8a237d25ef877ce00715d88a03e50493667a9961ccfe045372485b0ff48c7b77",
+    "third-party/nsh/website/zh-CN/docs/cli.md": "d6971d9ce2f9875fcd1073a15c2171ad71d767a4365669ad172844c6d6ef3967",
+    "third-party/nsh/website/zh-CN/docs/coding-guides.md": "34af3e5c4f13861a7336aca26e636aad3a4a2a71ebbc5d806d25135c7882a716",
+    "third-party/nsh/website/zh-CN/docs/comparison.md": "179642fd6035c3fe91a3f5d06873ff394b72376cd2ca22cbe85f521a17800643",
+    "third-party/nsh/website/zh-CN/docs/compatibility.md": "1990079dc6a9ed2c4c72a0ccd6a10aae154e5ca722f2c6d899d5874345f62d76",
+    "third-party/nsh/website/zh-CN/docs/design-guides.md": "2b8d063912ebb2ff15e899bc66567bdef1b085295c16143014128e5ce03fe94d",
+    "third-party/nsh/website/zh-CN/docs/dev-server-and-debugging.md": "62aa22956073ecdfdc56ebea40162e26237a9e60e632e245e0dc5741c8a28034",
+    "third-party/nsh/website/zh-CN/docs/device-and-environment.md": "0746e3515910c6b56968112c4f8b88a92535ca1e8c7b31850fda7e530102a807",
+    "third-party/nsh/website/zh-CN/docs/fonts.md": "8a325ea54bf8a91772f30597a5a1cf2437014d63ac4102c5c9ebb92cde5b50cf",
+    "third-party/nsh/website/zh-CN/docs/forms-and-keyboard.md": "3ecf7fab3df7e7ae6b0008ea9f5f8934c7dd163120497e632f98861905383ebd",
+    "third-party/nsh/website/zh-CN/docs/getting-started.md": "30dae5a17460e27792dbd18a5888d1aa7fbb2c0371e8bf7a2ce37d28f2f51466",
+    "third-party/nsh/website/zh-CN/docs/gpui.md": "43484e580e48508abcaa27ca5d26fab670a0b7c0a1f3ccc485626e6f9ee18d44",
+    "third-party/nsh/website/zh-CN/docs/images-and-assets.md": "de6564e02b94897bfa6865353acfa8d007b331f0dde1abe572db12281c654d63",
+    "third-party/nsh/website/zh-CN/docs/index.md": "37cc61a84bab0742b38ac4ffa13b211a0531d151092bd4e2ef34a055b1ba9773",
+    "third-party/nsh/website/zh-CN/docs/installation.md": "149ece60315c3d00485a5307421a5b2d4898d6259ff59f1c9861295a56a079d9",
+    "third-party/nsh/website/zh-CN/docs/ios.md": "daa4deeea8a90775472af297d61032bdda86015a25b46647ba637a4dc2b24263",
+    "third-party/nsh/website/zh-CN/docs/jsx-and-components.md": "7c80e941fdd795698c237edcfd5f600d748a870f4671b05973d1bc0c2279bf97",
+    "third-party/nsh/website/zh-CN/docs/layerfs.md": "817b28c2b67d90fa5bc754f7b7dcebf07edcb8328d814e56f394ee91989c8217",
+    "third-party/nsh/website/zh-CN/docs/layout.md": "34c9288812aa015497363034a38d338a3138808ea936c21948b1db1fca72733b",
+    "third-party/nsh/website/zh-CN/docs/linux.md": "b92ff6039e94e50758c13feb3c3fbe38dea346f6e644d35b5863a2bfef8c1298",
+    "third-party/nsh/website/zh-CN/docs/lists.md": "7f70739117e058a511ac1a5b824cd4d109ce407f17b8aacc0f1f3203112ee907",
+    "third-party/nsh/website/zh-CN/docs/macos.md": "fb469d4765f3fc5e448f28655841f670cc292878766958b604e913caaf508def",
+    "third-party/nsh/website/zh-CN/docs/native-components.md": "53687a8c5bde004f6f8be3f15ab2a82b5c063dc4acadc7a69713c9c150512831",
+    "third-party/nsh/website/zh-CN/docs/navigation.md": "cf0b0ed2c31d94591a764e54789a8016b248a71d6bbc2e83961c6febd28b7305",
+    "third-party/nsh/website/zh-CN/docs/networking.md": "3f0d3eaf3d29565c18c92b227cececba879063672f66aeede14fdb05da1c61bf",
+    "third-party/nsh/website/zh-CN/docs/packaging.md": "8b50f913799aa252cd230b96ee50f5b73a6bd4bc06e6da35b483ac03fe8368b7",
+    "third-party/nsh/website/zh-CN/docs/performance.md": "51e47481cf34e1d5b80cb63214a1f13ad89ad2ad902d0ba476f5b52f93a6a7af",
+    "third-party/nsh/website/zh-CN/docs/platform-specific.md": "418a89f4880460fd661451290ce6c5d583c6fbee7423978b1d5ac90d098e6412",
+    "third-party/nsh/website/zh-CN/docs/platforms.md": "08a449519d649cf4d720ee8a7ffe46c62b01a522493f94cf57d0b571da912b5b",
+    "third-party/nsh/website/zh-CN/docs/project-structure.md": "1006d1463cf46514347f888024a9a3a492486952fe6d2fe162c0f16c43d74f9a",
+    "third-party/nsh/website/zh-CN/docs/reactivity.md": "2f5ab6ca8af99fe3b6c5aa885e3ea5ee878e612bba4b15cd75de37b2c7f4dbb3",
+    "third-party/nsh/website/zh-CN/docs/rust.md": "4d8eebbf32c628977ad3d87b1c227a056a6d7be8cd140ababd3ea6294d70d473",
+    "third-party/nsh/website/zh-CN/docs/sandbox-and-capabilities.md": "9c021c767938186c7f75cfcb08bfd5200829aa755f013491933e17701dbfb741",
+    "third-party/nsh/website/zh-CN/docs/scrolling.md": "8e6237c42f3b0d82d87c3c3163661382b00517a6866af57bdd807ddcfe71bf7f",
+    "third-party/nsh/website/zh-CN/docs/signed-packages.md": "2e48499114cf8cfee2cfbfb866b46afa8b5dc9c615f2640462295e0fbaf0b47d",
+    "third-party/nsh/website/zh-CN/docs/styling.md": "9bea733d0c0389b8d095b41f57ddaa10eb18a702a964708699c63833c530a798",
+    "third-party/nsh/website/zh-CN/docs/tailwind.md": "36506cf5250db89d07f86389cf2bcdf86e15a0107a4a6424e8f0585fd0b59d8b",
+    "third-party/nsh/website/zh-CN/docs/testing-and-trace.md": "1f570db23c1e31467dd358d62d7e692f1b279b0205b839828c9fa789c8aa1dc1",
+    "third-party/nsh/website/zh-CN/docs/text.md": "3e0c854979fe43694024b1c80a9a6dc8d2632009fb2ca1468d978b7084e2ff33",
+    "third-party/nsh/website/zh-CN/docs/touch-and-gestures.md": "6c52f75dee8de1b1a4db4359e2c155a11131f35bac36f3dfc8b90e758fed2cd1",
+    "third-party/nsh/website/zh-CN/docs/tui.md": "759679285a6efb60adc31bddc0b29a712a8375b947f1405cd1f923345f4cf59f",
+    "third-party/nsh/website/zh-CN/docs/web-view-and-video.md": "45ab7af5e283a3021de62b39b7ffe9f64414fd41fe5337d9e51c30656f3e1fb1",
+    "third-party/nsh/website/zh-CN/docs/web.md": "f0f47e4b4a0cf26d44807d9e782176f391a7134f1dd5ab192132b0215a9c5cf9",
+    "third-party/nsh/website/zh-CN/docs/windows.md": "6694ce31c742015a5f2d26d746039f5d73081ddcdd556b8c8cbd8ef988531747",
+    "third-party/nsh/website/zh-CN/elements/alert-dialog.md": "ddee942832b7ddb4afbfcaec5af36245af4189b995a65d55d762634176d4213e",
+    "third-party/nsh/website/zh-CN/elements/button.md": "322208c0b3b5664f6d5ed83828f77b22c7f7f7a532e84664da7ead9179d144b6",
+    "third-party/nsh/website/zh-CN/elements/canvas.md": "69200ec9827d47f515d4f2fc2559cff30371d040712ce11341c1de6ab26b11c7",
+    "third-party/nsh/website/zh-CN/elements/checkbox.md": "f1a7a1413a75615cc741b0a3f7d5e868d520f8d0337a66ee0653839f43f97b3a",
+    "third-party/nsh/website/zh-CN/elements/collapsible.md": "026eda08ce383a2c9ce171bc2ed028ef7d7fa6c69ed28a89ea1c2b859970f36b",
+    "third-party/nsh/website/zh-CN/elements/control-flow.md": "1d7065c6458a50773b2227aa14347d8e09354d09e517997249055f51469813fa",
+    "third-party/nsh/website/zh-CN/elements/dialog.md": "cfd0ded3f400392463710f5d2a48ee669b50fe712665e376bf0dc773dda161d2",
+    "third-party/nsh/website/zh-CN/elements/dock.md": "dff254c70d301888d6e79ecfde8a6596285cba3f295f76003160d6d88344ef34",
+    "third-party/nsh/website/zh-CN/elements/image.md": "0956a9de221d73e22ba15d3ebc90fcbc3a39423106d3c0ce065654917f3ff6af",
+    "third-party/nsh/website/zh-CN/elements/index.md": "4bfd2c24c29a217c8682c8ecc5fe5bd01925db233317f144a2f199eb5427baac",
+    "third-party/nsh/website/zh-CN/elements/input.md": "d5c3a7845a7cbf58492052a5546ee80a9291d8b91d266e4a61451f3253773c12",
+    "third-party/nsh/website/zh-CN/elements/keyboard-avoiding-view.md": "0d54462bbc46162047b82489a7269221beab0e788c805e8c79f53e6a6a7bf01b",
+    "third-party/nsh/website/zh-CN/elements/list.md": "ebc0b66076522bd4659206bce6d9566b61071afb90164cc483c843033ab6332e",
+    "third-party/nsh/website/zh-CN/elements/menu.md": "9e639c7282bca55b7878553bd7c6579e038232b5ed9899a73597c96f2a171ef2",
+    "third-party/nsh/website/zh-CN/elements/nav-stack.md": "5ab1acad40059832af6af1d648c4cdc3262546542ce0bb9d0fe60828e5f2c63b",
+    "third-party/nsh/website/zh-CN/elements/overlay.md": "38dee985acb59390b24546e4f128c3f150f232cf397d91f670dfdf4a02fbbc40",
+    "third-party/nsh/website/zh-CN/elements/popover.md": "236553f0dde15c98b62747e8054815bc18bbc9aa7102637ca1d1b9dfc5fda903",
+    "third-party/nsh/website/zh-CN/elements/progress.md": "4e51e0f7a2bbdd093bb9aac9d35aec13a90840b8aea005a42b7bd0a49f6a879c",
+    "third-party/nsh/website/zh-CN/elements/radio.md": "7780983287430eb555ba4494ecc7d306aae1fd337a7434acc8582fbe7e69633c",
+    "third-party/nsh/website/zh-CN/elements/resizable.md": "b43ba0ed64339ce8e0e03067da12f439b6e5749ad2a51072b35d5c6eee969aa7",
+    "third-party/nsh/website/zh-CN/elements/safe-area-view.md": "fe38f0817d997a4ae18f3852f7b55dc008fc0c57adaa563edac5d039c698c1b4",
+    "third-party/nsh/website/zh-CN/elements/scroll.md": "52df544f98dc2d046c6453d03636d5fb9577296ddd567b8d8117239cf87dc7d1",
+    "third-party/nsh/website/zh-CN/elements/selection-area.md": "f4e0560f201feb60a818572cc822299fd06cfb83de601367fa67607726e04c61",
+    "third-party/nsh/website/zh-CN/elements/sheet.md": "d02b35ac3c2bf4e7d44167a22c0b0bf5fd6a3a7d56d89e049a986c2170c51a1f",
+    "third-party/nsh/website/zh-CN/elements/switch.md": "96dea845e938b30e9ad1524112f0d9125a9d713fdc5c2452bd883f35d7382d20",
+    "third-party/nsh/website/zh-CN/elements/tabs.md": "60db8475affb175043a3e62ecc822c25a759a896b2b8f5136fe35d263614c90f",
+    "third-party/nsh/website/zh-CN/elements/text-view.md": "09a48700dcbb83c176636c88831713f915ff95214f13ffefdfa374871fba8062",
+    "third-party/nsh/website/zh-CN/elements/text.md": "1780f26d52e5f1459a7cc0805d769c5b1ccaec88b2fd488e5e0974aec9436840",
+    "third-party/nsh/website/zh-CN/elements/tooltip.md": "2956b483da412f49022aa632cad43b3fca50967b87f4d0cd6e94297b892614ed",
+    "third-party/nsh/website/zh-CN/elements/video.md": "955ed5636a36deda11f609c75672b775290ebac5f676ea94a85c044a6cbd09fd",
+    "third-party/nsh/website/zh-CN/elements/view.md": "07ceb854787d0ccda316a08c2f0ad34523f28f85a0b74c4adef29be612d898a2",
+    "third-party/nsh/website/zh-CN/elements/web-view.md": "16fc5b2d4e1a2158f7838d96fa8361c8401f14c5ce5f36a474daef0e246d2fd9",
+    "third-party/nsh/website/zh-CN/modules/globals.md": "8fe3c160dfea2a833e3af37266399a79db319bd3a8279f1bbd0f7173cc33aeea",
+    "third-party/nsh/website/zh-CN/modules/index.md": "04185943e6282fdc4cf7073f88cc080399934cc0e1636877b8c3422d0b9ff62d",
+    "third-party/nsh/website/zh-CN/modules/nsh-accessibility.md": "53b1949ebe056f6e8d2cde899f6160ce6ac5f78b8e9b404b86c257513391f360",
+    "third-party/nsh/website/zh-CN/modules/nsh-android.md": "5732783701f5b8eba5134b9d7f4a87be6930e3cd9a567a5d21063c479f8c9e31",
+    "third-party/nsh/website/zh-CN/modules/nsh-animated.md": "0fc4cd367f3b4d87bf228017fbf8f1d941cd439f9583a8d9641738d5d222b2b8",
+    "third-party/nsh/website/zh-CN/modules/nsh-base.md": "e9885ced674cf151ad4752c0588f50e287b3faed3773b08a68618438c1ce594b",
+    "third-party/nsh/website/zh-CN/modules/nsh-canvas.md": "7737fe15ddb7da1cdc16c372c4ef01facac49a314c7cdd538521516963d63f3c",
+    "third-party/nsh/website/zh-CN/modules/nsh-clipboard.md": "935d8f48b3b441e950a310fa2f354af479307bdce3476763bb6e19928ccafac9",
+    "third-party/nsh/website/zh-CN/modules/nsh-desktop.md": "d69cebeb28d6d77643af44d53c01f2d5f135ea096b8381b0b631691fb74e05a9",
+    "third-party/nsh/website/zh-CN/modules/nsh-device.md": "2aef14241d7a65e204194fe1663499820a8857b98ad0c8450bac2887beea0d25",
+    "third-party/nsh/website/zh-CN/modules/nsh-gesture.md": "016833be47b4af7906a3b30834f18d2a0daa031f344ef7f655197870be3b0934",
+    "third-party/nsh/website/zh-CN/modules/nsh-image.md": "ba5af499d466a18bdba503b45d7957c2bcfa64a9454538ab92e271c31cf795be",
+    "third-party/nsh/website/zh-CN/modules/nsh-ios.md": "e1220439df4359e9ba96b0457169683d68f92559fc77544fc741768c45a34ed1",
+    "third-party/nsh/website/zh-CN/modules/nsh-keymap.md": "ce0661d9b5d0c1c359d984d03c721cd1d23f9b695c5e4ca01f581914993a94df",
+    "third-party/nsh/website/zh-CN/modules/nsh-list.md": "bca6d00c4c39da107b74accbd135653d0ef18845fa5aa4248262e53bffa7cdb1",
+    "third-party/nsh/website/zh-CN/modules/nsh-native.md": "f4938e9e7310c840b6bb5517570d7b23d19cf97d7fdd5dd5827cfd148ddb5c0b",
+    "third-party/nsh/website/zh-CN/modules/nsh-storage.md": "3a4b00515785ced4dab774b340a333487f9b7c4ec5bcf64a7ff00b1eab5b7041",
+    "third-party/nsh/website/zh-CN/modules/nsh-video.md": "c6cac6691f0864c20d2abee1433f81ddc6d769ace7db62c5ee79996d64e10432",
+    "third-party/nsh/website/zh-CN/modules/nsh-webview.md": "b462d13b70b1e9e058d17d35fb2bbfdbe4ea03cdd47bc88690cbf15b2b320c2d",
+    "third-party/nsh/website/zh-CN/modules/nsh.md": "c24fceba5412c4688225eb1a3f2b77684ca161875d5226c742556f155770d048",
+    "third-party/nsh/website/zh-CN/modules/standard-modules.md": "57cbd41854efbb2168dadd3dc5feee0ada4c78bff962369c80d005124d3c644c",
+    "third-party/nsh/website/zh-CN/modules/style-reference.md": "7db6b969281da9b46046b82d3469a009426c4e2c6db9450ae6f70e90d15d9257",
+    "third-party/nsh/website/zh-CN/modules/tailwind-reference.md": "9f366de10fe05a3fcf34f7e2ad7a6d7f8dc82379084f4958bef2c5761aff968f",
     "third-party/sqlx-sqlite/Cargo.toml": "d659405cf1a18299845d699b4ab681a3d341805556c4a837d70f5f1c3589bb9a",
     "third-party/sqlx-sqlite/LICENSE-APACHE": "c8f5453612253e8ea8bad241617fe74c4a6d5d592ba64ff881668c211b50ac99",
     "third-party/sqlx-sqlite/LICENSE-MIT": "5abbdd842310c8f1650fcde3a5a51a3e09412b9e5a6eea87519e0db9e32b339d",
@@ -1120,5 +2754,5 @@
     "third-party/termina/upstream.json": "31ce8c2b8b45305bff1ce8a52db55f06e5887e770346dbc6c3ea3c574b58ebad",
     "tools/schema/Cargo.toml": "d8f47765451f555f872ea034945abd7afd54dc4c188ad5d5553932f8f2bc2462"
   },
-  "sha256": "3a1936ed4940adda2b3d5deae8d94ce0a2d517e890e3fdb84ada07f90f4701fc"
+  "sha256": "21e783d93cdb74103f26096d3ffb18db945a9c79d815caf29c953e2ef29fd45b"
 }
diff --git a/third-party/nsh/.cargo/config.toml b/third-party/nsh/.cargo/config.toml
new file mode 100644
index 0000000000..05be10b843
--- /dev/null
+++ b/third-party/nsh/.cargo/config.toml
@@ -0,0 +1,13 @@
+[env]
+# One deployment target for Rust and the C code (QuickJS) of every Apple
+# target; `nsh package` writes the same `MinimumOSVersion`.
+IPHONEOS_DEPLOYMENT_TARGET = "15.0"
+
+[alias]
+xtask = "run -q -p xtask --"
+
+# The web runtime (`nsh-platform-web`): QuickJS recursion and deep component
+# trees need more than the 1 MiB default stack of wasm32. Cryptographic
+# entropy uses the raw browser Web Crypto import provided by nsh-js.
+[target.wasm32-unknown-unknown]
+rustflags = ["-C", "link-arg=-zstack-size=8388608", "--cfg", 'getrandom_backend="custom"']
diff --git a/third-party/nsh/.gitattributes b/third-party/nsh/.gitattributes
new file mode 100644
index 0000000000..3d508e6bc7
--- /dev/null
+++ b/third-party/nsh/.gitattributes
@@ -0,0 +1,4 @@
+# Text files are LF in every checkout, Windows included: rustfmt
+# (newline_style = "unix") and the tests expect it.
+* text=auto eol=lf
+
diff --git a/third-party/nsh/.github/ISSUE_TEMPLATE/01_bug.md b/third-party/nsh/.github/ISSUE_TEMPLATE/01_bug.md
new file mode 100644
index 0000000000..20517d960b
--- /dev/null
+++ b/third-party/nsh/.github/ISSUE_TEMPLATE/01_bug.md
@@ -0,0 +1,36 @@
+---
+name: Bug report
+about: Report a problem or unexpected behavior
+title: ""
+assignees:
+---
+
+## Description
+
+Use English with a clear and concise description of the bug. If you just have a question or need help, please submit it to [Discussions](https://github.com/longbridge/nsh/discussions).
+
+## Environment
+
+- NSH: [e.g., `nsh --version`, or the commit]
+- Platform: [e.g., iOS 26 on iPhone 17 Pro, iOS simulator, Mac Catalyst, Android 16 on Pixel 9, Android emulator]
+- How it runs: [e.g., `nsh run`, `nsh package`, embedded in an app]
+
+## Steps to Reproduce
+
+The smallest `App.tsx` that shows the problem, then:
+
+1. Tap '...'
+2. Scroll to '....'
+3. See error
+
+## Screenshots
+
+If applicable, add screenshots or recordings to help explain your problem.
+
+## Expected
+
+A clear and concise description of what you expected to happen.
+
+## Actual
+
+A clear and concise description of what actually happened, with the logs of `nsh run` if any.
diff --git a/third-party/nsh/.github/ci/layerfs.py b/third-party/nsh/.github/ci/layerfs.py
new file mode 100644
index 0000000000..2651534887
--- /dev/null
+++ b/third-party/nsh/.github/ci/layerfs.py
@@ -0,0 +1,201 @@
+"""Prepare and validate NSH's local Linux LayerFS workspaces; see docs/dev/layerfs.md."""
+
+import argparse
+import io
+import json
+import os
+import pathlib
+import platform
+import shutil
+import subprocess
+import sys
+import tarfile
+import uuid
+
+SOURCE = pathlib.Path('.nsh/layerfs/source')
+REVISION = '2aaf2552ce21154928b9f9c83582e41a637f5910'
+STATE = pathlib.Path('.nsh/layerfs')
+ROOT = pathlib.Path(__file__).resolve().parents[2]
+
+
+def run(*args, capture=False):
+    return subprocess.run(args, check=True, text=True, capture_output=capture).stdout
+
+
+def docker_socket(explicit=None):
+    if explicit:
+        return pathlib.Path(explicit).resolve()
+    endpoint = os.environ.get('DOCKER_HOST') if not os.environ.get('DOCKER_CONTEXT') else None
+    if not endpoint:
+        endpoint = run('docker', 'context', 'inspect', '--format',
+                       '{{.Endpoints.docker.Host}}', capture=True).strip()
+    if not endpoint.startswith('unix://'):
+        raise RuntimeError('LayerFS requires a local Docker Unix socket; use --docker-socket PATH')
+    return pathlib.Path(endpoint.removeprefix('unix://')).resolve()
+
+
+def target_dir():
+    return pathlib.Path(os.environ.get('CARGO_TARGET_DIR', 'target')).resolve()
+
+
+def check_docker():
+    api = run('docker', 'version', '--format', '{{.Server.APIVersion}}', capture=True).strip()
+    if tuple(map(int, api.split('.'))) < (1, 54):
+        raise RuntimeError(f'LayerFS 1.0.0 requires Docker API 1.54+, found {api}')
+
+
+def prepare():
+    check_docker()
+    if platform.system() == 'Darwin':
+        prepare_in_docker()
+    elif platform.system() == 'Linux':
+        build_tools()
+        run('docker', 'build', '--tag', 'nsh-layerfs:1.0.0', '.github/ci/layerfs')
+    else:
+        raise RuntimeError('LayerFS preparation requires Linux or macOS with a local Linux Docker engine')
+    image = run('docker', 'image', 'inspect', '--format', '{{.Id}}',
+                'nsh-layerfs:1.0.0', capture=True).strip()
+    settings = {'revision': REVISION, 'image': image,
+                'daemon': str(target_dir() / 'release/layerfs-daemon')}
+    (STATE / 'deployment.json').write_text(json.dumps(settings, indent=2))
+
+
+def build_tools():
+    STATE.mkdir(parents=True, exist_ok=True)
+    run('rustup', 'toolchain', 'install', '1.85.1', '--profile', 'minimal')
+    if not SOURCE.exists():
+        run('git', 'clone', '--filter=blob:none', '--no-checkout', '--depth', '1', '--branch', 'v1.0.0',
+            'https://github.com/Ephemeral-AI-Lab/layerfs.git', str(SOURCE))
+        run('git', '-C', str(SOURCE), 'sparse-checkout', 'set', '--no-cone',
+            '/.cargo/', '/core/Cargo.toml', '/core/Cargo.lock',
+            '/core/crates/', '/core/vendor/', '/sdk/js/')
+        run('git', '-C', str(SOURCE), 'checkout', '--detach', REVISION)
+    revision = run('git', '-C', str(SOURCE), 'rev-parse', 'HEAD', capture=True).strip()
+    if revision != REVISION:
+        raise RuntimeError(f'LayerFS source must be {REVISION}, found {revision}')
+    run('git', '-C', str(SOURCE), 'diff', '--exit-code', 'HEAD', '--', '.cargo', 'core', 'sdk/js')
+    run('cargo', '+1.85.1', '--config', str(SOURCE / '.cargo/config.toml'),
+        'build', '--manifest-path', str(SOURCE / 'core/Cargo.toml'),
+        '--target-dir', str(target_dir()), '--locked', '--release',
+        '-p', 'layerfs-node', '--lib', '-p', 'layerfs-daemon', '--bins')
+    shutil.copyfile(target_dir() / 'release/liblayerfs_node.so', SOURCE / 'sdk/js/native/layerfs.node')
+
+
+def prepare_in_docker():
+    run('docker', 'build', '--tag', 'nsh-layerfs:1.0.0', '.github/ci/layerfs')
+    run('docker', 'build', '--file', '.github/ci/layerfs/prepare.Dockerfile',
+        '--tag', 'nsh-layerfs-build:1.0.0', '.github/ci/layerfs')
+    target = target_dir()
+    registry = pathlib.Path(os.environ.get('CARGO_HOME', pathlib.Path.home() / '.cargo')) / 'registry'
+    target.mkdir(parents=True, exist_ok=True)
+    registry.mkdir(parents=True, exist_ok=True)
+    mounts = [
+        (ROOT, ROOT), (target, target),
+        (registry.resolve(), pathlib.Path('/usr/local/cargo/registry')),
+    ]
+    command = ['docker', 'run', '--rm', '--workdir', str(ROOT)]
+    for source, destination in dict(mounts).items():
+        command.extend(['--mount', f'type=bind,source={source},target={destination}'])
+    if 'CARGO_TARGET_DIR' in os.environ:
+        command.extend(['--env', 'CARGO_TARGET_DIR'])
+    run(*command, 'nsh-layerfs-build:1.0.0', 'python3', '-c',
+        "import runpy; runpy.run_path('.github/ci/layerfs.py')['build_tools']()")
+
+
+def deployment():
+    path = STATE / 'deployment.json'
+    if not path.is_file():
+        raise RuntimeError('LayerFS is not prepared; run ./scripts/layerfs prepare')
+    settings = json.loads(path.read_text())
+    daemon = pathlib.Path(settings.get('daemon', target_dir() / 'release/layerfs-daemon'))
+    if not daemon.is_file() or not (SOURCE / 'sdk/js/native/layerfs.node').is_file():
+        raise RuntimeError('LayerFS build outputs are missing; run ./scripts/layerfs prepare')
+    run('docker', 'image', 'inspect', settings['image'], capture=True)
+    return settings, daemon.resolve()
+
+
+def status():
+    settings, daemon = deployment()
+    print(f"LayerFS: {settings['revision']}")
+    print(f"Image: {settings['image']}")
+    print(f'Daemon: {daemon}')
+    receipts = list(STATE.glob('nsh-*/result.json'))
+    if receipts:
+        latest = max(receipts, key=lambda path: path.stat().st_mtime)
+        result = json.loads(latest.read_text())
+        outcome = 'passed' if result.get('ok') else ('failed' if 'error' in result else 'in progress')
+        print(f'Latest validation: {outcome}')
+        print(f'Receipt: {latest.resolve()}')
+    else:
+        print('Validation: run ./scripts/layerfs smoke')
+
+
+def smoke(socket):
+    check_docker()
+    settings, daemon = deployment()
+    name = 'nsh-' + uuid.uuid4().hex[:12]
+    state = STATE / name
+    source = state / 'input'
+    source.mkdir(parents=True)
+    # Use a named, committed input, excluding ignored caches and credentials.
+    # Init itself intentionally captures everything in that input, including .git.
+    archive = subprocess.check_output(['git', 'archive', 'HEAD'])
+    with tarfile.open(fileobj=io.BytesIO(archive)) as tree:
+        tree.extractall(source, filter='data')
+    run('git', 'init', '--initial-branch=main', str(source))
+    run('git', '-C', str(source), 'add', '.')
+    run('git', '-C', str(source), '-c', 'user.name=NSH LayerFS trial',
+        '-c', 'user.email=layerfs@example.invalid',
+        '-c', 'maintenance.auto=false', '-c', 'gc.auto=0', 'commit', '-qm', 'Trial input')
+    run('git', '-C', str(source), 'fsck', '--full')
+    status = run('git', '-C', str(source), 'status', '--porcelain', capture=True)
+    if status:
+        raise RuntimeError(f'Trial input must be clean: {status}')
+    state = state.resolve()
+    volume = 'nsh-layerfs-' + name
+    run('docker', 'volume', 'create', '--label', 'nsh.layerfs=trial', volume)
+    settings = {**settings, 'project': name, 'volume': volume,
+                'gitCommit': run('git', 'rev-parse', 'HEAD', capture=True).strip()}
+    (state / 'settings.json').write_text(json.dumps(settings, indent=2))
+    # The Linux SDK opens the same plain local volume as the Sandbox. Host
+    # networking lets it reach the daemon's loopback-only published port.
+    try:
+        run('docker', 'run', '--rm', '--network', 'host',
+            '--mount', f'type=bind,source={socket},target=/var/run/docker.sock',
+            '--mount', f'type=volume,source={volume},target=/layerfs-store',
+            '--mount', f'type=bind,source={state},target=/layerfs-state',
+            '--mount', f'type=bind,source={source.resolve()},target=/layerfs-input,readonly',
+            '--mount', f'type=bind,source={SOURCE.resolve() / "sdk/js"},target=/layerfs-sdk,readonly',
+            '--mount', f'type=bind,source={daemon},target=/layerfs-daemon,readonly',
+            '--mount', f'type=bind,source={pathlib.Path(".github/ci/layerfs/smoke.mjs").resolve()},target=/smoke.mjs,readonly',
+            settings['image'], 'node', '/smoke.mjs')
+    finally:
+        print(f'Receipts: {state}/result.json', flush=True)
+        print(f'Store retained in Docker volume: {volume}', flush=True)
+
+
+def main():
+    parser = argparse.ArgumentParser(prog='./scripts/layerfs', description=__doc__)
+    parser.add_argument('command', choices=['prepare', 'smoke', 'status'])
+    parser.add_argument('--docker-socket', help='local Docker socket (default: active Docker context)')
+    args = parser.parse_args()
+    os.chdir(ROOT)
+    socket = docker_socket(args.docker_socket)
+    if not socket.is_socket():
+        raise RuntimeError(f'Docker socket is unavailable: {socket}; start your local Docker engine')
+    os.environ['DOCKER_HOST'] = f'unix://{socket}'
+    os.environ.pop('DOCKER_CONTEXT', None)
+    if args.command == 'status':
+        status()
+    elif args.command == 'prepare':
+        prepare()
+    else:
+        smoke(socket)
+
+
+if __name__ == '__main__':
+    try:
+        main()
+    except (RuntimeError, OSError, ValueError, subprocess.CalledProcessError) as error:
+        print(f'LayerFS: {error}', file=sys.stderr)
+        sys.exit(1)
diff --git a/third-party/nsh/.github/ci/layerfs/Dockerfile b/third-party/nsh/.github/ci/layerfs/Dockerfile
new file mode 100644
index 0000000000..78a85b0788
--- /dev/null
+++ b/third-party/nsh/.github/ci/layerfs/Dockerfile
@@ -0,0 +1,5 @@
+# The SDK and daemon need Linux; this image also supplies NSH's Rust tools.
+FROM rust:1.98.1-trixie@sha256:a8a5f0a1e5fe7dfe1d352591e4a1c7dd2c08fd70475cae872cf3458ba0df0546
+RUN apt-get update \
+ && apt-get install -y --no-install-recommends nodejs clang libclang-dev fuse3 \
+ && rm -rf /var/lib/apt/lists/*
diff --git a/third-party/nsh/.github/ci/layerfs/prepare.Dockerfile b/third-party/nsh/.github/ci/layerfs/prepare.Dockerfile
new file mode 100644
index 0000000000..c871c14fae
--- /dev/null
+++ b/third-party/nsh/.github/ci/layerfs/prepare.Dockerfile
@@ -0,0 +1,6 @@
+# Build the Linux addon and daemon from a macOS checkout.
+FROM nsh-layerfs:1.0.0
+RUN apt-get update \
+ && apt-get install -y --no-install-recommends python3 \
+ && rm -rf /var/lib/apt/lists/*
+RUN rustup toolchain install 1.85.1 --profile minimal
diff --git a/third-party/nsh/.github/ci/layerfs/smoke.mjs b/third-party/nsh/.github/ci/layerfs/smoke.mjs
new file mode 100644
index 0000000000..0b0f064c63
--- /dev/null
+++ b/third-party/nsh/.github/ci/layerfs/smoke.mjs
@@ -0,0 +1,71 @@
+// Real Git + Cargo over LayerFS, with Commit/remount and fork isolation.
+import assert from 'node:assert/strict';
+import { readFileSync, writeFileSync } from 'node:fs';
+import { performance } from 'node:perf_hooks';
+import { LayerFS } from '/layerfs-sdk/src/index.js';
+
+const settings = JSON.parse(readFileSync('/layerfs-state/settings.json', 'utf8'));
+const client = new LayerFS(settings.project, {
+  storePath: '/layerfs-store/global/store.sqlite',
+  trace: '/layerfs-state/trace.jsonl',
+});
+// v1.0.0's constructor takes these deployment fields from the environment.
+// Its pinned client stores them in options; set them explicitly for this trial.
+client.options.home = '/layerfs-state/home';
+client.options.deploy = {
+  docker: '/var/run/docker.sock', image: settings.image,
+  volume: settings.volume, daemon: '/layerfs-daemon',
+};
+const result = { ...settings, steps: [] };
+async function step(name, action) {
+  const start = performance.now();
+  const value = await action();
+  result.steps.push({ name, ms: Math.round(performance.now() - start), value });
+  writeFileSync('/layerfs-state/result.json', JSON.stringify(result, null, 2));
+  console.log(`${name}: ${result.steps.at(-1).ms} ms`);
+  return value;
+}
+async function exec(ws, command) {
+  const value = await client.workspace.exec(ws, command, undefined, {
+    stdout: process.stdout, stderr: process.stderr,
+  });
+  assert.equal(value.exitCode, 0, JSON.stringify(value));
+  return { exitCode: value.exitCode };
+}
+let workspace;
+try {
+  await step('init', () => client.project.init('/layerfs-input'));
+  await step('fork', () => client.branch.fork('build'));
+  workspace = await step('mount', () => client.workspace.mount('build'));
+  await step('cold-test', () => exec(workspace,
+    "set -eu; test -z \"$(git --no-optional-locks status --porcelain)\"; cargo +1.98.1 test --locked -p nsh-package; mkdir -p .nsh; printf 'snapshot-ok\\n' > .nsh/layerfs-probe.txt"));
+  await step('commit', () => client.workspace.commit(workspace, 'Cache NSH package tests and probe'));
+  await step('unmount', () => client.workspace.unmount(workspace));
+  workspace = undefined;
+  await step('fork-warm', () => client.branch.fork('warm', 'build'));
+  workspace = await step('remount', () => client.workspace.mount('warm'));
+  await step('warm-test', () => exec(workspace,
+    "set -eu; test -d target/debug/deps; test \"$(cat .nsh/layerfs-probe.txt)\" = snapshot-ok; cargo +1.98.1 test --locked --offline -p nsh-package"));
+  await step('unmount-warm', () => client.workspace.unmount(workspace));
+  workspace = undefined;
+  await step('history', async () => {
+    const history = await client.branch.list_commits('build');
+    assert.ok(history.items.length > 0);
+    return history;
+  });
+  await step('fork-untouched', () => client.branch.fork('untouched'));
+  workspace = await step('mount-main', () => client.workspace.mount('untouched'));
+  await step('isolation', () => exec(workspace,
+    'set -eu; test ! -e .nsh/layerfs-probe.txt; test ! -d target; test -z "$(git --no-optional-locks status --porcelain)"'));
+  await step('unmount-main', () => client.workspace.unmount(workspace));
+  workspace = undefined;
+  result.ok = true;
+} catch (error) {
+  // Preserve the failed Workspace and Store for diagnosis; never replay work.
+  result.ok = false;
+  result.error = { message: error.message, code: error.code, detail: error.detail, workspace };
+  throw error;
+} finally {
+  await client.close();
+  writeFileSync('/layerfs-state/result.json', JSON.stringify(result, null, 2));
+}
diff --git a/third-party/nsh/.github/ci/paths.py b/third-party/nsh/.github/ci/paths.py
new file mode 100644
index 0000000000..447bcc358f
--- /dev/null
+++ b/third-party/nsh/.github/ci/paths.py
@@ -0,0 +1,168 @@
+"""Checks that each workflow runs on every change that can affect what it tests.
+
+The Rust workflows run only when the crates they build change, listed one by
+one in their `paths` (or, for a workflow that runs on every pull request
+because its job is required, in the list of its `dorny/paths-filter` step). A crate they build (directly or through a path
+dependency, dev-dependencies included) that is missing from the list would
+let a change through untested, so this compares the lists with the
+workspace's dependency graph (`cargo metadata --no-deps`, no download).
+
+    python3 .github/ci/paths.py          # check
+    python3 .github/ci/paths.py --print  # the `paths` each workflow needs
+"""
+
+import fnmatch
+import json
+import pathlib
+import subprocess
+import sys
+
+import yaml
+
+ROOT = pathlib.Path(__file__).resolve().parents[2]
+
+# What each workflow builds and tests (its `-p` packages), and the files
+# outside those crates it reads (tests' fixtures, `include_bytes!`).
+WORKFLOWS = {
+    "core.yml": {
+        "packages": [
+            "nsh-core", "nsh-macros", "nsh-js", "nsh-engine",
+            "nsh-bundler", "nsh-package", "nsh-base", "nsh-testing",
+        ],
+        "files": ["examples/counter/**", "examples/gallery/**", "examples/bench/**"],
+    },
+    "compat.yml": {
+        # `nsh build` builds the apps, nsh-compat's checks link the rest.
+        "packages": ["nsh-cli", "nsh-core", "nsh-js", "nsh-base", "nsh-engine"],
+        # The apps it builds and runs.
+        "files": [
+            "tests/compat/**", "examples/counter/**", "examples/desktop/**",
+            "examples/gallery/**", "examples/hopper/**",
+        ],
+    },
+    "linux.yml": {
+        "packages": [
+            "nsh-platform-linux", "nsh-linux-host", "nsh-linux-app",
+            "nsh-cli", "nsh-dev", "xtask",
+        ],
+        # `nsh test --target` runs the examples' tests.
+        "files": ["examples/counter/**", "examples/gallery/**"],
+    },
+    "windows.yml": {
+        "packages": [
+            "nsh-platform-windows", "nsh-windows-host", "nsh-windows-app",
+            "nsh-cli", "nsh-dev", "xtask",
+        ],
+        # `nsh test --target` runs the examples' tests.
+        "files": ["examples/counter/**", "examples/gallery/**"],
+    },
+    "rust-app.yml": {
+        "packages": ["gallery-native", "rust-exports-native", "nsh-cli", "nsh-platform-web"],
+        # `nsh test` runs the examples' tests.
+        "files": [
+            "examples/counter/**", "examples/gallery/**", "examples/gallery-rs/**",
+            "examples/rust-exports/**",
+        ],
+    },
+    "gpui.yml": {
+        # Shared main-workspace dependencies declared by crates/gpui.
+        "packages": [
+            "nsh-core", "nsh-dev", "nsh-testing", "nsh-engine",
+            "nsh-base", "nsh-bundler",
+        ],
+        "files": [
+            "crates/gpui/**", "third-party/gpui-wgpu/**",
+            "third-party/icy_sixel/**", "examples/embed-gpui/**",
+        ],
+    },
+    "tui.yml": {
+        "packages": ["nsh-platform-tui", "nsh-tui-host", "nsh-tui-app", "nsh-cli"],
+        "files": [
+            "examples/terminal-workbench/**", "tests/compat/cases/layout/fonts/**",
+            "third-party/icy_sixel/**",
+        ],
+    },
+}
+
+ALWAYS = ["Cargo.toml", "Cargo.lock", ".cargo/**", "rust-toolchain.toml"]
+
+
+def crates():
+    """Workspace members: name -> (directory, names of the members it depends on)."""
+    out = subprocess.run(
+        ["cargo", "metadata", "--no-deps", "--format-version", "1"],
+        cwd=ROOT, check=True, capture_output=True, text=True,
+    ).stdout
+    packages = json.loads(out)["packages"]
+    members = {p["name"] for p in packages}
+    return {
+        p["name"]: (
+            pathlib.Path(p["manifest_path"]).parent.relative_to(ROOT).as_posix(),
+            {d["name"] for d in p["dependencies"] if d["name"] in members and d.get("path")},
+        )
+        for p in packages
+    }
+
+
+def needed(name, spec, graph):
+    seen, stack = set(), list(spec["packages"])
+    while stack:
+        package = stack.pop()
+        if package not in seen:
+            seen.add(package)
+            stack.extend(graph[package][1])
+    dirs = sorted(f"{graph[p][0]}/**" for p in seen)
+    dirs = [d for d in dirs if not covered(d, spec["files"])]
+    return dirs + spec["files"] + ALWAYS + [f".github/workflows/{name}"]
+
+
+def covered(path, patterns):
+    probe = path.replace("**", "x/y")
+    return any(fnmatch.fnmatch(probe, p) for p in patterns)
+
+
+def filtered(workflow):
+    """The patterns of a workflow's `dorny/paths-filter` step, if it has one."""
+    for job in workflow["jobs"].values():
+        for step in job.get("steps", []):
+            if step.get("uses", "").startswith("dorny/paths-filter"):
+                filters = yaml.safe_load(step["with"]["filters"])
+                return [p for patterns in filters.values() for p in patterns]
+    return None
+
+
+def main():
+    graph = crates()
+    failed = False
+    # Merge queues need a result on their synthetic commit as well as on PRs.
+    # Check every PR workflow, including those outside the Rust path graph.
+    for path in sorted((ROOT / ".github/workflows").glob("*.yml")):
+        events = yaml.safe_load(path.read_text()).get(True, {})
+        if "pull_request" in events:
+            group = events.get("merge_group")
+            if not isinstance(group, dict) or group.get("types") != ["checks_requested"]:
+                failed = True
+                print(f"{path.name} must handle merge_group: checks_requested")
+    for name, spec in WORKFLOWS.items():
+        want = needed(name, spec, graph)
+        if "--print" in sys.argv:
+            print(f"{name}:")
+            print("\n".join(f'      - "{p}"' for p in want))
+            continue
+        workflow = yaml.safe_load((ROOT / ".github/workflows" / name).read_text())
+        on = workflow[True]
+        for event in ("push", "pull_request"):
+            patterns = (on[event] or {}).get("paths")
+            if patterns is None and event == "pull_request":
+                patterns = filtered(workflow)
+            patterns = patterns or ["**"]
+            missing = [p for p in want if not covered(p, patterns)]
+            if missing:
+                failed = True
+                print(f"{name} ({event}) does not run on changes to: {', '.join(missing)}")
+    if failed:
+        print("Add them to the workflow's paths or paths filter (python3 .github/ci/paths.py --print).")
+        sys.exit(1)
+
+
+main()
diff --git a/third-party/nsh/.github/ci/test_layerfs.py b/third-party/nsh/.github/ci/test_layerfs.py
new file mode 100644
index 0000000000..7ae5b9dd47
--- /dev/null
+++ b/third-party/nsh/.github/ci/test_layerfs.py
@@ -0,0 +1,76 @@
+"""Boundary checks for the local LayerFS command (no Docker daemon required)."""
+
+import importlib.util
+import json
+import os
+import pathlib
+import socket
+import sys
+import tempfile
+import unittest
+from unittest.mock import patch
+
+spec = importlib.util.spec_from_file_location('layerfs', pathlib.Path(__file__).with_name('layerfs.py'))
+layerfs = importlib.util.module_from_spec(spec)
+spec.loader.exec_module(layerfs)
+
+
+class LayerfsTests(unittest.TestCase):
+    def test_host_endpoint_is_used_without_a_context_override(self):
+        with patch.dict(os.environ, {'DOCKER_HOST': 'unix:///tmp/engine.sock'}, clear=True):
+            with patch.object(layerfs, 'run') as run:
+                self.assertEqual(layerfs.docker_socket(), pathlib.Path('/tmp/engine.sock').resolve())
+                run.assert_not_called()
+
+    def test_context_override_takes_precedence_over_host(self):
+        with patch.dict(os.environ, {'DOCKER_CONTEXT': 'local', 'DOCKER_HOST': 'tcp://remote:2376'}, clear=True):
+            with patch.object(layerfs, 'run', return_value='unix:///tmp/context.sock\n'):
+                self.assertEqual(layerfs.docker_socket(), pathlib.Path('/tmp/context.sock').resolve())
+
+    def test_remote_endpoint_is_refused(self):
+        with patch.dict(os.environ, {'DOCKER_HOST': 'tcp://remote:2376'}, clear=True):
+            with self.assertRaisesRegex(RuntimeError, 'local Docker Unix socket'):
+                layerfs.docker_socket()
+
+    def test_explicit_socket_controls_subsequent_docker_commands(self):
+        with tempfile.TemporaryDirectory() as directory:
+            path = pathlib.Path(directory) / 'docker.sock'
+            with socket.socket(socket.AF_UNIX) as engine:
+                engine.bind(str(path))
+                with patch.dict(os.environ, {'DOCKER_CONTEXT': 'other'}, clear=True):
+                    with patch.object(sys, 'argv', ['layerfs', 'prepare', '--docker-socket', str(path)]):
+                        with patch.object(layerfs, 'prepare') as prepare, patch('os.chdir'):
+                            layerfs.main()
+                            prepare.assert_called_once_with()
+                            self.assertEqual(os.environ['DOCKER_HOST'], f'unix://{path.resolve()}')
+                            self.assertNotIn('DOCKER_CONTEXT', os.environ)
+
+    def test_saved_daemon_path_survives_a_changed_target_environment(self):
+        with tempfile.TemporaryDirectory() as directory:
+            root = pathlib.Path(directory)
+            daemon = root / 'original-target' / 'release' / 'layerfs-daemon'
+            daemon.parent.mkdir(parents=True)
+            daemon.touch()
+            source = root / 'source'
+            addon = source / 'sdk/js/native/layerfs.node'
+            addon.parent.mkdir(parents=True)
+            addon.touch()
+            (root / 'deployment.json').write_text(json.dumps({'image': 'sha256:test', 'daemon': str(daemon)}))
+            with patch.object(layerfs, 'STATE', root), patch.object(layerfs, 'SOURCE', source):
+                with patch.dict(os.environ, {'CARGO_TARGET_DIR': str(root / 'another-target')}):
+                    with patch.object(layerfs, 'run'):
+                        self.assertEqual(layerfs.deployment()[1], daemon.resolve())
+
+    def test_missing_build_outputs_fail_before_starting_containers(self):
+        with tempfile.TemporaryDirectory() as directory:
+            root = pathlib.Path(directory)
+            (root / 'deployment.json').write_text(json.dumps({'image': 'sha256:test'}))
+            with patch.object(layerfs, 'STATE', root), patch.object(layerfs, 'run') as run:
+                with patch.dict(os.environ, {'CARGO_TARGET_DIR': str(root / 'missing')}):
+                    with self.assertRaisesRegex(RuntimeError, 'build outputs are missing'):
+                        layerfs.deployment()
+                    run.assert_not_called()
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/third-party/nsh/.github/packages/homebrew.py b/third-party/nsh/.github/packages/homebrew.py
new file mode 100644
index 0000000000..90cde797ab
--- /dev/null
+++ b/third-party/nsh/.github/packages/homebrew.py
@@ -0,0 +1,67 @@
+"""Render the Homebrew formula only from a published stable release."""
+
+import argparse
+import json
+from pathlib import Path
+import re
+from string import Template
+
+
+VERSION = r"(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)"
+ASSETS = {
+    "NSH_MACOS_ARM64": "nsh-macos-arm64.tar.gz",
+    "NSH_LINUX_X86_64": "nsh-linux-x86_64.tar.gz",
+}
+
+
+def release_version(release):
+    tag = release["tagName"]
+    if release["isDraft"] or release["isPrerelease"] or not re.fullmatch("v" + VERSION, tag):
+        raise ValueError("Homebrew requires a published stable release tagged vX.Y.Z")
+    return tag[1:]
+
+
+def render(release, sums, repository, current=None):
+    version = release_version(release)
+    if not re.fullmatch(r"[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+", repository):
+        raise ValueError("invalid GitHub repository")
+    if current is not None:
+        # The formula infers its version from the release URL. Refuse a rerun
+        # of an older release after a newer one has reached the tap.
+        versions = re.findall(r"/releases/download/v(" + VERSION + r")/", current)
+        if not versions:
+            raise ValueError("cannot determine the current Homebrew formula version")
+        requested = tuple(map(int, version.split(".")))
+        if any(tuple(map(int, match[1:])) > requested for match in versions):
+            raise ValueError(f"refusing to downgrade the Homebrew formula to {version}")
+    values = {"NSH_VERSION": version, "NSH_REPO": repository}
+    for variable, asset in ASSETS.items():
+        checksum_file = sums / (asset + ".sha256")
+        checksum = checksum_file.read_text(encoding="utf-8").strip()
+        match = re.fullmatch(r"([0-9a-fA-F]{64}) [ *]" + re.escape(asset), checksum)
+        if not match:
+            raise ValueError(f"invalid SHA-256 or filename in {checksum_file.name}")
+        values[variable] = match[1].lower()
+    template = Path(__file__).with_name("nsh.rb").read_text(encoding="utf-8")
+    return Template(template).substitute(values)
+
+
+def main():
+    parser = argparse.ArgumentParser(description=__doc__)
+    parser.add_argument("--release", type=Path, required=True)
+    parser.add_argument("--sums", type=Path, required=True)
+    parser.add_argument("--repository", required=True)
+    parser.add_argument("--output", type=Path, required=True)
+    parser.add_argument("--current", type=Path)
+    args = parser.parse_args()
+    try:
+        release = json.loads(args.release.read_text(encoding="utf-8"))
+        current = args.current.read_text(encoding="utf-8") if args.current else None
+        formula = render(release, args.sums, args.repository, current)
+    except (KeyError, ValueError, OSError) as error:
+        parser.exit(1, f"Homebrew formula: {error}\n")
+    args.output.write_text(formula, encoding="utf-8")
+
+
+if __name__ == "__main__":
+    main()
diff --git a/third-party/nsh/.github/packages/nsh.json b/third-party/nsh/.github/packages/nsh.json
new file mode 100644
index 0000000000..da019d70f5
--- /dev/null
+++ b/third-party/nsh/.github/packages/nsh.json
@@ -0,0 +1,15 @@
+{
+    "version": "${NSH_VERSION}",
+    "description": "Native UI from TSX modules: the nsh command line and its prebuilt runtimes",
+    "homepage": "https://nsh.dev",
+    "license": "Apache-2.0",
+    "notes": "Scoop updates nsh from the latest release's manifest: scoop update nsh",
+    "architecture": {
+        "64bit": {
+            "url": "https://github.com/${NSH_REPO}/releases/download/v${NSH_VERSION}/nsh-windows-x86_64.zip",
+            "hash": "${NSH_HASH}"
+        }
+    },
+    "extract_dir": "nsh",
+    "bin": "bin\\nsh.exe"
+}
diff --git a/third-party/nsh/.github/packages/nsh.rb b/third-party/nsh/.github/packages/nsh.rb
new file mode 100644
index 0000000000..2cc8972750
--- /dev/null
+++ b/third-party/nsh/.github/packages/nsh.rb
@@ -0,0 +1,36 @@
+# Keep the distribution together: nsh finds its runtimes next to bin/nsh.
+class Nsh < Formula
+  desc "Native UI from TSX modules, with a CLI and prebuilt runtimes"
+  homepage "https://nsh.dev"
+  # A default URL lets unsupported architectures reach the requirements check.
+  url "https://github.com/${NSH_REPO}/releases/download/v${NSH_VERSION}/nsh-macos-arm64.tar.gz"
+  sha256 "${NSH_MACOS_ARM64}"
+  license "Apache-2.0"
+
+  on_macos do
+    depends_on arch: :arm64
+  end
+
+  on_linux do
+    depends_on arch: :x86_64
+
+    on_intel do
+      url "https://github.com/${NSH_REPO}/releases/download/v${NSH_VERSION}/nsh-linux-x86_64.tar.gz"
+      sha256 "${NSH_LINUX_X86_64}"
+    end
+  end
+
+  def install
+    libexec.install Dir["*"]
+    bin.install_symlink libexec/"bin/nsh"
+  end
+
+  test do
+    assert_match "nsh #{version}", shell_output("#{bin}/nsh --version")
+    system bin/"nsh", "init", "hello"
+    system bin/"nsh", "package", "hello", "--target", "web"
+    assert_path_exists testpath/".nsh/out/hello/index.html"
+    refute_empty (testpath/".nsh/out/hello").glob("nsh.*.wasm")
+    refute_empty (testpath/".nsh/out/hello").glob("nsh.*.js")
+  end
+end
diff --git a/third-party/nsh/.github/packages/test_homebrew.py b/third-party/nsh/.github/packages/test_homebrew.py
new file mode 100644
index 0000000000..5640bd53d9
--- /dev/null
+++ b/third-party/nsh/.github/packages/test_homebrew.py
@@ -0,0 +1,91 @@
+import json
+from pathlib import Path
+import subprocess
+import sys
+import tempfile
+import unittest
+
+from homebrew import ASSETS, render
+
+
+class HomebrewFormulaTest(unittest.TestCase):
+    def setUp(self):
+        self.temp = tempfile.TemporaryDirectory()
+        self.addCleanup(self.temp.cleanup)
+        self.sums = Path(self.temp.name)
+        self.release = {"tagName": "v0.1.2", "isDraft": False, "isPrerelease": False}
+        for i, asset in enumerate(ASSETS.values(), 1):
+            (self.sums / (asset + ".sha256")).write_text(f"{str(i) * 64}  {asset}\n")
+
+    def render(self, current=None):
+        return render(self.release, self.sums, "longbridge/nsh", current)
+
+    def test_versions_checksums_and_distribution_layout(self):
+        formula = self.render()
+        for i, asset in enumerate(ASSETS.values(), 1):
+            self.assertIn(f"https://github.com/longbridge/nsh/releases/download/v0.1.2/{asset}", formula)
+            self.assertIn(f'sha256 "{str(i) * 64}"', formula)
+        self.assertNotIn("${", formula)
+        self.assertIn("depends_on arch: :arm64", formula)
+        self.assertIn("depends_on arch: :x86_64", formula)
+        self.assertIn('libexec.install Dir["*"]', formula)
+        self.assertIn('bin.install_symlink libexec/"bin/nsh"', formula)
+        self.assertIn('"package", "hello", "--target", "web"', formula)
+        self.assertIn('glob("nsh.*.wasm")', formula)
+        self.assertIn('glob("nsh.*.js")', formula)
+
+    def test_rejects_unpublished_and_prerelease_versions(self):
+        for change in ({"isDraft": True}, {"isPrerelease": True},
+                       {"tagName": "v0.1.2-rc.1"}, {"tagName": "0.1.2"},
+                       {"tagName": "v01.2.3"}, {"tagName": 'v0.1.2\"\nputs 1'}):
+            with self.subTest(change=change), self.assertRaises(ValueError):
+                render(self.release | change, self.sums, "longbridge/nsh")
+
+    def test_rejects_invalid_repository(self):
+        with self.assertRaises(ValueError):
+            render(self.release, self.sums, 'longbridge/nsh"', None)
+
+    def test_checksums_must_match_the_asset(self):
+        asset = next(iter(ASSETS.values()))
+        path = self.sums / (asset + ".sha256")
+        for value in ("", "1" * 63 + f"  {asset}", "z" * 64 + f"  {asset}",
+                      "1" * 64 + "  wrong.tar.gz", "1" * 64 + f"  {asset}\nextra"):
+            with self.subTest(value=value), self.assertRaises(ValueError):
+                path.write_text(value)
+                self.render()
+        path.write_text("A" * 64 + f" *{asset}\n")
+        self.assertIn('sha256 "' + "a" * 64 + '"', self.render())
+
+    def test_missing_checksum_fails(self):
+        (self.sums / (next(iter(ASSETS.values())) + ".sha256")).unlink()
+        with self.assertRaises(FileNotFoundError):
+            self.render()
+
+    def test_reruns_are_identical_and_never_downgrade(self):
+        formula = self.render()
+        self.assertEqual(self.render(current=formula), formula)
+        self.assertEqual(self.render(current=formula.replace("v0.1.2/", "v0.1.1/")), formula)
+        for version in ("0.1.3", "0.10.0", "1.0.0"):
+            with self.subTest(version=version), self.assertRaisesRegex(ValueError, "downgrade"):
+                self.render(current=formula.replace("v0.1.2/", f"v{version}/"))
+        with self.assertRaisesRegex(ValueError, "current Homebrew formula version"):
+            self.render(current="an unrecognized formula")
+
+    def test_failed_cli_preserves_existing_output(self):
+        release = self.sums / "release.json"
+        release.write_text(json.dumps(self.release | {"isDraft": True}))
+        output = self.sums / "nsh.rb"
+        output.write_text("existing formula")
+        result = subprocess.run(
+            [sys.executable, str(Path(__file__).with_name("homebrew.py")),
+             "--release", str(release), "--sums", str(self.sums),
+             "--repository", "longbridge/nsh", "--output", str(output)],
+            capture_output=True, text=True,
+        )
+        self.assertNotEqual(result.returncode, 0)
+        self.assertIn("published stable release", result.stderr)
+        self.assertEqual(output.read_text(), "existing formula")
+
+
+if __name__ == "__main__":
+    unittest.main()
diff --git a/third-party/nsh/.github/pull_request_template.md b/third-party/nsh/.github/pull_request_template.md
new file mode 100644
index 0000000000..0dee43730e
--- /dev/null
+++ b/third-party/nsh/.github/pull_request_template.md
@@ -0,0 +1,44 @@
+Closes #[issue number]
+
+## Description
+
+Describe in English the changes made in this pull request and the problem it solves.
+Please keep **1 PR to solve 1 problem**, and keep **small improvements small** to make the PR easier to review and to merge.
+
+## Screenshot
+
+| Platform | Before                       | After                       |
+| -------- | ---------------------------- | --------------------------- |
+| iOS      | [Put Before Screenshot here] | [Put After Screenshot here] |
+| Android  | [Put Before Screenshot here] | [Put After Screenshot here] |
+
+## Public API
+
+List every public item this pull request adds, changes or removes, grouped by crate or module, with its signature and one line on what it is for: Rust items, JS exports, elements, props, style keys, Tailwind utilities, `nsh.json` keys, CLI commands and SDK APIs. If none, remove this section.
+
+- `nsh/list`: `List` prop `example?: boolean` — what it does.
+
+## Breaking Changes
+
+Describe any breaking changes introduced by this pull request. If none, remove this section. What apps use (JS exports, elements, props, style keys, Tailwind utilities, their types and behavior) is never broken: see [compatibility](../docs/dev/compatibility.md).
+
+```diff
+- Old code snippet
++ New code snippet
+```
+
+## Performance
+
+For changes to a hot path: before / after `nsh test --trace` timings and mount item counts. If none, remove this section.
+
+## How to Test
+
+Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce.
+
+## Checklist
+
+- [ ] I have read the [CONTRIBUTING](../CONTRIBUTING.md) document and followed the guidelines.
+- [ ] Reviewed the changes in this PR and confirmed AI generated code (if any) is accurate.
+- [ ] Passed `cargo test --workspace`, `cargo +nightly fmt --all` and clippy (including the Catalyst and Android runs for platform code).
+- [ ] Changes to what apps use keep what released versions shipped and come with a case in `tests/compat/` (`cargo xtask compat`).
+- [ ] Ran the related `examples/gallery` demos on iOS and Android (if the change is visible or platform-specific).
diff --git a/third-party/nsh/.github/workflows/ci-paths.yml b/third-party/nsh/.github/workflows/ci-paths.yml
new file mode 100644
index 0000000000..09c5409650
--- /dev/null
+++ b/third-party/nsh/.github/workflows/ci-paths.yml
@@ -0,0 +1,42 @@
+name: CI paths
+
+# The Rust workflows run only when what they build changes, listed crate by
+# crate in their `paths`. This checks those lists against the workspace's
+# dependency graph, so a crate a workflow tests can never be left out
+# (.github/ci/paths.py). It runs on every pull request, whatever it
+# changes: its job is the `check` main's ruleset requires, which a pull
+# request that runs no other workflow with that job (one touching only
+# `crates/gpui`) would otherwise never report. It takes seconds.
+
+on:
+  push:
+    branches: [main]
+    paths:
+      - "**/Cargo.toml"
+      - ".github/workflows/**"
+      - ".github/ci/**"
+  pull_request:
+  merge_group:
+    types: [checks_requested]
+  workflow_dispatch:
+
+permissions:
+  contents: read
+
+concurrency:
+  group: ci-paths-${{ github.ref }}
+  cancel-in-progress: true
+
+env:
+  # `cargo metadata --no-deps` only: no toolchain targets to install.
+  RUSTUP_TOOLCHAIN: stable
+
+jobs:
+  check:
+    runs-on: ubuntu-24.04
+    steps:
+      - uses: actions/checkout@v4
+      - name: Check the workflows' paths
+        run: |
+          python3 -c "import yaml" 2>/dev/null || pip install pyyaml
+          python3 .github/ci/paths.py
diff --git a/third-party/nsh/.github/workflows/compat.yml b/third-party/nsh/.github/workflows/compat.yml
new file mode 100644
index 0000000000..6a15659632
--- /dev/null
+++ b/third-party/nsh/.github/workflows/compat.yml
@@ -0,0 +1,118 @@
+name: Compat
+
+# Holds the checkout to what NSH's releases froze: runs
+# longbridge/nsh-compat (the record of each compatible release and the
+# checks, kept apart so no change here can rewrite them) against it, as
+# `cargo xtask compat` does: the apps of `tests/compat/` built by this
+# checkout's `nsh` and run, every recorded release's API still offered and
+# its apps still running (docs/dev/compatibility.md).
+#
+# Its job, `compat`, is one main's ruleset requires, so it runs on every
+# pull request and reports: one that changes nothing it builds (the
+# filter's list, held to the dependency graph by .github/ci/paths.py)
+# passes in seconds without building.
+
+on:
+  push:
+    branches: [main, "tui/terminal-backend"]
+  pull_request:
+  merge_group:
+    types: [checks_requested]
+  workflow_dispatch:
+
+permissions:
+  contents: read
+  # The filter reads a pull request's changed files.
+  pull-requests: read
+
+concurrency:
+  group: compat-${{ github.ref }}
+  cancel-in-progress: true
+
+env:
+  # CI builds each crate once: no incremental state and no debug info
+  # (faster builds, smaller caches; panics still name their file and line).
+  CARGO_INCREMENTAL: "0"
+  CARGO_PROFILE_DEV_DEBUG: "0"
+  # The toolchain file's iOS and Android targets are only the release's.
+  RUSTUP_TOOLCHAIN: stable
+
+jobs:
+  compat:
+    runs-on: ubuntu-24.04
+    steps:
+      # A pull request runs the checks when it changes what they build;
+      # main and manual runs always do.
+      - name: Find what changed
+        id: changes
+        if: github.event_name == 'pull_request'
+        uses: dorny/paths-filter@v3
+        with:
+          filters: |
+            compat:
+              - "crates/nsh-base/**"
+              - "crates/nsh-bundler/**"
+              - "crates/nsh-cli/**"
+              - "crates/nsh-core/**"
+              - "crates/nsh-dev/**"
+              - "crates/nsh-engine/**"
+              - "crates/nsh-js/**"
+              - "crates/nsh-macros/**"
+              - "crates/nsh-package/**"
+              - "crates/nsh-testing/**"
+              - "tests/compat/**"
+              - "examples/counter/**"
+              - "examples/desktop/**"
+              - "examples/gallery/**"
+              - "examples/hopper/**"
+              - "Cargo.toml"
+              - "Cargo.lock"
+              - ".cargo/**"
+              - "rust-toolchain.toml"
+              - ".github/workflows/compat.yml"
+
+      - name: Decide
+        id: run
+        run: echo "check=${{ github.event_name != 'pull_request' || steps.changes.outputs.compat == 'true' }}" >> "$GITHUB_OUTPUT"
+
+      # Side by side: nsh-compat's crates depend on `../nsh`.
+      - uses: actions/checkout@v4
+        if: steps.run.outputs.check == 'true'
+        with:
+          path: nsh
+
+      - uses: actions/checkout@v4
+        if: steps.run.outputs.check == 'true'
+        with:
+          repository: longbridge/nsh-compat
+          path: nsh-compat
+
+      # QuickJS is C (bindgen needs libclang).
+      - name: Install clang
+        if: steps.run.outputs.check == 'true'
+        run: sudo apt-get update && sudo apt-get install -y clang libclang-dev
+
+      - name: Setup Rust
+        if: steps.run.outputs.check == 'true'
+        uses: dtolnay/rust-toolchain@stable
+
+      # Dependencies only: main's runs save it, pull requests restore it.
+      - name: Cache Cargo
+        if: steps.run.outputs.check == 'true'
+        uses: Swatinem/rust-cache@v2
+        with:
+          workspaces: nsh
+          save-if: ${{ github.ref == 'refs/heads/main' }}
+
+      - name: Build nsh
+        if: steps.run.outputs.check == 'true'
+        working-directory: nsh
+        run: cargo build -p nsh-cli
+
+      # The checkout's versions, so the cache serves both.
+      - name: Check
+        if: steps.run.outputs.check == 'true'
+        working-directory: nsh-compat
+        run: |
+          cp ../nsh/Cargo.lock .
+          cargo test --target-dir ../nsh/target
diff --git a/third-party/nsh/.github/workflows/core.yml b/third-party/nsh/.github/workflows/core.yml
new file mode 100644
index 0000000000..60693fe39a
--- /dev/null
+++ b/third-party/nsh/.github/workflows/core.yml
@@ -0,0 +1,100 @@
+name: Core
+
+# Lints and tests the crates every platform shares: the core, the animation
+# graph, the macros, the JS runtime (the runtime's Rust modules included), `nsh/base`, the
+# engine, the bundler and signed packages. The platform workflows test their backends and the
+# tooling only, so these ran nowhere but on developers' machines. What
+# releases froze is checked by the Compat workflow.
+
+on:
+  push:
+    branches: [main]
+    paths:
+      - "crates/nsh-bundler/**"
+      - "crates/nsh-core/**"
+      - "crates/nsh-dev/**"
+      - "crates/nsh-engine/**"
+      - "crates/nsh-js/**"
+      - "crates/nsh-macros/**"
+      - "crates/nsh-package/**"
+      - "crates/nsh-testing/**"
+      - "crates/nsh-base/**"
+      - "examples/counter/**"
+      - "examples/gallery/**"
+      - "examples/bench/**"
+      - "Cargo.toml"
+      - "Cargo.lock"
+      - ".cargo/**"
+      - "rust-toolchain.toml"
+      - ".github/workflows/core.yml"
+  pull_request:
+    paths:
+      - "crates/nsh-bundler/**"
+      - "crates/nsh-core/**"
+      - "crates/nsh-dev/**"
+      - "crates/nsh-engine/**"
+      - "crates/nsh-js/**"
+      - "crates/nsh-macros/**"
+      - "crates/nsh-package/**"
+      - "crates/nsh-testing/**"
+      - "crates/nsh-base/**"
+      - "examples/counter/**"
+      - "examples/gallery/**"
+      - "examples/bench/**"
+      - "Cargo.toml"
+      - "Cargo.lock"
+      - ".cargo/**"
+      - "rust-toolchain.toml"
+      - ".github/workflows/core.yml"
+  merge_group:
+    types: [checks_requested]
+  workflow_dispatch:
+
+permissions:
+  contents: read
+
+concurrency:
+  group: core-${{ github.ref }}
+  cancel-in-progress: true
+
+env:
+  # CI builds each crate once: no incremental state and no debug info
+  # (faster builds, smaller caches; panics still name their file and line).
+  CARGO_INCREMENTAL: "0"
+  CARGO_PROFILE_DEV_DEBUG: "0"
+  # The toolchain file's iOS and Android targets are only the release's.
+  RUSTUP_TOOLCHAIN: stable
+  # The bundler as the command line builds it (`bundle`: rolldown and the
+  # whole pipeline), so its tests all run.
+  PACKAGES: >-
+    -p nsh-core -p nsh-macros -p nsh-js -p nsh-base -p nsh-engine
+    -p nsh-bundler -p nsh-package -p nsh-testing
+    --features nsh-bundler/bundle,nsh-testing/bundle,nsh-testing/agent
+
+jobs:
+  check:
+    runs-on: ubuntu-24.04
+    steps:
+      - uses: actions/checkout@v4
+
+      # QuickJS is C (bindgen needs libclang); none of these crates needs a
+      # platform backend.
+      - name: Install clang
+        run: sudo apt-get update && sudo apt-get install -y clang libclang-dev
+
+      - name: Setup Rust
+        uses: dtolnay/rust-toolchain@stable
+        with:
+          components: clippy
+
+      # Dependencies only: main's runs save it, pull requests restore it.
+      - name: Cache Cargo
+        uses: Swatinem/rust-cache@v2
+        with:
+          save-if: ${{ github.ref == 'refs/heads/main' }}
+
+      - name: Clippy
+        run: cargo clippy --all-targets $PACKAGES -- -D warnings
+
+      - name: Test
+        run: cargo test $PACKAGES
diff --git a/third-party/nsh/.github/workflows/examples.yml b/third-party/nsh/.github/workflows/examples.yml
new file mode 100644
index 0000000000..02b8847d70
--- /dev/null
+++ b/third-party/nsh/.github/workflows/examples.yml
@@ -0,0 +1,86 @@
+name: Examples
+
+# Checks every example: the Rust crates among them (members of the
+# workspace under `examples/`: their lints and tests, such as the Rust
+# gallery's black-box tests, which run every demo through the engine,
+# headless) and every app entry (a top-level `.tsx` of an example that calls
+# `mount`, and the `nsh.json` of a Rust app, one declaring a `"root"`),
+# built with `nsh build`. All are found, so a new example is checked
+# without a change here. The other workflows only run for
+# `crates/**`, so a change to the examples alone was never built.
+
+on:
+  push:
+    branches: [main]
+    paths:
+      - "examples/**"
+      - ".github/workflows/examples.yml"
+  pull_request:
+    paths:
+      - "examples/**"
+      - ".github/workflows/examples.yml"
+  merge_group:
+    types: [checks_requested]
+  workflow_dispatch:
+
+permissions:
+  contents: read
+
+concurrency:
+  group: examples-${{ github.ref }}
+  cancel-in-progress: true
+
+env:
+  # CI builds each crate once: no incremental state and no debug info
+  # (faster builds, smaller caches; panics still name their file and line).
+  CARGO_INCREMENTAL: "0"
+  CARGO_PROFILE_DEV_DEBUG: "0"
+  # The toolchain file's iOS and Android targets are only the release's.
+  RUSTUP_TOOLCHAIN: stable
+
+jobs:
+  check:
+    runs-on: ubuntu-24.04
+    steps:
+      - uses: actions/checkout@v4
+
+      # QuickJS is C (bindgen needs libclang). The Rust gallery also
+      # links GTK through its native desktop entry's dependencies.
+      - name: Install clang and GTK 4
+        run: sudo apt-get update && sudo apt-get install -y clang libclang-dev libgtk-4-dev jq
+
+      - name: Setup Rust
+        uses: dtolnay/rust-toolchain@stable
+        with:
+          components: clippy
+
+      # Dependencies only: main's runs save it, pull requests restore it.
+      - name: Cache Cargo
+        uses: Swatinem/rust-cache@v2
+        with:
+          save-if: ${{ github.ref == 'refs/heads/main' }}
+
+      - name: Find the Rust examples
+        id: crates
+        run: >
+          echo "packages=$(cargo metadata --no-deps --format-version 1
+          | jq -r '[.packages[] | select(.manifest_path | contains("/examples/")) | "-p " + .name] | join(" ")')"
+          >> "$GITHUB_OUTPUT"
+
+      - name: Clippy
+        if: steps.crates.outputs.packages != ''
+        run: cargo clippy --all-targets ${{ steps.crates.outputs.packages }} -- -D warnings
+
+      - name: Test
+        if: steps.crates.outputs.packages != ''
+        run: cargo test ${{ steps.crates.outputs.packages }}
+
+      # An app with a Rust crate (`nsh.json` "rust") builds its own command
+      # line with the crate first; a Rust app has no bundle, its build
+      # gathers what it ships besides its runners.
+      - name: Build the apps
+        run: |
+          cargo build -p nsh-cli
+          for entry in $(grep -l "mount(" examples/*/*.tsx) $(grep -l '"root"' examples/*/nsh.json); do
+            ./target/debug/nsh build "$entry" -o "$RUNNER_TEMP/bundles/${entry//\//_}"
+          done
diff --git a/third-party/nsh/.github/workflows/gpui.yml b/third-party/nsh/.github/workflows/gpui.yml
new file mode 100644
index 0000000000..9194e0a737
--- /dev/null
+++ b/third-party/nsh/.github/workflows/gpui.yml
@@ -0,0 +1,170 @@
+name: GPUI
+
+# Builds, lints and tests the GPUI backend (the workspace in `crates/gpui`) on
+# macOS, Windows and Linux, and lints the GPUI Kit example
+# (`examples/embed-gpui`, a workspace of its own) on Linux. The main workspace's CI covers the CLI that runs
+# it (`nsh run --target gpui`).
+
+on:
+  # Include shared main-workspace dependencies: upstream merges can change
+  # the core without touching the GPUI workspace itself.
+  push:
+    branches: [main, tui/terminal-backend]
+    paths:
+      - "crates/nsh-base/**"
+      - "crates/nsh-bundler/**"
+      - "crates/nsh-core/**"
+      - "crates/nsh-dev/**"
+      - "crates/nsh-engine/**"
+      - "crates/nsh-js/**"
+      - "crates/nsh-macros/**"
+      - "crates/nsh-package/**"
+      - "crates/nsh-testing/**"
+      - "crates/gpui/**"
+      - "third-party/gpui-wgpu/**"
+      - "third-party/icy_sixel/**"
+      - "examples/embed-gpui/**"
+      - "Cargo.toml"
+      - "Cargo.lock"
+      - ".cargo/**"
+      - "rust-toolchain.toml"
+      - ".github/workflows/gpui.yml"
+  pull_request:
+    paths:
+      - "crates/nsh-base/**"
+      - "crates/nsh-bundler/**"
+      - "crates/nsh-core/**"
+      - "crates/nsh-dev/**"
+      - "crates/nsh-engine/**"
+      - "crates/nsh-js/**"
+      - "crates/nsh-macros/**"
+      - "crates/nsh-package/**"
+      - "crates/nsh-testing/**"
+      - "crates/gpui/**"
+      - "third-party/gpui-wgpu/**"
+      - "third-party/icy_sixel/**"
+      - "examples/embed-gpui/**"
+      - "Cargo.toml"
+      - "Cargo.lock"
+      - ".cargo/**"
+      - "rust-toolchain.toml"
+      - ".github/workflows/gpui.yml"
+  schedule:
+    - cron: "0 3 * * *"
+  merge_group:
+    types: [checks_requested]
+  workflow_dispatch:
+
+permissions:
+  contents: read
+
+concurrency:
+  group: gpui-${{ github.ref }}
+  cancel-in-progress: true
+
+defaults:
+  run:
+    shell: bash
+
+env:
+  # CI builds each crate once: no incremental state and no debug info
+  # (faster builds, smaller caches; panics still name their file and line).
+  CARGO_INCREMENTAL: "0"
+  CARGO_PROFILE_DEV_DEBUG: "0"
+  # The toolchain file's iOS and Android targets are only the release's.
+  RUSTUP_TOOLCHAIN: stable
+
+jobs:
+  check:
+    name: check (${{ matrix.os }})
+    strategy:
+      fail-fast: false
+      matrix:
+        os: [ubuntu-24.04, macos-15, windows-latest]
+    runs-on: ${{ matrix.os }}
+    steps:
+      - uses: actions/checkout@v4
+
+      # Temporary directories (tests) outside the checkout.
+      - name: Set up the environment
+        run: |
+          mkdir -p "$RUNNER_TEMP/tmp"
+          echo "TMPDIR=$RUNNER_TEMP/tmp" >> "$GITHUB_ENV"
+
+      # QuickJS is C (bindgen needs libclang); GPUI links X11, Wayland,
+      # xkbcommon, fontconfig and FreeType, and draws with Vulkan (GPUI
+      # Fast's CI list); web views (feature `webview`, wry) need GTK 3 and
+      # WebKitGTK 4.1, videos (feature `video`) GStreamer 1.20+.
+      - name: Install Linux dependencies
+        if: runner.os == 'Linux'
+        run: |
+          sudo apt-get update
+          sudo apt-get install -y \
+            clang libclang-dev build-essential pkg-config \
+            libasound2-dev libfontconfig-dev libfreetype-dev libssl-dev \
+            libvulkan1 mesa-vulkan-drivers libwayland-dev libx11-xcb-dev libxcb1-dev \
+            libxkbcommon-dev libxkbcommon-x11-dev libzstd-dev \
+            libgtk-3-dev libwebkit2gtk-4.1-dev \
+            libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
+
+      - name: Set up Windows
+        if: runner.os == 'Windows'
+        run: |
+          # QuickJS is C: bindgen needs libclang, which the image's LLVM has.
+          echo "LIBCLANG_PATH=C:\\Program Files\\LLVM\\bin" >> "$GITHUB_ENV"
+          # rustc can overflow its default stack on the `windows` crate.
+          echo "RUST_MIN_STACK=268435456" >> "$GITHUB_ENV"
+
+      - name: Setup Rust
+        uses: dtolnay/rust-toolchain@stable
+        with:
+          components: clippy
+
+      # Dependencies only: main's runs save it, pull requests restore it.
+      - name: Cache Cargo
+        uses: Swatinem/rust-cache@v2
+        with:
+          save-if: ${{ github.ref == 'refs/heads/main' }}
+          workspaces: crates/gpui -> ../../target
+
+      # The GPUI workspace builds into the repository's `target/`
+      # (`crates/gpui/.cargo/config.toml`).
+      - name: Clippy
+        working-directory: crates/gpui
+        run: cargo clippy --all-targets --features nsh-platform-gpui/dev -- -D warnings
+
+      # Tests need no display: they open no window.
+      - name: Test
+        working-directory: crates/gpui
+        run: cargo test
+
+      # With the tests in windows of GPUI's test platform (feature `shot`, GPUI's
+      # test support): still no display.
+      - name: Test (GPUI's test platform)
+        if: runner.os == 'Linux'
+        working-directory: crates/gpui
+        run: cargo test -p nsh-platform-gpui --features shot
+
+      # Dependency unit tests are not run by the GPUI workspace's cargo test.
+      # Mesa supplies a real CPU Vulkan adapter without a physical GPU.
+      - name: Test (WGPU pixel readback)
+        if: runner.os == 'Linux'
+        working-directory: crates/gpui
+        run: >
+          cargo test --manifest-path ../../third-party/gpui-wgpu/Cargo.toml
+          --features offscreen,test-support --lib headless_
+          -- --test-threads=1 --nocapture
+
+      # What a Mac without Xcode's Metal Toolchain builds (the CLI turns
+      # the feature on there): GPUI's build script stitches its shaders
+      # for run time compilation instead of running `metal`.
+      - name: Check (runtime-shaders)
+        if: runner.os == 'macOS'
+        working-directory: crates/gpui
+        run: cargo check -p nsh-gpui-host --features nsh-platform-gpui/runtime-shaders
+
+      # The GPUI Kit example: its `build.rs` bundles its app.
+      - name: Clippy (examples/embed-gpui)
+        if: runner.os == 'Linux'
+        working-directory: examples/embed-gpui
+        run: cargo clippy --all-targets -- -D warnings
diff --git a/third-party/nsh/.github/workflows/layerfs.yml b/third-party/nsh/.github/workflows/layerfs.yml
new file mode 100644
index 0000000000..fdbc2fb6a1
--- /dev/null
+++ b/third-party/nsh/.github/workflows/layerfs.yml
@@ -0,0 +1,59 @@
+name: LayerFS trial
+
+# An opt-in experiment with real Git/Cargo and snapshot reuse. Run this on
+# Linux before considering LayerFS for any required, cross-platform check.
+on:
+  workflow_dispatch:
+
+permissions:
+  contents: read
+
+concurrency:
+  group: layerfs-${{ github.ref }}
+  cancel-in-progress: false
+
+jobs:
+  trial:
+    runs-on: ubuntu-24.04
+    timeout-minutes: 45
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          persist-credentials: false
+
+      - name: Test the local command
+        run: python3 -B .github/ci/test_layerfs.py
+
+      # LayerFS pins Docker API 1.54; hosted images can carry an older Engine.
+      - uses: docker/setup-docker-action@v4
+        id: docker
+        with:
+          version: v29.7.2
+
+      - uses: dtolnay/rust-toolchain@master
+        with:
+          toolchain: 1.85.1
+
+      - uses: Swatinem/rust-cache@v2
+        with:
+          key: layerfs-1.0.0
+          save-if: ${{ github.ref == 'refs/heads/main' }}
+
+      - name: Build pinned LayerFS and the Rust runtime image
+        run: ./scripts/layerfs prepare
+
+      - name: Test Git, Cargo, snapshot reuse and branch isolation
+        run: ./scripts/layerfs smoke --docker-socket '${{ steps.docker.outputs.sock }}'
+
+      - name: Upload receipts
+        if: always()
+        uses: actions/upload-artifact@v4
+        with:
+          name: layerfs-receipts
+          path: |
+            .nsh/layerfs/deployment.json
+            .nsh/layerfs/nsh-*/settings.json
+            .nsh/layerfs/nsh-*/result.json
+            .nsh/layerfs/nsh-*/trace.jsonl
+          include-hidden-files: true
+          if-no-files-found: warn
diff --git a/third-party/nsh/.github/workflows/linux.yml b/third-party/nsh/.github/workflows/linux.yml
new file mode 100644
index 0000000000..74d8befbc4
--- /dev/null
+++ b/third-party/nsh/.github/workflows/linux.yml
@@ -0,0 +1,132 @@
+name: Linux
+
+# Builds, lints and tests the Linux backend (GTK 4) and the tooling that runs
+# it (`nsh run --target linux`, `nsh package --target linux`).
+
+on:
+  push:
+    branches: [main]
+    paths:
+      - "crates/nsh-bundler/**"
+      - "crates/nsh-cli/**"
+      - "crates/nsh-core/**"
+      - "crates/nsh-dev/**"
+      - "crates/nsh-engine/**"
+      - "crates/nsh-js/**"
+      - "crates/nsh-linux-app/**"
+      - "crates/nsh-linux-host/**"
+      - "crates/nsh-macros/**"
+      - "crates/nsh-package/**"
+      - "crates/nsh-platform-linux/**"
+      - "crates/nsh-testing/**"
+      - "crates/nsh-base/**"
+      - "crates/xtask/**"
+      - "examples/counter/**"
+      - "examples/gallery/**"
+      - "Cargo.toml"
+      - "Cargo.lock"
+      - ".cargo/**"
+      - "rust-toolchain.toml"
+      - ".github/workflows/linux.yml"
+  pull_request:
+    paths:
+      - "crates/nsh-bundler/**"
+      - "crates/nsh-cli/**"
+      - "crates/nsh-core/**"
+      - "crates/nsh-dev/**"
+      - "crates/nsh-engine/**"
+      - "crates/nsh-js/**"
+      - "crates/nsh-linux-app/**"
+      - "crates/nsh-linux-host/**"
+      - "crates/nsh-macros/**"
+      - "crates/nsh-package/**"
+      - "crates/nsh-platform-linux/**"
+      - "crates/nsh-testing/**"
+      - "crates/nsh-base/**"
+      - "crates/xtask/**"
+      - "examples/counter/**"
+      - "examples/gallery/**"
+      - "Cargo.toml"
+      - "Cargo.lock"
+      - ".cargo/**"
+      - "rust-toolchain.toml"
+      - ".github/workflows/linux.yml"
+  merge_group:
+    types: [checks_requested]
+  workflow_dispatch:
+
+permissions:
+  contents: read
+
+concurrency:
+  group: linux-${{ github.ref }}
+  cancel-in-progress: true
+
+env:
+  # CI builds each crate once: no incremental state and no debug info
+  # (faster builds, smaller caches; panics still name their file and line).
+  CARGO_INCREMENTAL: "0"
+  CARGO_PROFILE_DEV_DEBUG: "0"
+  # The toolchain file's iOS and Android targets are only the release's.
+  RUSTUP_TOOLCHAIN: stable
+
+jobs:
+  check:
+    # 24.04 has GTK 4.14 and Pango 1.52+, what `nsh-platform-linux` needs.
+    runs-on: ubuntu-24.04
+    steps:
+      - uses: actions/checkout@v4
+
+      # QuickJS is C (bindgen needs libclang); the backend links GTK 4 and
+      # Pango, and WebKitGTK 6.0 for web views (the hosts' default); Xvfb
+      # is the display the examples' tests open their windows on.
+      - name: Install clang, GTK 4 and WebKitGTK
+        run: sudo apt-get update && sudo apt-get install -y clang libclang-dev libgtk-4-dev libwebkitgtk-6.0-dev xvfb
+
+      - name: Setup Rust
+        uses: dtolnay/rust-toolchain@stable
+        with:
+          components: clippy
+
+      # Dependencies only: main's runs save it, pull requests restore it.
+      - name: Cache Cargo
+        uses: Swatinem/rust-cache@v2
+        with:
+          save-if: ${{ github.ref == 'refs/heads/main' }}
+
+      - name: Clippy
+        run: >
+          cargo clippy --all-targets
+          -p nsh-platform-linux -p nsh-linux-host -p nsh-linux-app
+          -p nsh-cli -p nsh-dev -p xtask
+          -- -D warnings
+
+      # The backend alone, without the `webview` feature the hosts turn on:
+      # web views as placeholders.
+      - name: Clippy (without WebKitGTK)
+        run: cargo clippy --all-targets -p nsh-platform-linux -- -D warnings
+
+      # Tests need no display: they do not start GTK.
+      - name: Test
+        run: >
+          cargo test -p nsh-platform-linux -p nsh-cli -p nsh-dev
+          && cargo test -p nsh-platform-linux --features webview
+
+      # The examples' tests in GTK windows on a virtual display, with the
+      # platform's input (`nsh test --target linux`): those a real platform
+      # runs (real time).
+      - name: Run the examples' tests in GTK windows
+        run: |
+          cargo build -p nsh-cli
+          # A session bus of its own: without one, GTK's portal and
+          # accessibility lookups wait for D-Bus autolaunch on each display.
+          run() { dbus-run-session -- xvfb-run -a ./target/debug/nsh test "$@" --target linux; }
+          run examples/counter
+          for file in context-menu device dock form gestures hover links navigation network photos resizable shortcuts storage timers; do
+            run "examples/gallery/tests/$file.test.tsx"
+          done
+          run examples/gallery/tests/environment.test.tsx --filter appearance
+          # Apps with Rust crates, in hosts built with them: a TSX app and a
+          # Rust app (its root).
+          run examples/rust-exports
+          run examples/gallery-rs/App.test.tsx
diff --git a/third-party/nsh/.github/workflows/packages.yml b/third-party/nsh/.github/workflows/packages.yml
new file mode 100644
index 0000000000..0e50054566
--- /dev/null
+++ b/third-party/nsh/.github/workflows/packages.yml
@@ -0,0 +1,150 @@
+name: Packages
+
+# Publishing a stable release updates longbridge/homebrew-tap. Pull requests
+# install and test the generated formula without access to the tap token.
+# See docs/dev/tooling.md for HOMEBREW_TAP_TOKEN setup and safe reruns.
+
+on:
+  release:
+    types: [published]
+  pull_request:
+    paths:
+      - ".github/workflows/packages.yml"
+      - ".github/packages/**"
+  push:
+    branches: [main]
+    paths:
+      - ".github/workflows/packages.yml"
+      - ".github/packages/**"
+  merge_group:
+    types: [checks_requested]
+  workflow_dispatch:
+    inputs:
+      tag:
+        description: "Published stable release tag (e.g. v0.1.1); empty: latest"
+        required: false
+        type: string
+
+permissions:
+  contents: read
+
+defaults:
+  run:
+    shell: bash
+
+jobs:
+  check:
+    name: Check Homebrew formula
+    runs-on: macos-15
+    timeout-minutes: 15
+    if: github.event_name != 'release' || !github.event.release.prerelease
+    env:
+      HOMEBREW_NO_AUTO_UPDATE: "1"
+      HOMEBREW_NO_ANALYTICS: "1"
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          persist-credentials: false
+
+      - name: Test formula generation
+        run: python3 -m unittest discover -s .github/packages -v
+
+      - name: Generate the release formula
+        env:
+          GH_TOKEN: ${{ github.token }}
+          TAG: ${{ inputs.tag || github.event.release.tag_name }}
+        run: |
+          mkdir -p formula/sums
+          args=()
+          if [[ -n "$TAG" ]]; then args+=("$TAG"); fi
+          gh release view "${args[@]}" -R "$GITHUB_REPOSITORY" \
+            --json tagName,isDraft,isPrerelease > formula/release.json
+          TAG=$(jq -r .tagName formula/release.json)
+          gh release download "$TAG" -R "$GITHUB_REPOSITORY" -D formula/sums \
+            -p nsh-macos-arm64.tar.gz.sha256 -p nsh-linux-x86_64.tar.gz.sha256
+          python3 .github/packages/homebrew.py --release formula/release.json \
+            --sums formula/sums --repository "$GITHUB_REPOSITORY" --output formula/nsh.rb
+
+      - name: Verify both release archives
+        env:
+          GH_TOKEN: ${{ github.token }}
+        run: |
+          TAG=$(jq -r .tagName formula/release.json)
+          mkdir -p "$RUNNER_TEMP/nsh-assets"
+          gh release download "$TAG" -R "$GITHUB_REPOSITORY" -D "$RUNNER_TEMP/nsh-assets" \
+            -p nsh-macos-arm64.tar.gz -p nsh-linux-x86_64.tar.gz
+          cd "$RUNNER_TEMP/nsh-assets"
+          shasum -a 256 -c "$GITHUB_WORKSPACE/formula/sums/nsh-macos-arm64.tar.gz.sha256"
+          shasum -a 256 -c "$GITHUB_WORKSPACE/formula/sums/nsh-linux-x86_64.tar.gz.sha256"
+
+      - name: Install and test the generated formula
+        run: |
+          test "$(uname -m)" = arm64
+          brew tap-new --no-git longbridge/tap
+          cp formula/nsh.rb "$(brew --repository)/Library/Taps/longbridge/homebrew-tap/Formula/nsh.rb"
+          brew style --formula longbridge/tap/nsh
+          brew audit --strict --formula longbridge/tap/nsh
+          brew install --formula longbridge/tap/nsh
+          brew test longbridge/tap/nsh
+
+      - uses: actions/upload-artifact@v4
+        with:
+          name: nsh-homebrew-formula
+          path: formula/
+          if-no-files-found: error
+
+  homebrew:
+    name: Update Homebrew tap
+    needs: check
+    if: github.event_name == 'release' || github.event_name == 'workflow_dispatch'
+    runs-on: ubuntu-latest
+    # Serialize writers, including manual reruns, then check the tap's current
+    # version so an older run cannot overwrite a newer published formula.
+    concurrency:
+      group: homebrew-tap
+      cancel-in-progress: false
+      queue: max
+    steps:
+      - name: Check tap credentials
+        env:
+          HOMEBREW_TAP_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
+        run: |
+          if [[ -z "$HOMEBREW_TAP_TOKEN" ]]; then
+            echo "::error::Set the HOMEBREW_TAP_TOKEN Actions secret in longbridge/nsh with Contents write access to longbridge/homebrew-tap. See docs/dev/tooling.md."
+            exit 1
+          fi
+
+      - uses: actions/checkout@v4
+        with:
+          persist-credentials: false
+
+      - uses: actions/download-artifact@v4
+        with:
+          name: nsh-homebrew-formula
+          path: formula
+
+      - uses: actions/checkout@v4
+        with:
+          repository: longbridge/homebrew-tap
+          token: ${{ secrets.HOMEBREW_TAP_TOKEN }}
+          path: homebrew-tap
+
+      - name: Update the formula without downgrading
+        run: |
+          python3 .github/packages/homebrew.py --release formula/release.json \
+            --sums formula/sums --repository "$GITHUB_REPOSITORY" \
+            --current homebrew-tap/Formula/nsh.rb --output nsh.rb
+          cmp formula/nsh.rb nsh.rb
+          cp nsh.rb homebrew-tap/Formula/nsh.rb
+          VERSION=$(jq -r .tagName formula/release.json)
+          cd homebrew-tap
+          git add Formula/nsh.rb
+          if git diff --cached --quiet; then
+            echo "the formula is already up to date"
+            exit 0
+          fi
+          git config user.name "github-actions[bot]"
+          git config user.email "github-actions[bot]@users.noreply.github.com"
+          git commit -m "nsh $VERSION" \
+            -m "Written by https://github.com/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID"
+          git push
diff --git a/third-party/nsh/.github/workflows/release-crate.yml b/third-party/nsh/.github/workflows/release-crate.yml
new file mode 100644
index 0000000000..c1590d1ace
--- /dev/null
+++ b/third-party/nsh/.github/workflows/release-crate.yml
@@ -0,0 +1,143 @@
+name: Release crates
+
+# Publishes nsh's crates to crates.io: the main workspace's crates that do
+# not inherit `publish = false` (Cargo.toml), the libraries and the
+# development hosts and release runners (`nsh` builds an app with Rust
+# crates of its own from them, at its own version), then the GPUI
+# workspace's (`crates/gpui`: `nsh-platform-gpui` and its development host),
+# which depend on them.
+#
+# - Pushing a tag `vX.Y.Z` (the workspace version in Cargo.toml) publishes
+#   that version, alongside `release.yml`'s distribution.
+# - Running it by hand releases the given tag; a dry run packages and
+#   verifies every crate without uploading.
+#
+# Crates whose version is already on crates.io are skipped, so a run that
+# failed half way (crates.io limits how many new crates an account publishes
+# in a row) can be run again. A new version also updates the `version` of
+# the `nsh-*` entries in both workspaces' `[workspace.dependencies]`.
+#
+# Needs the `CARGO_REGISTRY_TOKEN` secret (a crates.io token with the
+# publish-update scope, and publish-new for crates not published yet).
+
+on:
+  push:
+    tags: ["v*"]
+  workflow_dispatch:
+    inputs:
+      tag:
+        description: "Tag to publish (e.g. v0.1.0)"
+        required: true
+        type: string
+      dry-run:
+        description: "Package and verify only, upload nothing"
+        required: false
+        type: boolean
+        default: false
+
+permissions:
+  contents: read
+
+concurrency:
+  group: release-crate
+  cancel-in-progress: false
+
+defaults:
+  run:
+    shell: bash
+
+env:
+  CARGO_TERM_COLOR: always
+  TAG: ${{ inputs.tag || github.ref_name }}
+  DRY_RUN: ${{ inputs.dry-run && '--dry-run' || '' }}
+
+jobs:
+  publish:
+    # 24.04 has GTK 4.14 and Pango 1.52+, what `nsh-platform-linux` needs to
+    # build when `cargo publish` verifies it.
+    runs-on: ubuntu-24.04
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          ref: ${{ env.TAG }}
+
+      - name: Check the version
+        run: |
+          version=$(sed -n 's/^version = "\(.*\)"$/\1/p' Cargo.toml | head -1)
+          if [[ "$TAG" != "v$version" ]]; then
+            echo "::error::Tag $TAG does not match the workspace version $version"
+            exit 1
+          fi
+          # The `nsh-*` dependencies must ask for the version being published.
+          if grep -E '^nsh-[a-z-]+ = \{' Cargo.toml crates/gpui/Cargo.toml | grep -v "version = \"$version\""; then
+            echo "::error::Set version = \"$version\" on the nsh-* entries of [workspace.dependencies] above"
+            exit 1
+          fi
+          echo "VERSION=$version" >> "$GITHUB_ENV"
+
+      # Temporary directories (verification builds) outside the checkout.
+      - name: Set up the environment
+        run: |
+          mkdir -p "$RUNNER_TEMP/tmp"
+          echo "TMPDIR=$RUNNER_TEMP/tmp" >> "$GITHUB_ENV"
+
+      # QuickJS is C (bindgen needs libclang); `nsh-platform-linux` links
+      # GTK 4, Pango and WebKitGTK 6.0; `nsh-platform-gpui` GPUI's X11 /
+      # Wayland / xkbcommon / fontconfig libraries, GTK 3 and WebKitGTK 4.1
+      # (feature `webview`) and GStreamer (feature `video`), as in gpui.yml.
+      - name: Install Linux dependencies
+        run: |
+          sudo apt-get update
+          sudo apt-get install -y \
+            clang libclang-dev build-essential pkg-config \
+            libgtk-4-dev libwebkitgtk-6.0-dev \
+            libasound2-dev libfontconfig-dev libfreetype-dev libssl-dev \
+            libvulkan1 libwayland-dev libx11-xcb-dev libxcb1-dev \
+            libxkbcommon-dev libxkbcommon-x11-dev libzstd-dev \
+            libgtk-3-dev libwebkit2gtk-4.1-dev \
+            libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
+
+      - name: Setup Rust
+        uses: dtolnay/rust-toolchain@stable
+
+      # Prints the packages of a workspace that are published and whose
+      # version is not on crates.io yet, as `-p <name>` arguments.
+      - name: Write the helper
+        run: |
+          cat > "$RUNNER_TEMP/unpublished.sh" <<'EOF'
+          for name in $(cargo metadata --no-deps --format-version 1 \
+              | jq -r '.packages[] | select(.publish != []) | .name'); do
+            status=$(curl -s -o /dev/null -w '%{http_code}' \
+              -A "nsh release (https://github.com/longbridge/nsh)" \
+              "https://crates.io/api/v1/crates/$name/$VERSION")
+            if [[ "$status" == 200 ]]; then
+              echo "$name $VERSION is on crates.io, skipped" >&2
+            else
+              printf -- '-p %s ' "$name"
+            fi
+          done
+          EOF
+
+      - name: Publish the main workspace
+        env:
+          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
+        run: |
+          packages=$(bash "$RUNNER_TEMP/unpublished.sh")
+          if [[ -z "$packages" ]]; then echo "Nothing to publish"; exit 0; fi
+          # cargo publishes them in dependency order.
+          cargo publish $DRY_RUN $packages
+
+      # Packaging it needs the main workspace's crates of this version on
+      # crates.io, so a dry run only lists what its package would hold.
+      - name: Publish the GPUI workspace
+        working-directory: crates/gpui
+        env:
+          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
+        run: |
+          packages=$(bash "$RUNNER_TEMP/unpublished.sh")
+          if [[ -z "$packages" ]]; then echo "Nothing to publish"; exit 0; fi
+          if [[ -n "$DRY_RUN" ]]; then
+            cargo package --list $packages
+          else
+            cargo publish $packages
+          fi
diff --git a/third-party/nsh/.github/workflows/release.yml b/third-party/nsh/.github/workflows/release.yml
new file mode 100644
index 0000000000..a300cf3c84
--- /dev/null
+++ b/third-party/nsh/.github/workflows/release.yml
@@ -0,0 +1,296 @@
+name: Release
+
+# Builds the distribution (`cargo xtask dist`: the CLI, the prebuilt runtimes
+# and the embedding SDKs) on macOS, Linux and Windows, and publishes it as a
+# GitHub release.
+#
+# - Pushing a tag `vX.Y.Z` (the workspace version in Cargo.toml) builds every
+#   platform and, once all of them have built, creates a draft release with
+#   their archives; publish it from the releases page.
+# - Running it by hand without a tag builds the archives only (workflow
+#   artifacts): a dry run before tagging, and the check of a change to this
+#   workflow or to how xtask builds the distribution. With a tag it releases
+#   that tag.
+#
+# Pull requests and the merge queue never run it: its three builds are CI's
+# longest and held the runners every queued pull request waited for.
+#
+# Asset names carry no version (`nsh-macos-arm64.tar.gz`, each with a
+# `.sha256`), so `releases/latest/download/<asset>` always resolves: the
+# installers (`website/public/install.sh`, `install.ps1`, also attached to
+# each release), mise's `github:` backend and the Scoop manifest download by
+# that name. Every archive holds one directory, `nsh/`, laid out as
+# `dist/nsh`. Publishing the draft runs `packages.yml` (Homebrew).
+
+on:
+  push:
+    tags: ["v*"]
+  workflow_dispatch:
+    inputs:
+      tag:
+        description: "Tag to release (e.g. v0.1.0); empty: build only"
+        required: false
+        type: string
+
+permissions:
+  contents: read
+
+concurrency:
+  group: release-${{ inputs.tag || github.ref_name }}
+  cancel-in-progress: false
+
+defaults:
+  run:
+    shell: bash
+
+env:
+  CARGO_TERM_COLOR: always
+  TAG: ${{ inputs.tag || (github.ref_type == 'tag' && github.ref_name) || '' }}
+
+jobs:
+  dist:
+    name: dist (${{ matrix.name }})
+    strategy:
+      fail-fast: false
+      matrix:
+        include:
+          # The iOS runtimes and SDK need Xcode; the macOS runtime is built
+          # for this machine (Apple silicon).
+          - name: macos-arm64
+            os: macos-15
+          # 24.04 has GTK 4.14 and Pango 1.52+, what the Linux runtime needs;
+          # its binaries need glibc 2.39 and GTK 4.14 or newer where they run.
+          - name: linux-x86_64
+            os: ubuntu-24.04
+          - name: windows-x86_64
+            os: windows-latest
+    runs-on: ${{ matrix.os }}
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          # A release run builds the tag, never the branch it was started on.
+          ref: ${{ env.TAG || github.ref }}
+
+      - name: Check the version
+        if: env.TAG != ''
+        run: |
+          version=$(sed -n 's/^version = "\(.*\)"$/\1/p' Cargo.toml | head -1)
+          if [[ "$TAG" != "v$version" ]]; then
+            echo "::error::tag $TAG does not match the workspace version $version"
+            exit 1
+          fi
+
+      # Temporary directories (tests, tools) outside the checkout.
+      - name: Set up the environment
+        run: |
+          mkdir -p "$RUNNER_TEMP/tmp"
+          echo "TMPDIR=$RUNNER_TEMP/tmp" >> "$GITHUB_ENV"
+          echo "ARCHIVE=nsh-${{ matrix.name }}" >> "$GITHUB_ENV"
+
+      - name: Set up Windows
+        if: runner.os == 'Windows'
+        run: |
+          # QuickJS is C: bindgen needs libclang, which the image's LLVM has.
+          echo "LIBCLANG_PATH=C:\\Program Files\\LLVM\\bin" >> "$GITHUB_ENV"
+          # rustc can overflow its default stack on the `windows` crate.
+          echo "RUST_MIN_STACK=268435456" >> "$GITHUB_ENV"
+
+      # QuickJS is C (bindgen needs libclang); the Linux runtime links GTK 4,
+      # the GPUI runtime X11, Wayland, xkbcommon, fontconfig and FreeType,
+      # GTK 3 and WebKitGTK 4.1 (web views) and GStreamer (videos).
+      - name: Install clang, GTK 4 and GPUI's libraries
+        if: runner.os == 'Linux'
+        run: |
+          sudo apt-get update
+          sudo apt-get install -y clang llvm libclang-dev libgtk-4-dev libwebkitgtk-6.0-dev \
+            libfontconfig-dev libfreetype-dev libwayland-dev libx11-xcb-dev libxcb1-dev \
+            libxkbcommon-dev libxkbcommon-x11-dev libzstd-dev libgtk-3-dev libwebkit2gtk-4.1-dev \
+            libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
+
+      # The Android runtime: `javac` + `d8` (Java 17), the SDK's
+      # `platforms;android-35` and an NDK (the images have the SDK and NDKs).
+      - uses: actions/setup-java@v4
+        with:
+          distribution: temurin
+          java-version: "17"
+      - name: Install the Android platform
+        run: |
+          if [[ ! -f "$ANDROID_HOME/platforms/android-35/android.jar" ]]; then
+            sdkmanager=$(ls "$ANDROID_HOME"/cmdline-tools/latest/bin/sdkmanager* | head -1)
+            yes | "$sdkmanager" "platforms;android-35" > /dev/null || true
+          fi
+          test -f "$ANDROID_HOME/platforms/android-35/android.jar"
+          ls "$ANDROID_HOME/ndk" || true
+
+      - name: Setup Rust
+        uses: dtolnay/rust-toolchain@stable
+        with:
+          targets: wasm32-unknown-unknown
+
+      # QuickJS's WebAssembly build needs upstream LLVM: Apple's clang
+      # does not target wasm32. Check the C tools before building runtimes.
+      - name: Set up WebAssembly C tools
+        run: |
+          suffix=""
+          if [[ "$RUNNER_OS" == macOS ]]; then
+            brew list llvm > /dev/null 2>&1 || brew install llvm
+            llvm_bin="$(brew --prefix llvm)/bin"
+          elif [[ "$RUNNER_OS" == Windows ]]; then
+            llvm_bin="C:/Program Files/LLVM/bin"
+            suffix=".exe"
+          else
+            llvm_bin=/usr/bin
+          fi
+          cc="$llvm_bin/clang$suffix"
+          ar="$llvm_bin/llvm-ar$suffix"
+          if [[ "$RUNNER_OS" == Windows ]]; then
+            # quickjs-jit-sys canonicalizes its vendored WASI include directory
+            # to a verbatim Windows path. Give clang ordinary drive paths
+            # so nested includes such as bits/alltypes.h resolve correctly.
+            cat > "$RUNNER_TEMP/nsh-wasm-clang.py" <<'PYTHON'
+          import os
+          import subprocess
+          import sys
+
+          def normalize(argument):
+              for prefix in ("-isystem", "-I", "-L", ""):
+                  marker = prefix + "\\\\?\\"
+                  if argument.startswith(marker):
+                      path = argument[len(marker):]
+                      if len(path) > 2 and path[1:3] == ":\\":
+                          return prefix + path.replace("\\", "/")
+              return argument
+
+          if __name__ == "__main__":
+              sys.exit(subprocess.call([os.environ["NSH_WASM_CLANG"], *map(normalize, sys.argv[1:])]))
+          PYTHON
+            printf '@echo off\r\npython "%%~dp0nsh-wasm-clang.py" %%*\r\n' > "$RUNNER_TEMP/nsh-wasm-clang.cmd"
+            export NSH_WASM_CLANG="$cc"
+            echo "NSH_WASM_CLANG=$cc" >> "$GITHUB_ENV"
+            cc="$(cygpath -m "$RUNNER_TEMP")/nsh-wasm-clang.cmd"
+          fi
+          printf 'int nsh_wasm_probe(void) { return 0; }\n' | \
+            "$cc" --target=wasm32-unknown-unknown -x c -c - -o "$RUNNER_TEMP/wasm-probe.o"
+          "$ar" rcs "$RUNNER_TEMP/wasm-probe.a" "$RUNNER_TEMP/wasm-probe.o"
+          echo "CC_wasm32_unknown_unknown=$cc" >> "$GITHUB_ENV"
+          echo "AR_wasm32_unknown_unknown=$ar" >> "$GITHUB_ENV"
+
+      - name: Cache Cargo
+        uses: actions/cache@v4
+        with:
+          path: |
+            ~/.cargo/registry
+            ~/.cargo/git
+          key: ${{ runner.os }}-release-cargo-${{ hashFiles('Cargo.lock') }}
+          restore-keys: |
+            ${{ runner.os }}-release-cargo-
+
+      # Compile the actual WASI headers before the native runtimes: a bare
+      # clang probe does not exercise quickjs-jit-sys's vendored include path.
+      - name: Check the Windows web runtime
+        if: runner.os == 'Windows'
+        run: |
+          cargo metadata --locked --format-version 1 --filter-platform wasm32-unknown-unknown > "$RUNNER_TEMP/wasm-metadata.json"
+          python - "$RUNNER_TEMP/wasm-metadata.json" <<'PYTHON'
+          import json
+          import pathlib
+          import sys
+          packages = json.loads(pathlib.Path(sys.argv[1]).read_text(encoding="utf-8"))["packages"]
+          package = next(p for p in packages if p["name"] == "quickjs-jit-sys")
+          include = pathlib.Path(package["manifest_path"]).parent / "vendor/wasi-libc/include"
+          for name in ("stdlib.h", "bits/alltypes.h"):
+              header = include / name
+              if not header.is_file():
+                  sys.exit(f"Missing vendored WASI header: {header}")
+              print(f"Verified WASI header: {header}")
+          PYTHON
+          cargo build --profile web -p nsh-platform-web --target wasm32-unknown-unknown --features bytecode-only
+
+      - name: Build the distribution
+        run: cargo xtask dist -v
+
+      # The packaged CLI makes and bundles a new app.
+      - name: Smoke test
+        run: |
+          nsh=dist/nsh/bin/nsh
+          [[ "$RUNNER_OS" != Windows ]] || nsh=dist/nsh/bin/nsh.exe
+          "$nsh" --version
+          app="$RUNNER_TEMP/smoke-app"
+          "$nsh" init "$app"
+          "$nsh" build "$app" -o "$RUNNER_TEMP/smoke-out" --release
+          ls "$RUNNER_TEMP/smoke-out"
+          find dist/nsh -type f | sort
+
+      - name: Package
+        run: |
+          mkdir -p target/release-assets
+          cd target/release-assets
+          cp -R ../../dist/nsh nsh
+          cp ../../README.md ../../LICENSE-APACHE nsh/
+          if [[ "$RUNNER_OS" == Windows ]]; then
+            7z a -tzip "$ARCHIVE.zip" nsh > /dev/null
+            sha256sum "$ARCHIVE.zip" > "$ARCHIVE.zip.sha256"
+          else
+            tar -czf "$ARCHIVE.tar.gz" nsh
+            shasum -a 256 "$ARCHIVE.tar.gz" > "$ARCHIVE.tar.gz.sha256"
+          fi
+          # The embedding SDKs on their own, for native apps that embed nsh
+          # and need no CLI (iOS from macOS, Android from Linux).
+          embed() {
+            local name="nsh-embed-$1"
+            mkdir -p "$name"
+            cp -R "nsh/embed/$1/." "$name/"
+            zip -qry "$name.zip" "$name"
+            shasum -a 256 "$name.zip" > "$name.zip.sha256"
+          }
+          [[ "$RUNNER_OS" != macOS ]] || embed ios
+          [[ "$RUNNER_OS" != Linux ]] || embed android
+          rm -rf nsh nsh-embed-*/
+          ls -l
+
+      - uses: actions/upload-artifact@v4
+        with:
+          name: nsh-${{ matrix.name }}
+          path: target/release-assets/*
+          if-no-files-found: error
+
+  release:
+    name: Release
+    needs: dist
+    if: inputs.tag != '' || github.ref_type == 'tag'
+    runs-on: ubuntu-latest
+    permissions:
+      contents: write
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          ref: ${{ env.TAG }}
+
+      - uses: actions/download-artifact@v4
+        with:
+          pattern: nsh-*
+          path: assets
+          merge-multiple: true
+
+      # The installers go with the archives they download, and Scoop installs
+      # from the manifest attached to the latest release:
+      # `scoop install https://github.com/<repo>/releases/latest/download/nsh.json`.
+      - name: Add the installers and the Scoop manifest
+        run: |
+          cp website/public/install.sh website/public/install.ps1 assets/
+          read -r hash _ < assets/nsh-windows-x86_64.zip.sha256
+          # shellcheck disable=SC2016 # envsubst's list of variables
+          NSH_VERSION="${TAG#v}" NSH_HASH="$hash" NSH_REPO="$GITHUB_REPOSITORY" \
+            envsubst '$NSH_VERSION $NSH_HASH $NSH_REPO' < .github/packages/nsh.json > assets/nsh.json
+          cat assets/nsh.json
+
+      # Created only after every platform has built; a draft until it is
+      # published by hand.
+      - uses: softprops/action-gh-release@v2
+        with:
+          tag_name: ${{ env.TAG }}
+          name: nsh ${{ env.TAG }}
+          draft: true
+          generate_release_notes: true
+          fail_on_unmatched_files: true
+          files: assets/*
diff --git a/third-party/nsh/.github/workflows/rust-app.yml b/third-party/nsh/.github/workflows/rust-app.yml
new file mode 100644
index 0000000000..281b367eb1
--- /dev/null
+++ b/third-party/nsh/.github/workflows/rust-app.yml
@@ -0,0 +1,202 @@
+name: Rust application
+
+on:
+  push:
+    branches: [main]
+    paths:
+      - "crates/nsh-bundler/**"
+      - "crates/nsh-cli/**"
+      - "crates/nsh-core/**"
+      - "crates/nsh-dev/**"
+      - "crates/nsh-engine/**"
+      - "crates/nsh-js/**"
+      - "crates/nsh-macros/**"
+      - "crates/nsh-base/**"
+      - "crates/nsh-package/**"
+      - "crates/nsh-platform-linux/**"
+      - "crates/nsh-platform-macos/**"
+      - "crates/nsh-platform-web/**"
+      - "crates/nsh-platform-windows/**"
+      - "crates/nsh-testing/**"
+      - "examples/counter/**"
+      - "examples/gallery/**"
+      - "examples/gallery-rs/**"
+      - "examples/rust-exports/**"
+      - "Cargo.toml"
+      - "Cargo.lock"
+      - ".cargo/**"
+      - "rust-toolchain.toml"
+      - ".github/workflows/rust-app.yml"
+  pull_request:
+    paths:
+      - "crates/nsh-bundler/**"
+      - "crates/nsh-cli/**"
+      - "crates/nsh-core/**"
+      - "crates/nsh-dev/**"
+      - "crates/nsh-engine/**"
+      - "crates/nsh-js/**"
+      - "crates/nsh-macros/**"
+      - "crates/nsh-base/**"
+      - "crates/nsh-package/**"
+      - "crates/nsh-platform-linux/**"
+      - "crates/nsh-platform-macos/**"
+      - "crates/nsh-platform-web/**"
+      - "crates/nsh-platform-windows/**"
+      - "crates/nsh-testing/**"
+      - "examples/counter/**"
+      - "examples/gallery/**"
+      - "examples/gallery-rs/**"
+      - "examples/rust-exports/**"
+      - "Cargo.toml"
+      - "Cargo.lock"
+      - ".cargo/**"
+      - "rust-toolchain.toml"
+      - ".github/workflows/rust-app.yml"
+  merge_group:
+    types: [checks_requested]
+  workflow_dispatch:
+
+permissions:
+  contents: read
+
+concurrency:
+  group: rust-app-${{ github.ref }}
+  cancel-in-progress: true
+
+env:
+  # CI builds each crate once: no incremental state and no debug info
+  # (faster builds, smaller caches; panics still name their file and line).
+  CARGO_INCREMENTAL: "0"
+  CARGO_PROFILE_DEV_DEBUG: "0"
+  # The toolchain file's iOS and Android targets are only the release's.
+  RUSTUP_TOOLCHAIN: stable
+
+jobs:
+  check:
+    strategy:
+      fail-fast: false
+      matrix:
+        os: [ubuntu-24.04, macos-15, windows-latest]
+    runs-on: ${{ matrix.os }}
+    defaults:
+      run:
+        shell: bash
+    steps:
+      - uses: actions/checkout@v4
+      - name: Set up temporary files
+        run: |
+          mkdir -p "$RUNNER_TEMP/nsh-test-tmp"
+          echo "TMPDIR=$RUNNER_TEMP/nsh-test-tmp" >> "$GITHUB_ENV"
+      - name: Set up Windows compiler stack
+        if: runner.os == 'Windows'
+        run: echo "RUST_MIN_STACK=268435456" >> "$GITHUB_ENV"
+      - name: Install GTK 4
+        if: runner.os == 'Linux'
+        run: sudo apt-get update && sudo apt-get install -y libgtk-4-dev
+      - uses: dtolnay/rust-toolchain@stable
+        with:
+          components: clippy, rustfmt
+      # Dependencies only: main's runs save it, pull requests restore it.
+      - name: Cache Cargo
+        uses: Swatinem/rust-cache@v2
+        with:
+          save-if: ${{ github.ref == 'refs/heads/main' }}
+      - name: Clippy
+        run: cargo clippy -p gallery-native --all-targets --locked -- -D warnings
+      # The crate's unit tests; the app's tests are TypeScript (`nsh test`,
+      # the web job).
+      - name: Test the crate
+        run: cargo test -p gallery-native --locked
+      - name: Check the native dependency graph
+        run: |
+          cargo tree -p gallery-native --locked -e normal > "$RUNNER_TEMP/rust-app-dependencies.txt"
+          if grep -E 'nsh-js |rquickjs|quickjs-jit' "$RUNNER_TEMP/rust-app-dependencies.txt"; then
+            echo "The Rust executable unexpectedly links a JS runtime"
+            exit 1
+          fi
+
+  # The same crate compiled into the app's own web runtime: `nsh package
+  # --target web` builds it for wasm32 and publishes the site.
+  web:
+    runs-on: ubuntu-24.04
+    steps:
+      - uses: actions/checkout@v4
+      - name: Set up temporary files
+        run: |
+          mkdir -p "$RUNNER_TEMP/nsh-test-tmp"
+          echo "TMPDIR=$RUNNER_TEMP/nsh-test-tmp" >> "$GITHUB_ENV"
+      # QuickJS is C: bindgen needs libclang, its WebAssembly build clang
+      # and llvm-ar. The describe program links the gallery's crate,
+      # whose native entry (`cargo run`) uses GTK 4 on Linux.
+      - name: Install clang, LLVM and GTK 4
+        run: sudo apt-get update && sudo apt-get install -y clang llvm libclang-dev libgtk-4-dev
+      - uses: dtolnay/rust-toolchain@stable
+        with:
+          targets: wasm32-unknown-unknown
+      # Dependencies only: main's runs save it, pull requests restore it.
+      - name: Cache Cargo
+        uses: Swatinem/rust-cache@v2
+        with:
+          save-if: ${{ github.ref == 'refs/heads/main' }}
+      - name: Build the command line
+        run: cargo build -p nsh-cli --locked
+      - name: Publish the Rust gallery for the web
+        run: |
+          # nsh.json "root": a Rust app, mounted with no QuickJS.
+          ./target/debug/nsh package examples/gallery-rs --target web -o target/rust-app-web
+          site="target/rust-app-web/Rust Gallery"
+          test -f "$site/index.html"
+          # The app's runtime registers the crate's UI set and root.
+          grep -q nsh_app_init "$site"/nsh.*.wasm
+          grep -q nsh_start_rust "$site"/nsh.*.wasm
+          if ls "$site"/app.*.nshc > /dev/null 2>&1 || grep -aq InternalError "$site"/nsh.*.wasm; then
+            echo "The Rust app's web runtime unexpectedly carries JS"
+            exit 1
+          fi
+      - name: Test the Rust app and check that it builds no JS engine or bundler
+        run: |
+          # `nsh test` builds the app's programs in `.nsh/rust` and runs its
+          # TypeScript tests (`examples/gallery-rs/*.test.tsx`) in the test
+          # runner. `nsh` describes the app's crates with the generated
+          # `describe` program: it links no QuickJS, nsh-js, bundler,
+          # rolldown or Oxc. The test runner runs TypeScript tests (QuickJS,
+          # source maps) on entries `nsh` builds: no bundler or parser.
+          check() {
+            cargo tree --manifest-path examples/gallery-rs/.nsh/rust/Cargo.toml \
+              -p "nsh-app-gallery-native-$1" -e normal --target all \
+              > "$RUNNER_TEMP/$1-dependencies.txt"
+            if grep -E "$2" "$RUNNER_TEMP/$1-dependencies.txt"; then
+              echo "The Rust app's $1 program unexpectedly links $3"
+              exit 1
+            fi
+          }
+          ./target/debug/nsh test examples/gallery-rs
+          check describe '(rquickjs|quickjs-jit|nsh-js|nsh-bundler|rolldown|oxc)([ _-]|$)' "a JS engine or the bundler"
+          check test '(nsh-bundler|rolldown|oxc_parser)([ _-]|$)' "the bundler"
+      - name: Run the examples' tests
+        run: |
+          for app in counter gallery rust-exports; do
+            ./target/debug/nsh test "examples/$app"
+          done
+      # The same tests in the runner's Chrome, headless, with the browser's
+      # trusted input (`nsh test --target web`): those a real platform runs
+      # (real time).
+      - name: Run the examples' tests in Chrome
+        run: |
+          ./target/debug/nsh test examples/counter --target web
+          for file in device dock form gestures hover navigation network photos resizable shortcuts storage timers; do
+            ./target/debug/nsh test "examples/gallery/tests/$file.test.tsx" --target web
+          done
+          ./target/debug/nsh test examples/gallery/tests/environment.test.tsx --target web --filter appearance
+          # Apps with Rust crates, in their hosts' runtime: a TSX app and a
+          # Rust app (its root).
+          ./target/debug/nsh test examples/rust-exports --target web
+          ./target/debug/nsh test examples/gallery-rs/App.test.tsx --target web
+      - name: Publish a TSX app with a Rust crate for the web
+        run: |
+          # A TSX entry and the app's crate: QuickJS runs App.tsx, the
+          # crate's set is compiled into the app's runtime.
+          ./target/debug/nsh package examples/rust-exports --target web -o target/rust-exports-web
+          site="target/rust-exports-web/Rust Exports"
+          ls "$site"/app.*.nshc
+          grep -q rust-exports/native "$site"/nsh.*.wasm
diff --git a/third-party/nsh/.github/workflows/tui.yml b/third-party/nsh/.github/workflows/tui.yml
new file mode 100644
index 0000000000..a3e5a5fb5d
--- /dev/null
+++ b/third-party/nsh/.github/workflows/tui.yml
@@ -0,0 +1,98 @@
+name: Terminal
+
+on:
+  push:
+    branches: [main, "tui/**"]
+    paths:
+      - "crates/**"
+      - "examples/terminal-workbench/**"
+      - "tests/compat/cases/layout/fonts/**"
+      - "third-party/icy_sixel/**"
+      - "Cargo.toml"
+      - "Cargo.lock"
+      - ".cargo/**"
+      - "rust-toolchain.toml"
+      - ".github/workflows/tui.yml"
+  pull_request:
+    paths:
+      - "crates/**"
+      - "examples/terminal-workbench/**"
+      - "tests/compat/cases/layout/fonts/**"
+      - "third-party/icy_sixel/**"
+      - "Cargo.toml"
+      - "Cargo.lock"
+      - ".cargo/**"
+      - "rust-toolchain.toml"
+      - ".github/workflows/tui.yml"
+  merge_group:
+    types: [checks_requested]
+  workflow_dispatch:
+
+permissions:
+  contents: read
+
+concurrency:
+  group: tui-${{ github.ref }}
+  cancel-in-progress: true
+
+jobs:
+  check:
+    strategy:
+      fail-fast: false
+      matrix:
+        os: [ubuntu-24.04, macos-15, windows-latest]
+    runs-on: ${{ matrix.os }}
+    defaults:
+      run:
+        shell: bash
+    env:
+      NSH_EXE_SUFFIX: ${{ matrix.os == 'windows-latest' && '.exe' || '' }}
+    steps:
+      - uses: actions/checkout@v4
+      # QuickJS and its generated bindings need a C compiler and libclang.
+      # The terminal crates build independently of the GUI toolkits.
+      - name: Install clang
+        if: runner.os == 'Linux'
+        run: sudo apt-get update && sudo apt-get install -y clang libclang-dev
+      - name: Configure Windows compiler
+        if: runner.os == 'Windows'
+        run: |
+          echo 'LIBCLANG_PATH=C:\Program Files\LLVM\bin' >> "$GITHUB_ENV"
+          echo 'RUST_MIN_STACK=268435456' >> "$GITHUB_ENV"
+      - uses: dtolnay/rust-toolchain@stable
+        with:
+          components: clippy
+      - uses: actions/cache@v4
+        with:
+          path: |
+            ~/.cargo/registry
+            ~/.cargo/git
+            target
+          key: ${{ runner.os }}-tui-${{ hashFiles('Cargo.lock', 'rust-toolchain.toml') }}
+          restore-keys: |
+            ${{ runner.os }}-tui-
+      - name: Clippy
+        run: cargo clippy --locked --all-targets -p nsh-platform-tui -p nsh-tui-host -p nsh-tui-app -- -D warnings
+      - name: Test
+        run: cargo test --locked -p nsh-platform-tui -p nsh-tui-host -p nsh-tui-app
+      - name: Check the Rust runtime
+        run: cargo check --locked -p nsh-platform-tui --no-default-features
+      - name: Build the operations workbench
+        run: |
+          cargo build --locked -p nsh-cli -p nsh-tui-host
+          ./target/debug/nsh${NSH_EXE_SUFFIX} build examples/terminal-workbench -o target/terminal-workbench
+      - name: Exercise Unicode, filters, deployment and resize
+        run: |
+          ./target/debug/nsh-tui-host${NSH_EXE_SUFFIX} --bundle target/terminal-workbench/bundle.nshc --size 160x50 \
+            --script "wait 300; expect Operations workbench; expect-focus; shot target/terminal-workbench-home.txt; type 王宁; expect 12 services; key Ctrl+a; type gateway; expect 2 services; key Tab; key Tab; key Tab; key Enter; expect No matching services; key Shift+Tab; key Shift+Tab; key Enter; expect 2 services; tap 40 13; expect Selected: edge-gateway; tap 148 1; expect Deploy service; key Ctrl+a; type Canary · 安全发布 👩‍💻; key Tab; key Tab; key Enter; expect Deployment queued; wait 300 [...]
+      - name: Exercise effects, popup menus and the HTML runbook
+        run: |
+          ./target/debug/nsh-tui-host${NSH_EXE_SUFFIX} --bundle target/terminal-workbench/bundle.nshc --size 160x50 \
+            --script "wait 700; tap 142 5; wait 800; expect Surface effects; expect Canvas lettering; shot target/terminal-workbench-effects.txt; tap 151 6; expect Soft focus; key Enter; wait 500; expect Soft focus / 3pt; tap 153 5; wait 1000; expect Rollout checklist; expect Runbook ready; shot target/terminal-workbench-runbook.txt; tap 153 6; wait 500; expect Runbook ready; tap 132 5; expect Activity timeline; quit"
+      - name: Upload terminal snapshots
+        if: always()
+        uses: actions/upload-artifact@v4
+        with:
+          name: terminal-snapshots-${{ runner.os }}
+          path: target/terminal-workbench-*.txt
+          if-no-files-found: ignore
diff --git a/third-party/nsh/.github/workflows/website.yml b/third-party/nsh/.github/workflows/website.yml
new file mode 100644
index 0000000000..7e2aab9d45
--- /dev/null
+++ b/third-party/nsh/.github/workflows/website.yml
@@ -0,0 +1,113 @@
+name: Website
+
+# Builds the documentation site with its live demos (the WebAssembly runtime,
+# `cargo xtask web`) and publishes it to GitHub Pages at nsh.dev
+# (`website/public/CNAME`).
+
+on:
+  push:
+    branches: [main]
+    paths:
+      - "website/**"
+      - "crates/**"
+      - "examples/gallery/**"
+      - "Cargo.toml"
+      - "Cargo.lock"
+      - ".cargo/**"
+      - "rust-toolchain.toml"
+      - ".github/workflows/website.yml"
+  pull_request:
+    paths:
+      - "website/**"
+      - "crates/nsh-platform-web/**"
+      - "examples/gallery/**"
+      - ".github/workflows/website.yml"
+  merge_group:
+    types: [checks_requested]
+  workflow_dispatch:
+
+permissions:
+  contents: read
+  pages: write
+  id-token: write
+
+# Pages takes one deployment at a time; queue rather than cancel, so the
+# latest push always ends up deployed.
+concurrency:
+  group: pages-${{ github.ref }}
+  cancel-in-progress: ${{ github.event_name == 'pull_request' || github.event_name == 'merge_group' }}
+
+env:
+  # CI builds each crate once: no incremental state and no debug info
+  # (faster builds, smaller caches; panics still name their file and line).
+  CARGO_INCREMENTAL: "0"
+  CARGO_PROFILE_DEV_DEBUG: "0"
+  # The toolchain file's iOS and Android targets are only the release's.
+  RUSTUP_TOOLCHAIN: stable
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+
+      # QuickJS is C: clang compiles it for wasm32 (llvm-ar archives it), and
+      # bindgen needs libclang for the host build of the nsh CLI.
+      - name: Install clang and LLVM
+        run: sudo apt-get update && sudo apt-get install -y clang llvm libclang-dev
+
+      - name: Setup Rust
+        uses: dtolnay/rust-toolchain@stable
+        with:
+          targets: wasm32-unknown-unknown
+
+      - uses: oven-sh/setup-bun@v2
+        with:
+          bun-version: 1.4.2
+
+      # Dependencies only: main's runs save it, pull requests restore it.
+      - name: Cache Cargo
+        uses: Swatinem/rust-cache@v2
+        with:
+          save-if: ${{ github.ref == 'refs/heads/main' }}
+
+      - name: Test browser scroll indicator behavior
+        run: node --test crates/nsh-platform-web/web/scroll.test.mjs
+
+      - name: Install website dependencies
+        working-directory: website
+        run: bun install
+
+      # `build` runs `cargo xtask web` first: nsh.wasm, the player and every
+      # demo in website/demos, into website/public/play, and the gallery
+      # published with `nsh package --target web` into play/gallery.
+      - name: Build website
+        working-directory: website
+        env:
+          NSH_REQUIRE_PLAY: "1"
+          AR_wasm32_unknown_unknown: llvm-ar
+        run: bun run build
+
+      - name: Test website
+        working-directory: website
+        run: bun run test
+
+      - uses: actions/configure-pages@v5
+        if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
+
+      - uses: actions/upload-pages-artifact@v3
+        if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
+        with:
+          path: website/dist
+
+  deploy:
+    if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
+    needs: build
+    runs-on: ubuntu-latest
+    environment:
+      name: github-pages
+      url: ${{ steps.deployment.outputs.page_url }}
+    steps:
+      - name: Deploy to GitHub Pages
+        id: deployment
+        uses: actions/deploy-pages@v4
diff --git a/third-party/nsh/.github/workflows/windows.yml b/third-party/nsh/.github/workflows/windows.yml
new file mode 100644
index 0000000000..ce49218b6c
--- /dev/null
+++ b/third-party/nsh/.github/workflows/windows.yml
@@ -0,0 +1,124 @@
+name: Windows
+
+# Builds, lints and tests the Windows backend (Win32, Direct2D, DirectWrite)
+# and the tooling that runs it (`nsh run --target windows`, `nsh package
+# --target windows`, `cargo run` on Windows).
+
+on:
+  push:
+    branches: [main]
+    paths:
+      - "crates/nsh-bundler/**"
+      - "crates/nsh-cli/**"
+      - "crates/nsh-core/**"
+      - "crates/nsh-dev/**"
+      - "crates/nsh-engine/**"
+      - "crates/nsh-js/**"
+      - "crates/nsh-macros/**"
+      - "crates/nsh-package/**"
+      - "crates/nsh-platform-windows/**"
+      - "crates/nsh-testing/**"
+      - "crates/nsh-base/**"
+      - "crates/nsh-windows-app/**"
+      - "crates/nsh-windows-host/**"
+      - "crates/xtask/**"
+      - "examples/counter/**"
+      - "examples/gallery/**"
+      - "Cargo.toml"
+      - "Cargo.lock"
+      - ".cargo/**"
+      - "rust-toolchain.toml"
+      - ".github/workflows/windows.yml"
+  pull_request:
+    paths:
+      - "crates/nsh-bundler/**"
+      - "crates/nsh-cli/**"
+      - "crates/nsh-core/**"
+      - "crates/nsh-dev/**"
+      - "crates/nsh-engine/**"
+      - "crates/nsh-js/**"
+      - "crates/nsh-macros/**"
+      - "crates/nsh-package/**"
+      - "crates/nsh-platform-windows/**"
+      - "crates/nsh-testing/**"
+      - "crates/nsh-base/**"
+      - "crates/nsh-windows-app/**"
+      - "crates/nsh-windows-host/**"
+      - "crates/xtask/**"
+      - "examples/counter/**"
+      - "examples/gallery/**"
+      - "Cargo.toml"
+      - "Cargo.lock"
+      - ".cargo/**"
+      - "rust-toolchain.toml"
+      - ".github/workflows/windows.yml"
+  merge_group:
+    types: [checks_requested]
+  workflow_dispatch:
+
+permissions:
+  contents: read
+
+concurrency:
+  group: windows-${{ github.ref }}
+  cancel-in-progress: true
+
+env:
+  # CI builds each crate once: no incremental state and no debug info
+  # (faster builds, smaller caches; panics still name their file and line).
+  CARGO_INCREMENTAL: "0"
+  CARGO_PROFILE_DEV_DEBUG: "0"
+  # The toolchain file's iOS and Android targets are only the release's.
+  RUSTUP_TOOLCHAIN: stable
+
+jobs:
+  check:
+    runs-on: windows-latest
+    env:
+      # QuickJS is C: bindgen needs libclang, which the image's LLVM has.
+      LIBCLANG_PATH: C:\Program Files\LLVM\bin
+      # rustc can overflow its default stack on the `windows` crate's
+      # bindings (STATUS_STACK_BUFFER_OVERRUN).
+      RUST_MIN_STACK: "268435456"
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Setup Rust
+        uses: dtolnay/rust-toolchain@stable
+        with:
+          components: clippy
+
+      # Dependencies only: main's runs save it, pull requests restore it.
+      - name: Cache Cargo
+        uses: Swatinem/rust-cache@v2
+        with:
+          save-if: ${{ github.ref == 'refs/heads/main' }}
+
+      - name: Clippy
+        run: >
+          cargo clippy --all-targets
+          -p nsh-platform-windows -p nsh-windows-host -p nsh-windows-app
+          -p nsh-cli -p nsh-dev -p xtask
+          -- -D warnings
+
+      # Tests need no display: they open no window.
+      - name: Test
+        run: cargo test -p nsh-platform-windows -p nsh-windows-host -p nsh-windows-app -p nsh-cli -p nsh-dev -p xtask
+
+      # The examples' tests in Win32 windows, with the platform's input
+      # (`nsh test --target windows`): those a real platform runs (real
+      # time).
+      - name: Run the examples' tests in Win32 windows
+        shell: bash
+        run: |
+          cargo build -p nsh-cli
+          run() { ./target/debug/nsh test "$@" --target windows; }
+          run examples/counter
+          for file in context-menu device dock form gestures hover links navigation network photos resizable shortcuts storage timers; do
+            run "examples/gallery/tests/$file.test.tsx"
+          done
+          run examples/gallery/tests/environment.test.tsx --filter appearance
+          # Apps with Rust crates, in hosts built with them: a TSX app and a
+          # Rust app (its root).
+          run examples/rust-exports
+          run examples/gallery-rs/App.test.tsx
diff --git a/third-party/nsh/.gitignore b/third-party/nsh/.gitignore
new file mode 100644
index 0000000000..d64a224299
--- /dev/null
+++ b/third-party/nsh/.gitignore
@@ -0,0 +1,9 @@
+/target
+/examples/*/target
+out/
+.nsh/
+.DS_Store
+/dist
+/target-*
+/.claude/worktrees
+/crates/gpui/target
diff --git a/third-party/nsh/.rustfmt.toml b/third-party/nsh/.rustfmt.toml
new file mode 100644
index 0000000000..e6677102ad
--- /dev/null
+++ b/third-party/nsh/.rustfmt.toml
@@ -0,0 +1,12 @@
+edition = "2024"
+newline_style = "unix"
+# comments
+normalize_comments = true
+#wrap_comments=true
+format_code_in_doc_comments = true
+# imports
+imports_granularity = "Crate"
+group_imports = "StdExternalCrate"
+# report
+#report_fixme="Unnumbered"
+#report_todo="Unnumbered"
diff --git a/third-party/nsh/AGENTS.md b/third-party/nsh/AGENTS.md
new file mode 100644
index 0000000000..f1c9af0d10
--- /dev/null
+++ b/third-party/nsh/AGENTS.md
@@ -0,0 +1,522 @@
+# AGENTS.md
+
+Native Shell (NSH for short in prose; crates, the CLI, the JS module and Java package all use `nsh`) is designed for
+AI-generated, dynamically delivered native UI: native apps embed it (`NshAppView` on iOS, `NshView` on Android,
+`AppView` on macOS, Windows and Linux) and load TSX modules at run time — signed, sandboxed by the host, rendered with
+each platform's own UI. Embedding comes first; plugins for native apps and standalone apps use the same machinery.
+Module code runs in QuickJS on a native runtime (the reactive graph, the renderer and every module apps import are
+Rust); layout uses Taffy; embedding native components such as maps or web views has no layering problems. The
+toolchain is pure Rust and does not need Node.js; app developers get a prebuilt distribution (`cargo xtask dist`) and
+never need Rust either. Every platform has a native backend: iOS with UIKit views (`nsh-platform-ios`), Android with
+Android views (`nsh-platform-android`), macOS with AppKit views (`nsh-platform-macos`), Windows in Win32 windows drawn
+with Direct2D (`nsh-platform-windows`), Linux with GTK 4 widgets (`nsh-platform-linux`). Each desktop OS has one
+backend for standalone apps (AppKit, Win32, GTK 4); the GPUI backend (`nsh-platform-gpui`) draws on macOS, Windows and
+Linux and is the backend for embedding in GPUI / GPUI Kit apps; the web platform
+(`nsh-platform-web`) renders apps as HTML in a browser page, and `nsh package --target web` publishes them as static
+sites. The terminal backend (`nsh-platform-tui`) draws into Ratatui buffers on all three desktops and embeds in
+terminal apps. NSH is layered as GPUI Kit is: `nsh-core` is NSH's `gpui` (primitives, layout, rendering), `nsh-base` its
+`gpui-base` (unstyled base components: behavior, state, focus, accessibility, no look); a styled component library,
+NSH's `gpui-component`, is never part of NSH: apps and the community build theirs on `nsh-base`, or customize the UI
+in the app itself.
+
+This file is the short version. The details are in `docs/dev/` (read the page of the area you change first) and in
+the module docs of the code (`//!`, Javadoc), which are the reference for how a module works inside.
+
+## Layout
+
+```
+crates/
+  nsh-core/            Platform-independent core: typed units and geometry (`geometry/`, as GPUI's), shadow tree, styles (RN semantics), Taffy layout (flex + grid), text merging, list virtualization,
+                       mount items; CSS values (`css.rs`: colors, lengths, shadows, gradients, filters), effects (`effects.rs`), Tailwind (`tailwind/`);
+                       the reactive graph both sides run on (`reactive.rs`, Solid's algorithm, generic over the host), the loads of
+                       resources both faces share (`resource.rs`); the selection across the texts of a selection area (`selection.rs`, the platforms run it);
+                       overlays (`overlay.rs`: anchors and their placement; `core/overlay.rs`: shown in the root view, outside presses,
+                       Escape / back; docs/dev/elements.md "Overlays"); the native animation graph (`animation/`: value / interpolate /
+                       math nodes, timing / spring / decay drivers; the platforms evaluate it every frame; `Animator`: its
+                       bindings to views, gestures and scroll views); what the desktop backends share, free of any toolkit:
+                       pointer decisions (`input.rs`: what a pointer may start, presses, hover, hit areas, wheel latching),
+                       navigation decisions (`navigation.rs`: stacks' screens, transitions' timing and motion, what going back
+                       acts on), one view's transitions, layout animations and keyframes (`transition.rs`: curves,
+                       interpolation, timing), scroll views' state and physics (`scroll.rs`);
+                       Rust components that run once (`ui/`: signals, elements, bindings, typed styles, design tokens;
+                       `core/components.rs`, `core/views.rs`), classes TS uses with `new` (`ui/class.rs`), JS's calls into
+                       Rust and what comes back, typed (`ui/call.rs`: ops carrying closures, the event stream, posts); UI sets as data for the
+                       toolchain (`ui/description.rs`: exports, declarations, files; JSON for apps' describe programs); the runtime's Rust
+                       modules (`runtime/`: `nsh/android`'s Toast, `nsh/image`, ...; their JS face is made from their specs),
+                       the standard modules among them (`runtime/fs.rs`: `fs/promises`, `runtime/process.rs`, `runtime/net.rs`,
+                       `runtime/websocket.rs`, `runtime/os.rs`) on the `System` their calls get (capabilities, data directory, quotas, per-VM state)
+  nsh-base/            `nsh/base`, NSH's `gpui-base`: unstyled base components (behavior, state, focus, accessibility; the look is the
+                       app's): navigation (`NavStack`, `NavPage`), `Dialog`, `AlertDialog`, `Button`, `Checkbox`, `Radio` / `RadioGroup`, `Switch`, `Tab` / `Tabs`, `Collapsible`, `Progress`, safe areas, the keyboard, the status
+                       bar, `SelectionArea` (texts that select together: `nsh-core`'s `selection.rs`), `TextView` (Markdown / HTML documents: `text_view/`, docs/dev/text-view.md), `ResizablePanelGroup` / `ResizablePanel` (`resizable/`), `DockArea` (a dockable workspace: splits, tab groups and edge docks whose layout is
+                       data, `dock/`, docs/dev/dock.md),
+                       the popups on the core's overlays (`Popover`, `Menu` / `ContextMenu` / `MenuItem` / `MenuSeparator` / `Submenu`,
+                       `Tooltip`, `Sheet`; presented per device: docs/dev/components.md "Popups"), written in Rust (the navigation and `Dialog` in `nsh-js`); JS face and declarations made from their specs;
+                       the theme (`theme.rs`: shadcn/ui's tokens and their defaults, `neutral`, read from shadcn's `cssVars` theme
+                       files, which the core keeps as design tokens and no component of `nsh-base` draws with)
+  nsh-macros/          `#[component]`, derives of Rust components (`Props`, `PropEnum`, `Event`, `JsObject`), `#[methods]`, `#[module]`, `#[class]`,
+                       `#[native_module("…")]` (an app crate's UI set, which `rust_app.rs`'s generated code calls), `Styled`'s spacing methods;
+                       `HostProps` (the host elements' props: decoding, defaults and TS), `JsOps` (recorded operations: canvas)
+  nsh-js/              QuickJS host and NSH's runtime: console / timers, bytecode compilation and loading, limits (`sandbox.rs`);
+                       the native modules apps import (`modules.rs`: module table and loader; docs/dev/js-modules.md), the
+                       renderer of compiled JSX (`dom.rs`, `nsh:rt`), JS's reactive graph (`reactive.rs`: `nsh-core`'s
+                       graph with JS values: signals, memos, effects, owners, context), `resource` (`resource.rs`), Rust components' and modules' JS face (`components.rs`), navigation,
+                       lists, canvas, animation (`navigation.rs`, `list.rs`, `canvas.rs`, `animated.rs`), touches and the
+                       responder system (`touch.rs`), the environment (`env.rs`), hot module replacement (`hot.rs`),
+                       Rust classes (`classes.rs`: on the web classes' machinery);
+                       decoding JS values into core types (`protocol.rs`); the web APIs of TS apps (`web/`: fetch, streams,
+                       Blob / FormData, URL, encoding, events), native classes; the standard modules' VM side (`standard/`:
+                       the catalog and its loader, LLRT's `buffer` / `crypto` / `path` / `url` / `zlib`, `console`,
+                       the globals `WebSocket`, `process` and `nextTick`); the TypeScript declarations of all of it
+                       (`declarations.rs`, from the declaration next to each export and spec)
+  nsh-engine/          Engine thread: drives nsh-js + nsh-core and hands one MountBatch per frame to the platform
+  nsh-package/         Signed packages (`.nshpkg`): Ed25519 keys, release-key certificates, revocation lists, the trust store
+  nsh-bundler/         Bundler: rolldown + Oxc (TS stripping) + NSH's JSX compiler (`jsx.rs`, docs/dev/native-pipeline.md) + source maps;
+                       imports of the native modules stay imports (`plugin.rs`), so a bundle holds only the app's code;
+                       the app's themes (nsh.json `tailwind` / `theme`, checked, handed to the renderer by the entry) and the
+                       unknown-class check (`classes.rs`); the warning of components taking their props apart (`props.rs`);
+                       development bundles with hot module replacement (`hot.rs`); the bundler's part of `.nsh/types`
+                       (`types.rs`: asset imports); feature `bundle` (default off in the workspace; the CLI turns it on) is
+                       all of that, without it only `compile_module` (`compile.rs`: one module, no rolldown) is left, which
+                       also builds for WebAssembly (the website's playground)
+  nsh-dev/             Dev tooling: dev server protocol, server (CLI, feature `server`), client (host, feature `client`)
+  nsh-testing/         Headless tests: the driver (`headless/`: an engine without a window, display frames, a model of the views,
+                       the steps, stand-in network and storage, fetch on ureq; no QuickJS, for Rust apps' `cargo test`); feature
+                       `js`: `nsh test`'s side, the `nsh/test` module test files import (`module.rs`, Rust), each test file on an
+                       engine of its own and each app it opens on a headless one (`run.rs`) or a real host (`driver.rs`, `--target`),
+                       apps' headless runners (`runner.rs`); feature `bundle`: building entries in process (TSX entries of
+                       `cargo test`, the CLI's compiler); feature `agent`: a real host's test agent (`agent.rs`, the dev hosts'),
+                       which takes the steps with the platform's input
+  nsh-platform-ios/    UIKit backend (iOS / simulator / Mac Catalyst): native view mounting, CoreText text engine, input, AppView, standalone app;
+                       feature `dev`: dev server client, log forwarding, error overlay; feature `embed`: the C ABI (`embed.rs`,
+                       `include/nsh.h`) under the `NativeShell` Swift module (`swift/NativeShell.swift`) iOS apps embed nsh with
+  nsh-platform-android/ Android backend: `libnsh.so` (JNI glue, StaticLayout text engine, batch encoding, UI-thread animator) + the Java
+                       runtime in `java/com/longbridge/nsh` (NshView, Mounter, views, images, networking); feature `dev` as above
+  nsh-platform-web/    WebAssembly backend (published web apps, `nsh run --target web`, the website's live demos): the engine on
+                       the page's main thread (`LocalEngine`), text laid out with browser font metrics, batches as JSON + CSS
+                       for the DOM runtime in `web/nsh.js`, the animator on requestAnimationFrame, fetch over the browser's
+                       (`net.rs`); feature `bytecode-only`: published apps' runtime (`nsh.wasm`, no QuickJS parser), feature
+                       `dev`: the development host's (`nsh-dev.wasm`, source and hot updates, the model `nsh test --target web`
+                       asks about); `web/index.html` is the demo
+                       player (`cargo xtask web`); feature `compiler`: the playground's TSX compiler (`nsh-playground.wasm`)
+                       (docs/dev/web.md)
+  nsh-platform-linux/  GTK 4 backend (Linux): one `NshView` widget per node drawn with GSK, Pango text engine (typeset on the engine
+                       thread, glyph runs drawn on the main thread), input, scroll views, navigation, video, native
+                       components, AppView, standalone app; feature `dev`: dev server client, log forwarding, error overlay,
+                       the test agent's platform part (`agent.rs`: `nsh test --target linux`) (docs/dev/linux.md)
+  nsh-linux-host/      Development host on Linux (`nsh run --target linux`): connects to a dev server or runs a bundle
+  nsh-linux-app/       Release runner on Linux: the executable of apps built by `nsh package --target linux`
+  nsh-platform-macos/  AppKit backend (macOS): one flipped, layer-backed `NSView` per node decorated by Core Animation, CoreText text
+                       (typeset on the engine thread), desktop input and scroll views as on Linux, navigation, video, web views,
+                       native components, AppView, standalone app; feature `dev` as above (docs/dev/macos.md)
+  nsh-macos-host/      Development host on macOS (`nsh run --target macos`): connects to a dev server or runs a bundle
+  nsh-macos-app/       Release runner on macOS: the executable of apps built by `nsh package --target macos`
+  nsh-platform-windows/ Win32 backend (Windows): one retained `NshView` per node, the tree drawn with Direct2D into a swap chain,
+                       DirectWrite text engine (typeset on the engine thread, glyph runs drawn on the main thread), input
+                       (mouse, touch, pen, wheel, precision touchpads), scroll views, NSH's own text editor (IMM32 IME),
+                       navigation, video (Media Foundation), web views (WebView2), native components, UI Automation,
+                       AppView, standalone app; feature `dev` as above (docs/dev/windows.md)
+  nsh-windows-host/    Development host on Windows (`nsh run --target windows`): connects to a dev server or runs a bundle
+  nsh-windows-app/     Release runner on Windows: the executable of apps built by `nsh package --target windows`
+  nsh-platform-tui/   Terminal backend (macOS, Windows, Linux): retained scene, terminal text measurement, focus and editing,
+                       scrolling, navigation, native animation, worker-rendered images and canvas through detected graphics
+                       protocols or half blocks;
+                       AppView embeds in a Ratatui region, run_app owns a standalone terminal; feature `dev`: hot reload;
+                       --script renders deterministic UTF-8 snapshots in memory (docs/dev/tui.md)
+  nsh-tui-host/        Development host in a terminal (`nsh run --target tui`): connects to a dev server or runs a bundle
+  nsh-tui-app/         Release runner in a terminal (`nsh package --target tui`)
+  gpui/                The GPUI backend: a workspace of its own (`crates/gpui/Cargo.toml`, its own `Cargo.lock` and GPUI's dependencies),
+                       excluded from the main one, so the main workspace's builds, tests and CI never build GPUI:
+  gpui/nsh-platform-gpui/ GPUI backend (macOS, Windows, Linux): the Windows backend's retained `NshView` tree, input,
+                       scrolling and editing logic, painted by one GPUI element per surface (`render.rs`: `SurfaceElement`,
+                       `DrawCx` with the transform and opacity GPUI lacks), text shaped by GPUI's text system on the engine
+                       thread, the main-thread queue (`rt.rs`), GPUI events (`events.rs`, keys as Windows VK codes);
+                       `AppView` is a GPUI view for GPUI / GPUI Kit apps; features `webview` (wry), `video` (GStreamer),
+                       `dev` as above, `shot` (screenshots on macOS / Windows: GPUI's test support); it is the
+                       backend for embedding, standalone apps run on each OS's own backend (docs/dev/gpui.md)
+  gpui/nsh-gpui-host/  Development host on GPUI (`nsh run --target gpui`): shows a TSX app as GPUI apps that embed it
+                       show it; connects to a dev server or runs a bundle
+  nsh-ios-host/        Development host app (Catalyst / iOS simulator); connects to a dev server or runs a local bundle
+  nsh-ios-app/         Release runner: the executable of iOS apps built by `nsh package`
+  nsh-cli/             The `nsh` command line (a binary): init / build / test / check / dev / run / package; keygen /
+                       certify / publish / verify / revoke; apps with Rust components of their own (`rust_app.rs`: each crate
+                       nsh.json `"rust"` names, one or a list, has a `#[native_module("…")]` fn; a generated workspace in `.nsh/rust`
+                       with a `describe` program, which prints the sets as data for the CLI to bundle, compile and declare with, the
+                       hosts and runners, and the headless runner of `nsh test`; it takes nsh's crates where the app's crates do:
+                       crates.io at the CLI's version, or the checkout they depend on by path; docs/dev/tooling.md); web packages and the
+                       browser host's pages (`web.rs`, `web/`); `nsh test --target web`'s headless browser (`cdp.rs`, `test_web.rs`);
+                       what it prints (`ui.rs`:
+                       one line per step, tools' output only on failure, `-v` for everything; docs/dev/tooling.md "Output")
+  xtask/               Maintainer tasks: `cargo xtask android` (Android runtime), `ios-embed` (the iOS SDK), `dist` (the distribution),
+                       `web` (the WebAssembly runtime and the website's demos), `compat` (runs `nsh-compat` against this checkout;
+                       `compat record <version>`: records a release there)
+tests/compat/         The apps whose scripts check the API apps use (`nsh-compat` builds and runs them): `cases/<domain>/` (one app per
+                      domain, a module per case, `script.txt`), `examples/<app>.txt` (the scripts of examples)
+docs/                 Documentation; `docs/dev/`: for developers of nsh (architecture, internals, decisions, pitfalls)
+website/              The documentation site (Astro; guides, element / component / API reference in English and zh-CN) and its
+                      runnable demos (`website/demos/*.tsx`, live on the site through the WebAssembly runtime); see its README
+examples/             Example apps (gallery: a demo index, one module per demo, `tests/` the reference for `nsh test` (storage,
+                      inputs, a long list, stubbed requests, dark mode, a manual clock); gallery-rs: the same in Rust, the app's crate in `native/`,
+                      TypeScript tests of its root (`*.test.tsx`, about a demo each); rust-exports: a TSX app using one of each export of its crate, the reference
+                      for exporting components, modules and classes, with Rust and TypeScript tests of the TSX entry; counter,
+                      with a test), embedding samples
+                      (embed-ios, embed-android; embed-gpui: a GPUI Kit app, its own workspace; `run/` the root's
+                      `cargo run -p example-embed-gpui`) and the app they run (embedded: uses a native component the samples
+                      register); bench: component benchmarks
+```
+
+Dependency direction: `nsh-core` ← `nsh-js` ← `nsh-engine` (also ← `nsh-package`) ← `nsh-platform-*` ←
+`nsh-ios-host` / `nsh-ios-app` / `nsh-linux-host` / `nsh-linux-app` / `nsh-macos-host` / `nsh-macos-app` / `nsh-windows-host` / `nsh-windows-app` / `nsh-gpui-host` / `nsh-tui-host` / `nsh-tui-app`; `nsh-cli` depends on `nsh-bundler`, `nsh-js` and `nsh-engine`; `nsh-bundler`'s feature `bundle` depends on `nsh-js` (to check
+imports against the names native modules export); `nsh-base` depends on `nsh-core` only and is used by the bundler
+(declarations), the platforms and the CLI (registry). An app's own crates (its UI sets) depend on `nsh-core` only and
+are never linked into the CLI: it reads their UI sets as data (`nsh_core::ui::description`); the hosts and runners
+`rust_app.rs` generates link them. `nsh-core` must not depend on any platform or JS crate.
+
+## Documentation
+
+| Changing | Read |
+|---|---|
+| threads, the JS → native data flow, text pipeline | `docs/dev/architecture.md` |
+| how apps are compiled and run: the JSX compiler, the renderer | `docs/dev/native-pipeline.md` |
+| the native modules, where a new API goes, platform props | `docs/dev/js-modules.md` |
+| API names: anything apps use, its props, events, slots and parts | `docs/dev/api-naming.md` |
+| elements, touch, accessibility, the environment | `docs/dev/elements.md`, `text.md` |
+| styles, Tailwind, effects | `docs/dev/styles.md` |
+| units and geometry (`Points`, `Length`, `Bounds`, ...) | `docs/dev/geometry.md` |
+| scroll views, zooming, `List` | `docs/dev/scrolling-and-lists.md` |
+| animation, canvas, images | `docs/dev/animation.md`, `canvas.md`, `images.md` |
+| VM limits, capabilities, signed packages | `docs/dev/sandbox.md`, `signed-packages.md` |
+| packaging, the iOS / Android SDKs, native components | `docs/dev/embedding.md` |
+| `.nsh/types`, the dev server, hot reload | `docs/dev/tooling.md` |
+| the web runtime (`nsh-platform-web`), the website's demos | `docs/dev/web.md`, `website/README.md` |
+| the Linux backend (`nsh-platform-linux`, GTK 4) | `docs/dev/linux.md` |
+| the macOS backend (`nsh-platform-macos`, AppKit) | `docs/dev/macos.md` |
+| the Windows backend (`nsh-platform-windows`, Win32 / Direct2D) | `docs/dev/windows.md` |
+| the GPUI backend (`nsh-platform-gpui`, macOS / Windows / Linux) | `docs/dev/gpui.md` |
+| the terminal backend (`nsh-platform-tui`, Ratatui) | `docs/dev/tui.md` |
+| anything apps use: exports, `nsh:rt`, props, events, style keys, Tailwind, declarations, behavior, formats | `docs/dev/compatibility.md` |
+| a hot path | `docs/dev/performance.md` (baselines) |
+| anything platform-specific | `docs/dev/pitfalls.md` (verified constraints, by area) |
+| Rust components (`nsh-base`'s, apps' UI sets) | `docs/dev/components.md` |
+| `TextView`: Markdown / HTML documents, their parsers, parts and extensions | `docs/dev/text-view.md` |
+| `DockArea` and `ResizablePanelGroup`: the layout data, render keys, drag and drop, compact presentation | `docs/dev/dock.md` |
+| Rust classes TS uses (`#[class]`), module functions' kinds, callbacks, how calls and Rust components' props cross (typed) | `docs/dev/rust-classes.md`, `docs/dev/components.md` |
+
+Keep them current: a change that alters documented behavior updates its page (or the module doc) in the same commit,
+including the user-facing pages in `website/` (English and `zh-CN`). User-facing pages and the README are written in
+positive terms: what a platform or feature is and does, never what it is not or lacks, and name the product Native
+Shell in formal places and NSH elsewhere (`nsh` only in code) ("Writing documentation" in `website/README.md`).
+
+## Commands
+
+```sh
+cargo run [-- <app>] [-- --target catalyst|ios|android|gpui]                       # the gallery on this machine's backend (AppKit / GTK / Win32), hot reload; rebuilt and restarted on Rust changes
+cargo xtask [<app>] [--target catalyst|ios|android|gpui] [-v]                      # the same without cargo's own two lines; -v (any nsh / xtask command): all output
+cargo build -p nsh-cli                                                             # build the nsh CLI
+./target/debug/nsh init my-app --template ts|rust|mixed                            # new app: TSX, Rust (a Cargo project, "root"), or TSX that is also a crate ("rust": "."); asks on a terminal without --template
+cargo build -p nsh-ios-host --target aarch64-apple-ios-macabi                          # the Catalyst development host (nsh run builds it in a checkout)
+cargo build -p nsh-ios-host --target aarch64-apple-ios-sim                             # the iOS simulator host (`nsh run --target ios`)
+cargo build -p nsh-ios-app --target aarch64-apple-ios-sim                              # the release runner (`nsh package --target ios-simulator`)
+cargo build -p nsh-linux-host                                                          # the Linux (GTK) development host (`nsh run` on Linux builds it in a checkout)
+cargo build -p nsh-macos-host                                                          # the macOS (AppKit) development host (`nsh run --target macos` builds it in a checkout)
+cargo build -p nsh-windows-host                                                        # the Windows development host (`nsh run` on Windows builds it in a checkout)
+cargo build --manifest-path crates/gpui/Cargo.toml --target-dir target -p nsh-gpui-host                    # the GPUI development host (`nsh run --target gpui` builds it in a checkout)
+cargo build --manifest-path crates/gpui/Cargo.toml --target-dir target -p nsh-gpui-host --features nsh-gpui-host/runtime-shaders   # the same on a Mac without Xcode's Metal Toolchain (GPUI compiles its shaders at run time)
+cargo run -p example-embed-gpui                                                        # the GPUI Kit embedding example (a std-only runner that only runs `cargo run` in its own workspace)
+./target/debug/nsh test examples/counter/App.tsx --trace                    # headless run: prints mount items and the time of every commit
+echo 'await app.scroll("id:photos", 3000)' | ./target/release/nsh test examples/gallery/Bench.tsx --trace   # headless scrolling (10pt per frame): per-frame list cost
+echo 'await app.press("label:Plan"); await app.wait(500)' | ./target/debug/nsh test examples/hopper/App.tsx --trace   # steps from stdin (`app`: nsh/test's App)
+./target/debug/nsh test examples/gallery                                   # the app's tests (`*.test.tsx`, `nsh/test`), headless; --trace prints batches
+./target/debug/nsh test examples/gallery --target macos                    # the same tests in macOS windows: native input at the views (`nsh_testing::agent`)
+./target/debug/nsh test examples/gallery --target web                      # in a headless Chrome / Edge / Chromium (found, or --browser <PATH>): trusted input over CDP
+xvfb-run -a ./target/debug/nsh test examples/gallery --target linux        # in GTK windows (a virtual display here); also windows, gpui
+./target/debug/nsh test examples/gallery --target ios                      # in an iOS simulator: a finger's touches and the keyboard's typing, as UIKit gets them
+./target/debug/nsh test examples/gallery --target android                  # on the first device adb lists: MotionEvents and KeyEvents at the window's views
+echo 'await app.screenshot("a.png"); await app.press("label:Navigation"); await app.screenshot("b.png")' | ./target/debug/nsh test examples/gallery/App.tsx --target macos   # check a platform change: steps from stdin in its window
+./target/debug/nsh check examples/hopper                                   # type check (TypeScript 7's native tsc, downloaded once; no Node)
+./target/debug/nsh run examples/counter --trace                            # dev server + Catalyst host (390×844), hot reload on save
+./target/debug/nsh run examples/gallery --target ios                       # in an iOS simulator (boots one; needs the nsh-ios-host sim build)
+./target/debug/nsh run examples/gallery --target android                   # on an emulator / device (needs `cargo xtask android --dev`)
+./target/debug/nsh run examples/gallery --target linux                     # in a GTK window (the default on Linux)
+./target/debug/nsh run examples/gallery --target windows                   # in a Win32 window, 1200×800 (the default on Windows)
+./target/debug/nsh run examples/gallery --target gpui                      # in a GPUI window (macOS, Windows, Linux), as GPUI apps embed it
+./target/debug/nsh run examples/terminal-workbench --target tui            # in this terminal, with hot reload
+./target/debug/nsh package examples/terminal-workbench --target tui        # console executable and resources, archived for this OS
+./target/debug/nsh-tui-host --bundle build/bundle.nshc --size 120x40 --script "wait 300; shot screen.txt; quit"   # headless text snapshot
+./target/debug/nsh run examples/gallery --target web                       # in the browser (the dev server serves the page)
+./target/debug/nsh package examples/gallery --target web --run             # a static site (files named by content), served on this machine
+./target/debug/nsh package examples/gallery --target ios-simulator --run   # installable app (.app / .ipa / .apk)
+cargo xtask android [--release] [--dev]                                            # Android runtime into target/android/<profile>[-dev]
+cargo xtask dist                                                                   # the distribution in dist/nsh
+./target/debug/nsh dev examples/counter --server-only                      # dev server only (for simulators / devices); prints local and LAN URLs
+./target/debug/nsh build examples/counter --release                        # writes bundle.js / bundle.nshc
+./target/debug/nsh keygen keys/root && ./target/debug/nsh keygen keys/release      # signing keys (.secret / .pub)
+./target/debug/nsh certify --root keys/root.secret --key keys/release.pub --apps 'com.example.*' -o keys/release.cert
+./target/debug/nsh publish examples/counter --key keys/release.secret --cert keys/release.cert --build 2
+./target/debug/nsh verify out/com.example.counter-2.nshpkg --root keys/root.pub     # as a device would check it
+./target/debug/nsh revoke --root keys/root.secret --sequence 1 --package <sha256> -o revocations.json
+
+cargo test --workspace
+cargo test --release -p nsh-engine --test engine bench_gallery_scroll -- --ignored --nocapture   # gallery scroll benchmark (JS + core)
+cargo test --release -p nsh-core bench_ -- --ignored --nocapture                # row / cell relayout benchmarks
+cargo +nightly fmt --all                                                        # .rustfmt.toml uses nightly options
+cargo clippy --workspace --all-targets
+cargo clippy -p nsh-platform-ios -p nsh-ios-host -p nsh-ios-app --target aarch64-apple-ios-macabi --features nsh-platform-ios/embed,nsh-platform-ios/dev
+cargo xtask ios-embed [--dynamic] [--x86-64-simulator] [--no-catalyst] [--no-dev]   # NativeShell(Dev).xcframework into dist/nsh/embed/ios
+cargo xtask web                                                                 # nsh.wasm + player + website demos into website/public/play
+cargo xtask compat                                                              # tests/compat's apps, and the API every recorded release froze (nsh-compat)
+cargo xtask compat record <version>                                             # record this checkout as a release in nsh-compat (at release time)
+cargo clippy -p nsh-platform-web --target wasm32-unknown-unknown --features compiler   # the web backend (empty off WebAssembly)
+cargo clippy -p nsh-platform-linux -p nsh-linux-host -p nsh-linux-app --all-targets      # the Linux backend (on Linux; empty elsewhere)
+cargo clippy -p nsh-platform-macos -p nsh-macos-host -p nsh-macos-app --all-targets --features nsh-platform-macos/dev   # the macOS backend (on macOS)
+cargo clippy -p nsh-platform-windows -p nsh-windows-host -p nsh-windows-app --all-targets   # the Windows backend (on Windows; empty elsewhere)
+cargo clippy -p nsh-platform-tui -p nsh-tui-host -p nsh-tui-app --all-targets   # the terminal backend (macOS / Windows / Linux)
+cargo test -p nsh-platform-tui -p nsh-tui-host -p nsh-tui-app                  # tests and in-memory terminal rendering, no display needed
+cargo test -p nsh-platform-windows -p nsh-windows-host -p nsh-windows-app               # its tests (on Windows; they open no window)
+(cd crates/gpui && cargo clippy --all-targets --features nsh-platform-gpui/dev)        # the GPUI backend, its own workspace (empty off the desktops)
+(cd crates/gpui && cargo test && cargo +nightly fmt --all)                              # its tests (they open no window) and formatting
+cd website && bun run dev                                                       # the documentation site (builds the player too)
+```
+
+`nsh-platform-ios` only compiles for `target_os = "ios"` (iOS devices, the iOS simulator and Catalyst); on a macOS
+host it is an empty crate, so always run clippy on platform code with the Catalyst target. Likewise
+`nsh-platform-android` is empty off Android: check it with `cargo xtask android` (which sets up the NDK linker, `CC`,
+`AR` and bindgen's sysroot) and `cargo xtask clippy-android`. `nsh-platform-linux` and its hosts are empty off Linux:
+check them on Linux, with the GTK 4 (≥ 4.14) development packages installed. `nsh-platform-macos` and its hosts are
+empty off macOS (`target_os = "macos"`, not Catalyst). `nsh-platform-windows` and its hosts are empty off Windows:
+check them on Windows, with the MSVC Build Tools, the Windows SDK and LLVM (libclang for QuickJS' bindings);
+`RUST_MIN_STACK=268435456` if rustc overflows its stack on the `windows` crate. The GPUI backend (`crates/gpui`) is
+a workspace of its own: the main workspace's `cargo test --workspace` and clippy never build it, and its CI runs only when
+it changes (and daily). Its crates build on all three desktops and are empty elsewhere; on Linux they need GPUI's X11 /
+Wayland / xkbcommon / fontconfig packages plus GTK 3, WebKitGTK 4.1 (feature `webview`, on by default) and GStreamer
+1.20+ with its base plug-ins (feature `video`, the host's); on macOS Xcode's Metal Toolchain, or the
+feature `runtime-shaders` (`docs/dev/gpui.md`), which the CLI turns on when `xcrun metal` fails. It builds into the
+repository's `target/`; dependencies only it uses are declared in `crates/gpui/Cargo.toml`, not the root. `.cargo/config.toml` sets
+`IPHONEOS_DEPLOYMENT_TARGET = 15.0` for Rust and C alike.
+
+The terminal backend is in the main workspace and builds on macOS, Windows and Linux using Rust libraries and the
+OS console facilities. It needs the common C compiler / libclang setup for QuickJS when building with `js`, and
+supports Rust-root embedding with `--no-default-features`. Layout stays in virtual points (one cell is 8×16 points
+by default); only terminal IO, rendering, script input and embedding regions use cells. Keep those units explicit
+when changing text measurement, clipping, pointer input or scripts (`docs/dev/tui.md`).
+
+## Rules
+
+- **Convention over configuration (CoC, a project constraint).** Follow the existing project and toolchain conventions
+  before adding configuration, wrapper scripts, environment overrides or another cache directory. NSH-managed
+  temporary/generated files belong in `.nsh/`. Cargo keeps its normal `target/` directory and the user's existing
+  `CARGO_TARGET_DIR` behavior; do not add Cargo configuration or change that environment variable just to organize
+  NSH files. Reuse the existing Cargo cache rather than creating a second one under `.nsh/`.
+- **Three layers, as GPUI Kit's (an architecture rule).** `nsh-core` ↔ `gpui`: the primitives and the environment,
+  `nsh` / `nsh/<module>` (native in `crates/nsh-js` or Rust modules of the runtime, `crates/nsh-core/src/runtime/`);
+  TSX imports every primitive from `nsh`, as Rust does from `nsh_core::ui::prelude`.
+  `nsh-base` ↔ `gpui-base`: `nsh/base` (`crates/nsh-base`), unstyled base components of `gpui-base`'s scope that own
+  behavior, state, focus, keyboard and accessibility and leave every visual choice to the app (navigation, dialogs, a
+  button, a checkbox, radios, a switch, tabs, popovers, menus, tooltips and sheets, safe areas, system alerts and the keyboard today, with the status bar a
+  prop of pages and dialogs; controls such as toggles, sliders and selects as their behavior is written). Names follow `gpui-base`'s
+  (`docs/dev/api-naming.md`). `gpui-component` ↔ nothing: a styled component library is never part of NSH; apps and
+  the community build theirs on `nsh-base`, or style the UI in the app itself. Each export has one home (two
+  registries exporting one name panic, `Registry::merged`). Platform-only APIs go to `nsh/ios` / `nsh/android`,
+  platform-only props into `ios={{…}}` / `android={{…}}` / `desktop={{…}}`. `nsh` has no catch-all re-exports. Beside
+  them sits a fixed catalog of eleven standard modules with bare specifiers (`nsh_core::js::STANDARD_MODULES`:
+  `buffer`, `console`, `crypto`, `fs/promises`, `net`, `os`, `path`, `process`, `url`, `websocket`, `zlib`):
+  Node-shaped subsets compatible with gpui-shell's, built on the same native machinery (typed registries, capability
+  checks in Rust) with generated declarations. Exactly these names import; `node:` prefixes and other Node modules
+  (`fs`, `events`, `util`, ...) are refused. Files and processes are these modules (`fs/promises`, `process`), never
+  an `nsh/<module>`; the catalog grows only by a design decision.
+- **Backward compatible, from the first recorded release on.** Apps are delivered to host apps as plugins and may
+  never be built again, so every release runs every app built for an earlier compatible one. What a release recorded
+  in [`longbridge/nsh-compat`](https://github.com/longbridge/nsh-compat) shipped is never removed or renamed: modules,
+  exports and their members, `nsh:rt` (what compiled JSX calls: append-only, signatures and semantics kept), globals,
+  props, events and payload keys, style keys and values, Tailwind utilities. A rename or move keeps the old name as a
+  `@deprecated` alias of the same implementation, for good. Types only widen; inputs gain optional members only;
+  behavior and defaults stay (new behavior is opt-in); formats (`.nshpkg`, certificates) are read forever. The record
+  and its checks live in that repository, never here: a change to NSH cannot rewrite them, and the only removals are
+  security closures in its `closed.txt`. No release is recorded yet, so nothing is frozen: what is on `main` may still
+  change. A new API lands with its test, a case in `tests/compat/cases/<domain>/` whose script checks it
+  (`cargo xtask compat`; `docs/dev/compatibility.md`).
+- **No styles in NSH.** Nothing NSH ships has a look of its own: no default colors, paddings, radii, fonts or variants
+  in `nsh-base`'s components (its theme's default tokens, shadcn/ui's, are the app's to draw with; the one
+  exception is `TextView`'s default reading typography, its colors the theme's shadcn tokens (alerts GitHub's alert
+  colors, highlights a marker's yellow), every part overridable by the
+  app's `classes` / `styles` / `TextViewParts`, and its built-in syntax highlighting colors, Allsum's code palette, which an app's
+  `CodeHighlighter` or `renderCodeBlock` replaces); a component takes the app's styles (`class`, `style`, styles per state) and children, and exposes its
+  parts instead of fixed markup. Its state is controlled (it reports changes, the app owns the value). The platforms
+  draw nothing of NSH's either: no header where the system has none (the desktops and the web place a page's `header`
+  slot), no dialog card, scrim or shadow, no native press fade (press feedback is the app's `activeStyle` /
+  `active:`), no built-in strings (every label comes from the app); system UI keeps the platform's look (iOS / Android
+  headers; `AlertDialog`, drawn in the platform's dialog style where the system has no dialog to show). React Native and
+  UIKit are references for which capabilities exist, not APIs to be compatible with.
+- **CSS and Tailwind as in a browser.** CSS values (colors, lengths, gradients, filters, shadows, transforms,
+  alignment keywords, ...) and Tailwind utilities and variants mean exactly what they mean in a browser and in
+  Tailwind CSS (v4); Tailwind's generated CSS is the reference for each utility. What NSH cannot support is
+  unsupported (an unknown class, a rejected value with a warning), never given a different meaning: nothing
+  NSH-specific, so there are no traps (`docs/dev/styles.md`).
+- **Components are Rust.** Rust components live in `crates/nsh-base` or in an app's own crate (its UI set,
+  `#[native_module("…")]`), run in the core and render primitives with typed styles (GPUI-style `Styled` methods,
+  never class strings); props and events are derived types, their JS face is made from the specs (`nsh-js`
+  `components.rs`) and their TypeScript declarations generated from them (`nsh_core::ui::declarations`), never
+  hand-written per component. JS allocates even node ids, the core odd ones for what components expand
+  (`docs/dev/components.md`).
+- **The main thread never waits for JS.** Callbacks the system wants answered on the spot (may this text change, may
+  the back button pop, may the sheet close, ...) are answered natively from props mounted beforehand; events tell JS
+  afterwards (`docs/dev/elements.md`).
+- **One surface / `NshView` is one engine**, with no global singletons (NSH is embedded with several instances).
+- **Limits and checks are enforced in Rust, never in JS**: a bundle holds only the app's code, so nothing in JS is
+  trusted. QuickJS bytecode is trusted input (`Bundle::bytecode` is `unsafe`): it only loads from the app's own
+  resources, the dev server and verified packages (`docs/dev/signed-packages.md`).
+- **Generated, never hand-copied**: the codes of encoded operations (`ANIMATION_*`, `CV_*`), the canvas's recording
+  methods and properties (made natively from `CanvasOp`'s `#[derive(JsOps)]` specs, which also decode them), the style
+  types, the host elements' props and events and the easings / layout animation presets come from
+  `crates/nsh-core/src/js/`, and so do their declarations, as do those of the runtime's Rust modules, of `nsh/base` and of apps'
+  UI sets. No `.d.ts` is checked in: a native module's export carries its declaration (`modules::Ts`), a web
+  class's spec its members' (`web::ClassTs`), and tests load every module and global and check that what exists is
+  what is declared (`nsh-js` `declarations.rs`). A new style property is one line of `style_keys!` (`style.rs`) with
+  its TS type, a new host prop one variant of `Prop` with `#[prop(js = …)]`, a new event a row of `host::EVENTS` (or
+  `INTERNAL_EVENTS`) (`docs/dev/elements.md`).
+- **Keep in sync**: the handler types of `host::EVENTS` ↔ the payloads of `nsh-js`'s `dispatch_event`; the order of `EventKind` ↔ `Native.java`; `encode.rs`
+  opcodes ↔ `Mounter.java`; new event payload keys ↔ the JNI event map's key list; `BUNDLE_NAME` /
+  `BYTECODE_VERSION` ↔ the linked QuickJS; `nsh-macros`' `VARIANT_SCALES` ↔ `IMAGE_SCALES` above 1.
+
+## Code conventions
+
+- Name context bindings and parameters `cx`.
+
+- Formatting: `cargo +nightly fmt --all`, configured in `.rustfmt.toml`.
+- Units and geometry are typed, as GPUI's are (`nsh_core::geometry`): a length is `Points` (GPUI's `Pixels`), `Rems`,
+  a `Percentage` (a fraction, 0.5 is 50%) or a style length (`AbsoluteLength`, `DefiniteLength`, `Length`), an angle is
+  `Radians`, shapes are `Point` / `Size` / `Bounds` / `Edges` / `Corners` of a unit. Public API never takes or returns a
+  bare `f32` / `f64` for a length, an angle or a fraction; platform boundaries (taffy, the toolkits, JS decoding) convert.
+  Enforced: nsh-core's `unit_types` test (and nsh-js's and nsh-engine's `public_api_is_typed`) fails on a bare float
+  in public API that the crate's `unitless.txt` (unitless quantities, with reasons) or its shrinking `untyped.txt`
+  (legacy, to migrate) does not list (`docs/dev/geometry.md`).
+- TSX tags are PascalCase, everywhere (examples, docs, tests): every tag names a binding in scope, only `<If>` and
+  `<Each>` are globals that need no import. Imports mirror the Rust crates' layers: every primitive comes from `nsh`
+  (`View`, `Text`, `Scroll`, `Input`, `Overlay`, `Image`, `List`, `Canvas` and its classes, `WebView`, `Video`), as
+  `nsh_core::ui::prelude` holds them, every base component from `nsh/base` (`Dialog`, `Button`, `NavStack`, ...), and
+  `InputAccessoryView` from `nsh/ios`; the compiler makes their tags in place (`jsx::PRIMITIVES`). `nsh/image`,
+  `nsh/list`, `nsh/canvas`, `nsh/webview` and `nsh/video`, where primitives were first, still export them (the same
+  values, deprecated): new code imports them from `nsh`. Lowercase tags are compile errors: TypeScript checks a lowercase tag
+  against one global type per name, so generic components (`List`, `Each`) and local ones would lose their types.
+- Workspace lints: `missing_docs = warn`, `unreachable_pub = deny`, `private_interfaces = deny`. New crates must set `[lints] workspace = true`.
+  They cover NSH's own Rust crates only: not the Java / Swift / TS sources, and never the apps built with NSH.
+  - Every public API has a doc comment.
+  - Items in private modules are `pub(crate)`, never `pub`.
+- Everything is written in English: code comments, docs, logs and this file. Comments explain why, not what the code says.
+- Colors in Rust are GPUI's: `Hsla` (`nsh_core::color`) is the color code holds, passes and computes with (theme
+  colors, typed styles, props, every new signature: `impl Into<Hsla>` or `AdaptiveColor`), `Rgba` is only for
+  conversions; the packed `Color` (`0xRRGGBBAA`) is only the storage and wire form (styles, mount items, the
+  platforms) (`docs/dev/styles.md` "Colors").
+- Library crates only log through the `log` facade (no `eprintln!`); performance logs use target `nsh::perf`, JS logs target `js`. Binaries install the logger.
+  The CLI prints through `nsh-cli`'s `ui.rs` (steps, captured tools, `error` reports), xtask through `term.rs`.
+- Dependencies are declared once in the root `Cargo.toml` `[workspace.dependencies]` (the GPUI backend's in `crates/gpui/Cargo.toml`); crates only write `.workspace = true`.
+- Every `unsafe` block has a `// SAFETY:` comment.
+- A crate's integration tests are one test binary (`tests/<name>/main.rs` with a module per area, as
+  `nsh-engine/tests/engine/`), never a new `tests/*.rs`: each binary links its own copy of the bundler, QuickJS and
+  the core (about 1 GiB of debug objects apiece).
+
+## Public Rust structs
+
+- New `pub struct` types use `#[non_exhaustive]` and implement `Default`, deriving it when possible.
+- Set only the fields needed and leave the rest at their defaults. Within the defining crate, use `..Default::default()`; callers in other crates start with `Type::default()` and assign fields, because non-exhaustive structs cannot be constructed with external struct literals.
+- New fields have sensible defaults so extending a struct does not break downstream construction.
+
+## Commits and pull requests
+
+Details and examples: "Commits and pull requests" in `CONTRIBUTING.md`.
+
+- **All changes go through a pull request. Never push commits directly to `main`.** This includes code,
+  documentation, release / version updates and CI / workflow fixes. Create a topic branch, push it and open a PR
+  targeting `main`; merge through the PR after required checks pass. Do not use administrator bypass to skip this
+  workflow. A request to release or push changes does not authorize a direct push to `main`.
+
+- Subjects and PR titles are `<area>: <What the change does>`: the area in lower case (a crate without `nsh-`:
+  `core`, `js`, `engine`, `bundler`, `cli`, `base`, ...; one platform: `ios`, `android`, `macos`, `windows`,
+  `linux`; `desktop` for macOS, Windows and Linux together, `mobile` for iOS and Android together; `runtime`, a module;
+  `tailwind`, `text`, `docs`, `examples`, `gallery`). One area only, never several separated by commas: for a change
+  that spans parts, judge it as a whole and name the part it is mostly about (a feature the core adds and the platforms
+  carry out is `core`); then an imperative sentence starting with a capital letter, no trailing period, about 72 characters in all. Say what it does for NSH's users, not which
+  files changed. Never conventional prefixes (`fix:`, `feat:`); check `git log` and match it.
+- The body explains why (wrapped at 72 columns); hot path changes include their before / after `nsh test --trace` numbers.
+- One commit / PR does one thing; no unrelated refactors, cleanup or formatting.
+- A PR that adds, changes or removes public API (Rust items, JS exports, elements, props, style keys, Tailwind
+  utilities, `nsh.json` keys, CLI flags, SDK APIs) lists every item under `## Public API` with its signature and one
+  line on its purpose; changes to existing items also go under `## Breaking Changes` with `diff` blocks
+  (`.github/pull_request_template.md`).
+- A PR review presents, in order: the PR's purpose (the problem and the scope of the changes), whether the requirement
+  and approach are reasonable, then concrete findings, the validation performed and its limits.
+
+## Performance rules (the project's first priority)
+
+1. **QuickJS is the slowest link: JS does as little as possible.** Only the app's code is JS: the reactive graph, the renderer and
+   the modules are native, and compiled JSX calls them directly. Parsing, diffing and string processing all happen in Rust. No JSON
+   serialization on the JS side.
+2. **Cross threads in batches.** One JS turn → its ops queued natively (`Shared.ops`) → one `Core::commit` → one `MountBatch` → one
+   main-thread hop. Never cross FFI or threads per item.
+3. **No needless allocation on hot paths.** Node ids are dense: index `Vec`s (`slots`), not hash maps. Internal links use slab keys. Reuse
+   buffers (`take_ops`, `queue`).
+4. **Do not send mount items that are not needed.** New views get no default style and no empty event mask; unchanged styles and frames are not
+   sent. Check item counts with `nsh test --trace`.
+5. **Text**: measurements are cached per constraint (`TextContext.cache`); platforms cache font objects (`FontCache`).
+6. **Changes to hot paths come with before / after `nsh test --trace` timings and item counts**, compared with the baselines
+   in `docs/dev/performance.md` (update them when they move).
+
+## CI
+
+Each workflow runs only when what it builds changes: the Rust workflows list their crates one by one in `paths`,
+derived from the dependency graph. A new crate, a new path dependency or a new workflow updates those lists
+(`python3 .github/ci/paths.py --print`); the `CI paths` workflow fails when a list misses a crate its workflow builds.
+It runs on every pull request: its `check` job is the status check main requires, so a pull request no other workflow
+reports `check` for (one touching only `crates/gpui`) can still merge. The Compat workflow's `compat` job is required
+too, so it also runs on every pull request, and its `dorny/paths-filter` step (held to the graph by `paths.py` the same
+way) decides whether it builds and checks or passes at once.
+Every pull-request workflow also handles `merge_group: checks_requested`, so GitHub's merge queue tests the
+combined commit. Queue runs execute the full workflow without PR path filters; Compat always builds on a queue
+run. Website deployment runs only on pushes and manual dispatches. `.github/ci/paths.py` checks the queue
+trigger alongside the dependency paths.
+CI builds without incremental state or debug info, caches dependencies only (`Swatinem/rust-cache`, saved by `main`,
+restored by pull requests) and ignores the toolchain file's mobile targets (`RUSTUP_TOOLCHAIN=stable`) except in the
+release. Files a crate reads from outside its directory (`include_bytes!`, test fixtures) go into its workflows'
+`files` in `paths.py`.
+
+## Parallel agents
+
+Subagents and teammates never run `cargo build`, `cargo test`, `cargo clippy`, `cargo xtask` or `nsh test` (several
+at once overload the machine); at most an occasional `cargo check -p <crate>` for compile errors. They write the
+code and its tests and report which tests to run; the main session runs builds and tests itself, one at a time.
+
+## Review and parallel workspaces
+
+For PR reviews and work involving multiple agents, **consider LayerFS before creating a Git worktree**. When
+isolated workspaces are needed and the workload fits the available Linux environment, prefer separate LayerFS
+branches and mounted Workspaces from the same committed input. Give each agent its own Workspace; reuse a warm
+snapshot only when its OS, architecture, toolchain and dependencies match the task.
+
+Reuse an existing prepared LayerFS deployment first. Start with `./scripts/layerfs status` and follow
+`docs/dev/layerfs.md`; use `./scripts/layerfs prepare` when setup is needed. The script's `prepare`, `smoke` and
+`status` commands prepare and validate the deployment. Create agent
+branches and mount Workspaces through the pinned LayerFS SDK described in that guide; a smoke run is a validation
+trial, not an agent's development Workspace. Keep source changes in Git and submit them through pull requests.
+
+Use a Git worktree when a concrete constraint makes LayerFS unsuitable, such as an unavailable Docker/FUSE
+environment or a task requiring native macOS, iOS or Windows tooling. State the reason briefly and proceed without
+an extra approval checkpoint. Read-only reviews that need no isolated workspace can inspect the checkout or Git
+objects directly. Preserve the existing parallel-agent build and test limits whichever workspace mechanism is used.
+
+## Verification after changes
+
+1. `cargo test --workspace`, plus fmt and clippy as listed above (including the Catalyst target, the macOS crates, `cargo xtask clippy-android`, on Linux the Linux crates, on Windows the Windows crates; for changes in `crates/gpui` or to what it uses, its own tests and clippy there).
+2. Changes to the runtime (`nsh-js`), engine or core: run `nsh test --trace` and check item counts and timings. Changes to
+   anything apps use: `cargo xtask compat` passes, and `tests/compat/` checks the change (`docs/dev/compatibility.md`).
+3. Changes to the platform layer: launch with `nsh run`, check screenshots and simulate input where needed (the terminal needs the Screen
+   Recording and Accessibility permissions; while the screen is locked the frontmost app is `loginwindow` and clicks fail, but window
+   screenshots still work). iOS simulator: `xcrun simctl io booted screenshot`, `xcrun simctl ui booted appearance dark`.
+   Android: `adb exec-out screencap -p`, `adb shell input tap|swipe|text|keyevent` (all work with the screen locked).
+   The desktops: `nsh test <entry> --target macos|linux|windows|gpui` with steps on standard input
+   (`await app.screenshot("a.png"); await app.press("label:Plan")`) opens the app in the platform's window, acts with
+   its input at the views the selectors name and takes screenshots, without touching the screen; the app's tests run
+   there the same way (`docs/dev/tooling.md` "On a real platform"). Linux: under Xvfb (`xvfb-run -a`) on a machine
+   without a display (`docs/dev/linux.md`). GPUI on Linux: on a rootful Xwayland display of its own started with
+   `-shm` (`DISPLAY=:N`, `WEBKIT_DISABLE_DMABUF_RENDERER=1` for web views); screenshots are read from the X server
+   (`docs/dev/gpui.md`).
+   Terminal: `nsh-tui-host --bundle … --size 120x40 --script "wait 300; shot screen.txt; key Tab; type 你好; quit"`
+   renders in memory and saves UTF-8 text; coordinates and resize dimensions use cells (`docs/dev/tui.md`).
diff --git a/third-party/nsh/CLAUDE.md b/third-party/nsh/CLAUDE.md
new file mode 100644
index 0000000000..43c994c2d3
--- /dev/null
+++ b/third-party/nsh/CLAUDE.md
@@ -0,0 +1 @@
+@AGENTS.md
diff --git a/third-party/nsh/CONTRIBUTING.md b/third-party/nsh/CONTRIBUTING.md
new file mode 100644
index 0000000000..0023227025
--- /dev/null
+++ b/third-party/nsh/CONTRIBUTING.md
@@ -0,0 +1,189 @@
+# Contributing Guide
+
+Contributions are welcome. If you find a bug or have an idea, please open an issue or submit a pull request.
+
+Please write clean code that follows the style and organization of the existing code, and make sure all tests pass.
+
+Please submit **one PR that does one thing**. It makes your change easier to review and faster to merge.
+
+Before writing code, read [AGENTS.md](AGENTS.md) (the project rules, commands and conventions) and the page of
+[docs/dev](docs/dev/README.md) for the area you change.
+
+## NSH and React Native
+
+NSH has a design of its own, and React Native is a reference for which capabilities a mobile UI framework
+needs, not an API to be compatible with: names follow React Native where the behavior is the same, and differ where
+NSH's design differs (SolidJS instead of React, Tailwind classes resolved natively, primitives instead of
+platform-styled widgets). A change that only adds React Native compatibility, such as a wrapper or an alias, is not
+accepted.
+
+The runtime (`nsh`, `nsh/<module>`) provides primitives and capabilities, and `nsh/base` the unstyled foundation of
+an app's UI (navigation, safe areas, system dialogs, the keyboard, the status bar); the look of an app is the app's
+own, drawn from those primitives or with Rust components in the app's crate. See "Where new things go" in [docs/dev/js-modules.md](docs/dev/js-modules.md).
+
+## AI-Assisted Contributions
+
+NSH fully embraces AI-assisted development. We welcome contributions written with AI, including pull requests where
+100% of the code was generated by AI.
+
+What matters is not who wrote the code, but whether the change is thoughtful, focused, and well validated. The
+contributor is always responsible for the final result.
+
+Before opening a pull request, please make sure that:
+
+- The problem is real and the change is necessary.
+- The API and implementation follow the existing patterns of NSH, and the rules in [AGENTS.md](AGENTS.md).
+- The code has been reviewed by you and properly tested: tests at the layer that owns the behavior, `nsh test --trace` for
+  the JS runtime, engine and core, and a run on a simulator, emulator or device for platform code (screenshots or
+  recordings are encouraged for UI changes).
+- A pull request focuses on one thing and keeps the diff as small as practical. When using AI, ask it to avoid
+  unrelated refactors, cleanup, or formatting. **Less is better.**
+
+### Describe public API changes
+
+A pull request that adds, changes or removes anything public — a Rust type or function, a JS export, a host element,
+a prop, a style key, a Tailwind utility or variant, an `nsh.json` key, a CLI command or flag, a Swift or Java API of
+the SDKs — lists it in the description under a `## Public API` section, grouped by crate or module, with the
+signature as a reviewer would read it in the docs. Say what each item is for in one line; a name alone is not enough.
+The reviewer should be able to judge the API from the description without reading the diff.
+
+Changes to existing public items go under `## Breaking Changes` with a `diff` block showing the old and the new
+usage, even when the old form still works. Additive changes are not breaking, but they are still listed.
+
+What apps use — JS exports, `nsh:rt`, globals, elements, props, events, style keys, Tailwind utilities, their
+declarations and behavior — is never broken once a release shipped it: apps built for an earlier compatible release
+keep running unchanged ([docs/dev/compatibility.md](docs/dev/compatibility.md)). Such a change adds and deprecates
+instead of removing. Releases are recorded in [nsh-compat](https://github.com/longbridge/nsh-compat), and
+`cargo xtask compat` holds a checkout to them; a new API comes with a case in `tests/compat/` whose script checks it.
+
+Well-prepared pull requests are easier for us to review and may be merged very quickly. If a contribution is already
+in good shape, maintainers may directly help polish small details and move it forward.
+
+Issues are always welcome, but when practical, we encourage you to try a fix and open a pull request. Concrete code
+often communicates a problem more efficiently than a long discussion. A pull request is still subject to review and
+is not a guarantee that the proposed change will be accepted.
+
+## Commits and pull requests
+
+Commit subjects and pull request titles name the area first, then say what changed as an imperative sentence:
+
+```
+<area>: <What the change does>
+```
+
+- The area is the part of NSH the change is about, in lower case: a crate without its `nsh-` prefix (`core`,
+  `animation`, `js`, `engine`, `package`, `bundler`, `dev`, `cli`, `xtask`, `base`), a platform (`ios`, `android`, `macos`,
+  `windows`, `linux`), a JS layer or module (`runtime`, `list`, `animated`, `navigation`), or `tailwind`, `text`, `docs`, `examples`, `gallery`, `ci`. A change to all the desktop
+  backends (macOS, Windows and Linux) is `desktop`, one to both mobile platforms (iOS and Android) is `mobile`. Name
+  one area only, never several separated by commas: when a change spans several, look at it as a whole and name the
+  part it is mostly about. A feature the core adds and the platforms carry out is `core`, not `core, desktop`; a
+  change everywhere names its subject (`signed packages: …`).
+- The sentence starts with a capital letter, uses the imperative mood, has no trailing period and fits in about 72
+  characters with its area. It says what the change does for a user of NSH, not which files moved: `list: Keep the
+  visible rows in place when items are inserted above them`, not `list: Update list.rs`.
+- Do not use conventional prefixes (`fix:`, `feat:`, `chore:`). Pull requests are squash merged and GitHub appends
+  their number: `tailwind: Make flex a row as in CSS (#12)`.
+- The body (optional for small changes) explains why, wrapped at 72 columns: the problem, the approach and what it
+  costs. A change to a hot path includes its before / after `nsh test --trace` numbers.
+
+Examples:
+
+```
+tailwind: Make flex a row and block use block layout, as in CSS
+list: Keep the visible rows in place when items are inserted above them
+mobile: Answer the back gesture from popOnBack without asking JS
+desktop: Keep the keyboard focus inside the newest dialog
+cli: Add `nsh package --target ios` for signed .ipa files
+docs: Describe the capability checks of fetch redirects
+```
+
+## Development and Testing
+
+### Merge queue
+
+Pull requests targeting `main` use GitHub's merge queue. Once the required checks pass, select **Merge when
+ready** to join the queue. The queue checks the combined commit against the current `main` and preceding
+entries, then squash merges it. A failing check removes the entry; fix the failure and enqueue it again.
+
+### System dependencies
+
+- Rust through rustup: `rust-toolchain.toml` selects stable and installs the iOS and Android targets. A nightly
+  toolchain for `cargo +nightly fmt`.
+- Xcode, for the iOS, simulator and Mac Catalyst targets.
+- For Linux: the GTK 4 (4.14 or later) development packages (`libgtk-4-dev`, `gtk4`,
+  `gtk4-devel`), WebKitGTK 6.0's for web views (`libwebkitgtk-6.0-dev`, `webkitgtk-6.0`,
+  `webkitgtk6.0-devel`; the Linux hosts build with them by default) and clang.
+- For Windows (10 1809 or later): Visual Studio Build Tools with the C++ workload and the Windows SDK, and LLVM
+  (libclang, for QuickJS' bindings; found in `C:\Program Files\LLVM`, else set `LIBCLANG_PATH`). If rustc overflows
+  its stack on the `windows` crate, set `RUST_MIN_STACK=268435456`.
+- For Android: the Android SDK (`ANDROID_HOME`, or `~/Library/Android/sdk`; `%LOCALAPPDATA%\Android\Sdk` on Windows) with platform 35 and build tools, an NDK
+  (set `ANDROID_NDK_HOME` if the newest one installed is incomplete) and a JDK.
+
+### Checks
+
+Run these before opening a pull request (the full list is in [AGENTS.md](AGENTS.md)):
+
+```sh
+cargo test --workspace
+cargo +nightly fmt --all
+cargo clippy --workspace --all-targets
+cargo clippy -p nsh-platform-ios -p nsh-ios-host -p nsh-ios-app --target aarch64-apple-ios-macabi --features nsh-platform-ios/embed,nsh-platform-ios/dev
+cargo xtask clippy-android
+cargo clippy -p nsh-platform-linux -p nsh-linux-host -p nsh-linux-app --all-targets   # on Linux
+cargo clippy -p nsh-platform-windows -p nsh-windows-host -p nsh-windows-app --all-targets   # on Windows
+```
+
+`nsh-platform-ios` and `nsh-platform-android` are empty crates on a macOS host, and the Linux and Windows crates are
+empty off their systems, so platform code is only checked by the platform-specific clippy runs above.
+
+### Run the examples
+
+`examples/gallery` has a demo for every area of NSH. If you change an existing feature, run the related demo on the
+platforms it touches. `cargo run` runs the gallery on the machine's own desktop backend (an AppKit window on macOS, a GTK window on Linux, a Win32 window on Windows): it builds
+the CLI and the development host, reloads JS and TSX in place, and rebuilds and restarts the app whenever Rust code
+under `crates/` changes (components and modules are Rust and live in the host). Ctrl-C stops it.
+
+```sh
+cargo run                                      # the gallery in an AppKit (macOS), GTK (Linux) or Win32 (Windows) window
+cargo run -- examples/counter                  # another app: its directory (App.tsx is the entry) or entry module
+cargo run -- --target catalyst                 # in the Mac Catalyst window (UIKit, phone-style)
+cargo run -- --target ios                      # in an iOS simulator
+cargo run -- --target android                  # on an Android device or emulator
+```
+
+`nsh run` itself works too; in a checkout it builds the host it needs first:
+
+```sh
+cargo build -p nsh-cli
+./target/debug/nsh run examples/gallery                    # Mac Catalyst window
+./target/debug/nsh run examples/gallery --target ios       # iOS simulator
+./target/debug/nsh run examples/gallery --target android   # emulator or device
+./target/debug/nsh run examples/gallery --target linux     # GTK window (the default on Linux)
+./target/debug/nsh run examples/gallery --target windows   # Win32 window (the default on Windows)
+```
+
+### Reviewing UI and platform changes
+
+When reviewing a UI or platform change, check whether the tests and the description cover the behavior the pull
+request claims, including its states and edge cases, on both iOS and Android. If coverage is missing, describe the
+specific gap. Ask for a manual check only for what automated tests cannot exercise, and name the scenario and the
+platform: input methods, the software keyboard, VoiceOver / TalkBack, gestures, system dialogs and platform-specific
+rendering are typical examples.
+
+## Performance
+
+Performance is NSH's first priority (the rules are in [AGENTS.md](AGENTS.md)). A change to a hot path (the JS
+runtime, the op buffer, the core, layout, text, lists, mounting) comes with before / after `nsh test --trace` timings and
+mount item counts, compared with the baselines in [docs/dev/performance.md](docs/dev/performance.md); update the
+baselines when they move.
+
+```sh
+./target/debug/nsh test examples/counter/App.tsx --trace
+cargo build --release -p nsh-cli
+echo 'await app.scroll("id:photos", 3000)' | ./target/release/nsh test examples/gallery/Bench.tsx --trace
+cargo test --release -p nsh-engine --test list_bench -- --ignored --nocapture
+```
+
+Single-frame timings depend on the CPU's clock state; judge optimizations by the back-to-back and flushed-cache
+numbers of `list_bench` (see the performance page). On devices, profile with Instruments (iOS) or the Android Studio
+profiler.
diff --git a/third-party/nsh/Cargo.lock b/third-party/nsh/Cargo.lock
new file mode 100644
index 0000000000..4677a2e449
--- /dev/null
+++ b/third-party/nsh/Cargo.lock
@@ -0,0 +1,8183 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "adler2"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
+
+[[package]]
+name = "aead"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1973cfbc1a2daf9cf550e74e1f088c28e7f7d8c1e1418fb6c9dc5184b7e84c99"
+dependencies = [
+ "crypto-common 0.2.2",
+ "inout",
+]
+
+[[package]]
+name = "aes"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "35f0f96ce78e38c3dc6d8948aa8163d06385be74000f3c7a95bf1eef35d3ea32"
+dependencies = [
+ "cipher",
+ "cpubits",
+ "cpufeatures 0.3.1",
+]
+
+[[package]]
+name = "aes-gcm"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f2b8006a0c83f52b62ba44a97b58bf76fe2f70a329e588f67f89691d93d498f"
+dependencies = [
+ "aead",
+ "cipher",
+ "ctr",
+ "ctutils",
+ "ghash",
+]
+
+[[package]]
+name = "aes-kw"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41ac571010bd60765c56085a4f1d412012a9be2663b1a2f2b19b49318653fd0d"
+dependencies = [
+ "aes",
+ "const-oid 0.10.2",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "1.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "alloc-no-stdlib"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2fb6cfd47bf496ff64095c20eaba0c201404ee38714d4142fcfa1dc334fcc7a"
+
+[[package]]
+name = "alloc-stdlib"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b5c1865780388bfa186411ab5f247819487fc4864c6e9c3106611fa347586e1"
+dependencies = [
+ "alloc-no-stdlib",
+]
+
+[[package]]
+name = "allocator-api2"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
+
+[[package]]
+name = "ambient-authority"
+version = "0.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b"
+
+[[package]]
+name = "anstream"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "is_terminal_polyfill",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
+
+[[package]]
+name = "anstyle-parse"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
+dependencies = [
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "3.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
+dependencies = [
+ "anstyle",
+ "once_cell_polyfill",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.104"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470"
+
+[[package]]
+name = "append-only-vec"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2114736faba96bcd79595c700d03183f61357b9fbce14852515e59f3bee4ed4a"
+
+[[package]]
+name = "approx"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "arcstr"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03918c3dbd7701a85c6b9887732e2921175f26c350b4563841d0958c21d57e6d"
+
+[[package]]
+name = "arrayref"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb"
+
+[[package]]
+name = "arrayvec"
+version = "0.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56"
+
+[[package]]
+name = "async-lock"
+version = "3.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311"
+dependencies = [
+ "event-listener",
+ "event-listener-strategy",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "async-scoped"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4042078ea593edffc452eef14e99fdb2b120caa4ad9618bcdeabc4a023b98740"
+dependencies = [
+ "futures",
+ "pin-project",
+ "tokio",
+]
+
+[[package]]
+name = "atomic-waker"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
+
+[[package]]
+name = "autocfg"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
+
+[[package]]
+name = "axum"
+version = "0.8.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90"
+dependencies = [
+ "axum-core",
+ "base64 0.22.1",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "http-body-util",
+ "hyper",
+ "hyper-util",
+ "itoa",
+ "matchit",
+ "memchr",
+ "mime",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde_core",
+ "sha1 0.10.7",
+ "sync_wrapper",
+ "tokio",
+ "tokio-tungstenite 0.29.0",
+ "tower",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "axum-core"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "http",
+ "http-body",
+ "http-body-util",
+ "mime",
+ "pin-project-lite",
+ "sync_wrapper",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "base-encode"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a17bd29f7c70f32e9387f4d4acfa5ea7b7749ef784fb78cf382df97069337b8c"
+
+[[package]]
+name = "base16ct"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6"
+
+[[package]]
+name = "base64"
+version = "0.22.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
+
+[[package]]
+name = "base64"
+version = "0.23.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5"
+
+[[package]]
+name = "base64-simd"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195"
+dependencies = [
+ "outref",
+ "vsimd",
+]
+
+[[package]]
+name = "base64ct"
+version = "1.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
+
+[[package]]
+name = "bincode"
+version = "1.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "bindgen"
+version = "0.72.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895"
+dependencies = [
+ "bitflags 2.13.2",
+ "cexpr",
+ "clang-sys",
+ "itertools 0.13.0",
+ "log",
+ "prettyplease",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "rustc-hash",
+ "shlex 1.3.0",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "bit-set"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3"
+dependencies = [
+ "bit-vec",
+]
+
+[[package]]
+name = "bit-vec"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitflags"
+version = "2.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "bitvec"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837"
+dependencies = [
+ "funty",
+ "radium",
+ "tap",
+ "wyz",
+]
+
+[[package]]
+name = "blake3"
+version = "1.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d9e454fc11f76977dc803893aff6304ed33d6a26efae8696573bea74baa27ae"
+dependencies = [
+ "arrayvec",
+ "cc",
+ "cfg-if",
+ "constant_time_eq",
+ "cpufeatures 0.3.1",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa"
+dependencies = [
+ "hybrid-array",
+]
+
+[[package]]
+name = "block-padding"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "710f1dd022ef4e93f8a438b4ba958de7f64308434fa6a87104481645cc30068b"
+dependencies = [
+ "hybrid-array",
+]
+
+[[package]]
+name = "block2"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5"
+dependencies = [
+ "objc2",
+]
+
+[[package]]
+name = "brotli"
+version = "9.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8b851b75c23ca7873623d612fe49bd1989aeb03d08fb9432187eb253d3d4c6b"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+ "brotli-decompressor",
+]
+
+[[package]]
+name = "brotli-decompressor"
+version = "6.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "941cd9bd4ddab83cb46fa5a2d428f1c857b24ac78cb876cf7beb710840934bd7"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.20.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
+
+[[package]]
+name = "by_address"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06"
+
+[[package]]
+name = "bytecount"
+version = "0.6.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
+
+[[package]]
+name = "bytemuck"
+version = "1.25.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797"
+dependencies = [
+ "bytemuck_derive",
+]
+
+[[package]]
+name = "bytemuck_derive"
+version = "1.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a1f896587b6f2c069c73d2f0913e2d590c3990285cd2f0b6aa02b786b4c679c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "byteorder"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+
+[[package]]
+name = "byteorder-lite"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
+
+[[package]]
+name = "bytes"
+version = "1.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04"
+
+[[package]]
+name = "cairo-rs"
+version = "0.22.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df683f1d30b457964673a5541a4603208ef95ab6873d2a55871895cf310f3b56"
+dependencies = [
+ "bitflags 2.13.2",
+ "cairo-sys-rs",
+ "glib",
+ "libc",
+]
+
+[[package]]
+name = "cairo-sys-rs"
+version = "0.22.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee548131103ad8f698c6725669647b9c757b3b66992dd6a026037596417bee21"
+dependencies = [
+ "glib-sys",
+ "libc",
+ "system-deps 9.0.0",
+]
+
+[[package]]
+name = "cap-primitives"
+version = "4.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b5f74729fd2f44701d1a8eb47e906cdb3ccd9ec0f02baad85a744b791940b18"
+dependencies = [
+ "ambient-authority",
+ "fs-set-times",
+ "io-extras",
+ "io-lifetimes 3.0.1",
+ "ipnet",
+ "maybe-owned",
+ "rustix 1.1.5",
+ "rustix-linux-procfs",
+ "windows-sys 0.61.2",
+ "winx",
+]
+
+[[package]]
+name = "cap-std"
+version = "4.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1ec78e242cfa2cfe276807ac2ecc00315a6c97786977414bcd1c3963b6c91b8"
+dependencies = [
+ "cap-primitives",
+ "io-extras",
+ "io-lifetimes 3.0.1",
+ "rustix 1.1.5",
+]
+
+[[package]]
+name = "castaway"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
+dependencies = [
+ "rustversion",
+]
+
+[[package]]
+name = "cbc"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce2dc9ee5f88d11e0beb842c88b33c8a5cf0d1329c4b19494af42b07dbfe8896"
+dependencies = [
+ "cipher",
+]
+
+[[package]]
+name = "cc"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6651c9ed80effdc7db0ff72512157f901af5e3549e341e24b1dd4887d836d838"
+dependencies = [
+ "find-msvc-tools",
+ "jobserver",
+ "libc",
+ "shlex 2.0.1",
+]
+
+[[package]]
+name = "cesu8"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
+
+[[package]]
+name = "cexpr"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
+dependencies = [
+ "nom 7.1.3",
+]
+
+[[package]]
+name = "cfg-expr"
+version = "0.20.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ba9e9ec16c447027685b1f897b720e18e9a8afd00bd7332c483537e38086c9f"
+dependencies = [
+ "smallvec",
+ "target-lexicon",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600"
+
+[[package]]
+name = "chacha20"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06"
+dependencies = [
+ "cfg-if",
+ "cipher",
+ "cpufeatures 0.3.1",
+ "rand_core 0.10.1",
+]
+
+[[package]]
+name = "chacha20poly1305"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b89e1c441e926b9c82a8d023f6e1b7ae0adcfaa7d621814e4d60789bac751cb"
+dependencies = [
+ "aead",
+ "chacha20",
+ "cipher",
+ "poly1305",
+]
+
+[[package]]
+name = "cipher"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8cf2a2c93cd704877c0858356ed03480ff301ee950b43f1cbe4573b088bfa6c"
+dependencies = [
+ "block-buffer 0.12.1",
+ "crypto-common 0.2.2",
+ "inout",
+]
+
+[[package]]
+name = "clang-sys"
+version = "1.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "157a8ba7b480713b56f4c09fd13fc3e0a22a5dfab8097ba61cbc5feef950788a"
+dependencies = [
+ "glob",
+ "libc",
+ "libloading",
+]
+
+[[package]]
+name = "clap"
+version = "4.6.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946"
+dependencies = [
+ "clap_builder",
+ "clap_derive",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.6.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "clap_lex",
+ "strsim",
+]
+
+[[package]]
+name = "clap_derive"
+version = "4.6.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "clap_lex"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486"
+
+[[package]]
+name = "cmov"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a"
+
+[[package]]
+name = "cobs"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1"
+dependencies = [
+ "thiserror 2.0.21",
+]
+
+[[package]]
+name = "color_quant"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
+
+[[package]]
+name = "colorchoice"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
+
+[[package]]
+name = "combine"
+version = "4.6.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfc320937d09e6de266b31b9afb480f197d7a861be86be7cb2ea7e5d1bfffc5e"
+dependencies = [
+ "bytes",
+ "memchr",
+]
+
+[[package]]
+name = "compact_str"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9dfdd1c2274d9aa354115b09dc9a901d6c5576818cdf70d14cae2bdb47df00ab"
+dependencies = [
+ "castaway",
+ "cfg-if",
+ "itoa",
+ "rustversion",
+ "ryu",
+ "static_assertions",
+]
+
+[[package]]
+name = "compact_str"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "79fcda08c33bb58b97008b2cdada6622500e949e060f5913361763121abd2416"
+dependencies = [
+ "castaway",
+ "cfg-if",
+ "itoa",
+ "serde",
+ "static_assertions",
+ "zmij",
+]
+
+[[package]]
+name = "concurrent_lru"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7feb5cb312f774e8a24540e27206db4e890f7d488563671d24a16389cf4c2e4e"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "const-oid"
+version = "0.9.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
+
+[[package]]
+name = "const-oid"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c"
+
+[[package]]
+name = "constant_time_eq"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b"
+
+[[package]]
+name = "convert_case"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9"
+dependencies = [
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "convert_case"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1af709f1f33454bf52eadfc8c78b3b9ef9cb26fb54d16dc9cd9a7299f899fd1b"
+dependencies = [
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "core_maths"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30"
+dependencies = [
+ "libm",
+]
+
+[[package]]
+name = "cow-utils"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "417bef24afe1460300965a25ff4a24b8b45ad011948302ec221e8a0a81eb2c79"
+
+[[package]]
+name = "cpubits"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06ae"
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "cpufeatures"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc32c"
+version = "0.6.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a47af21622d091a8f0fb295b88bc886ac74efcc613efc19f5d0b21de5c89e47"
+dependencies = [
+ "rustc_version",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "98b0cc327b5bc766e7fda9c9260cc0fa81b43a8e240440422dff70788e3f9ef1"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a"
+dependencies = [
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6"
+
+[[package]]
+name = "crossterm"
+version = "0.29.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b"
+dependencies = [
+ "bitflags 2.13.2",
+ "crossterm_winapi",
+ "derive_more",
+ "document-features",
+ "futures-core",
+ "mio",
+ "parking_lot",
+ "rustix 1.1.5",
+ "signal-hook",
+ "signal-hook-mio",
+ "winapi",
+]
+
+[[package]]
+name = "crossterm_winapi"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "crunchy"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
+
+[[package]]
+name = "crypto-bigint"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a52aa3fcda4e6302a9f48734f234d35d4721b96f8fe07d073f07ce9df4f0271"
+dependencies = [
+ "cpubits",
+ "ctutils",
+ "hybrid-array",
+ "num-traits",
+ "rand_core 0.10.1",
+ "serdect",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "crypto-common"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "crypto-common"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453"
+dependencies = [
+ "hybrid-array",
+ "rand_core 0.10.1",
+]
+
+[[package]]
+name = "crypto-primes"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3633a51a39c69ebbaa4feaa694bd83d241e4093901c84a0963b19d9bb3f0cf8f"
+dependencies = [
+ "crypto-bigint",
+ "rand_core 0.10.1",
+]
+
+[[package]]
+name = "cshake"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6250a2d96a09edbe8e75ed29c87d05512ee2cbb24c7e8c684657f7930ffd3c6"
+dependencies = [
+ "digest 0.11.3",
+ "keccak",
+ "sponge-cursor",
+]
+
+[[package]]
+name = "ctr"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baaca1c4b237092596f64d571e9db6ce4109c4ef9742e27590f1709594461f21"
+dependencies = [
+ "cipher",
+]
+
+[[package]]
+name = "ctutils"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03bb0e1cc970d482d121d9a1744999169b69a07470b3d644a7894e53fcaf4574"
+dependencies = [
+ "cmov",
+ "subtle",
+]
+
+[[package]]
+name = "curve25519-dalek"
+version = "4.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be"
+dependencies = [
+ "cfg-if",
+ "cpufeatures 0.2.17",
+ "curve25519-dalek-derive",
+ "digest 0.10.7",
+ "fiat-crypto 0.2.9",
+ "rustc_version",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "curve25519-dalek"
+version = "5.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5eed333089e2e1c1ac8c6c0398e5e2497b4c9926ca6d0365ed1e099afa5bc23"
+dependencies = [
+ "cfg-if",
+ "cpufeatures 0.3.1",
+ "curve25519-dalek-derive",
+ "digest 0.11.3",
+ "fiat-crypto 0.3.0",
+ "rand_core 0.10.1",
+ "rustc_version",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "curve25519-dalek-derive"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "darling"
+version = "0.24.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec"
+dependencies = [
+ "darling_core",
+ "darling_macro",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.24.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff"
+dependencies = [
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.24.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785"
+dependencies = [
+ "darling_core",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "dashmap"
+version = "6.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+ "hashbrown 0.14.5",
+ "lock_api",
+ "once_cell",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "data-encoding"
+version = "2.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06"
+
+[[package]]
+name = "data-url"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376"
+
+[[package]]
+name = "defmt"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4a0795ac740cb54d7b3775c9c17345f6aaecf884c01733b39d6017738e0e3e1"
+dependencies = [
+ "bitflags 1.3.2",
+ "defmt-macros",
+]
+
+[[package]]
+name = "defmt-macros"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "840bb056bd99c495c9188198a258ab787c79f306d864db3e6e8451442d6d8366"
+dependencies = [
+ "defmt-parser",
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "defmt-parser"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71958f69fb2de856c5dd51ac9377e986ca1aa5919f931bf5395a807277f889a0"
+dependencies = [
+ "thiserror 2.0.21",
+]
+
+[[package]]
+name = "der"
+version = "0.7.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb"
+dependencies = [
+ "const-oid 0.9.6",
+ "zeroize",
+]
+
+[[package]]
+name = "der"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a878c850e9e421b20262e9b41f9c860e4785fa07541c266b62ff9d1ef998a80a"
+dependencies = [
+ "const-oid 0.10.2",
+ "der_derive",
+ "pem-rfc7468",
+ "zeroize",
+]
+
+[[package]]
+name = "der_derive"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59600e2c2d636fde9b65e99cc6445ac770c63d3628195ff39932b8d6d7409903"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "deranged"
+version = "0.5.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e9de72ce2ad1f90dc62fa25f0f430ef85eb4b0d8fa0be4f30373bc40a21d28e"
+
+[[package]]
+name = "derive_more"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134"
+dependencies = [
+ "derive_more-impl",
+]
+
+[[package]]
+name = "derive_more-impl"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb"
+dependencies = [
+ "convert_case 0.10.0",
+ "proc-macro2",
+ "quote",
+ "rustc_version",
+ "syn 2.0.119",
+ "unicode-xid",
+]
+
+[[package]]
+name = "digest"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer 0.10.4",
+ "crypto-common 0.1.7",
+]
+
+[[package]]
+name = "digest"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2"
+dependencies = [
+ "block-buffer 0.12.1",
+ "const-oid 0.10.2",
+ "crypto-common 0.2.2",
+ "ctutils",
+]
+
+[[package]]
+name = "dispatch2"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38"
+dependencies = [
+ "bitflags 2.13.2",
+ "block2",
+ "libc",
+ "objc2",
+]
+
+[[package]]
+name = "displaydoc"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "document-features"
+version = "0.2.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61"
+dependencies = [
+ "litrs",
+]
+
+[[package]]
+name = "dragonbox_ecma"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd8e701084c37e7ef62d3f9e453b618130cbc0ef3573847785952a3ac3f746bf"
+
+[[package]]
+name = "dunce"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
+
+[[package]]
+name = "ecdsa"
+version = "0.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0681a4fc24c767085329728d8dfba959af91228aa4610cca4f8ce317ba46ae0"
+dependencies = [
+ "der 0.8.2",
+ "digest 0.11.3",
+ "elliptic-curve",
+ "rfc6979",
+ "signature 3.0.0",
+ "spki 0.8.1",
+ "zeroize",
+]
+
+[[package]]
+name = "ed25519"
+version = "2.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53"
+dependencies = [
+ "pkcs8 0.10.2",
+ "signature 2.2.0",
+]
+
+[[package]]
+name = "ed25519"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29fcf32e6c73d1079f83ab4d782de2d81620346a5f38c6237a86a22f8368980a"
+dependencies = [
+ "pkcs8 0.11.0",
+ "signature 3.0.0",
+]
+
+[[package]]
+name = "ed25519-dalek"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9"
+dependencies = [
+ "curve25519-dalek 4.1.3",
+ "ed25519 2.2.3",
+ "serde",
+ "sha2 0.10.9",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "ed25519-dalek"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ebaa1a2bf1290ab3bfe5a7b771d050ebffab2711c19a81691c683a5144a25de"
+dependencies = [
+ "curve25519-dalek 5.0.0",
+ "ed25519 3.0.0",
+ "rand_core 0.10.1",
+ "serde",
+ "sha2 0.11.1",
+ "signature 3.0.0",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "either"
+version = "1.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be"
+
+[[package]]
+name = "elliptic-curve"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d65aa39b3a5c1c9c1b745c9a019234bb7a21b77abcb4f4d266d706e2d577d65"
+dependencies = [
+ "base16ct",
+ "crypto-bigint",
+ "crypto-common 0.2.2",
+ "digest 0.11.3",
+ "ff",
+ "group",
+ "hkdf",
+ "hybrid-array",
+ "pkcs8 0.11.0",
+ "rand_core 0.10.1",
+ "sec1",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "embedded-io"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced"
+
+[[package]]
+name = "embedded-io"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d"
+
+[[package]]
+name = "endian-type"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "869b0adbda23651a9c5c0c3d270aac9fcb52e8622a8f2b17e57802d7791962f2"
+
+[[package]]
+name = "env_filter"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "900d271a03799a1ee8d1ca9b19893b48ca674a9284fefcfb85f05e74ed314217"
+dependencies = [
+ "log",
+ "regex",
+]
+
+[[package]]
+name = "env_logger"
+version = "0.11.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de671bd27a75a797dc9ae289ba1e77276e75e2026408aab65185384e2d5cd3f6"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "env_filter",
+ "jiff",
+ "log",
+]
+
+[[package]]
+name = "equivalent"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826"
+
+[[package]]
+name = "errno"
+version = "0.3.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
+dependencies = [
+ "libc",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "escape-simd"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "120339709b24832c07464b0838828361b735d793c409b8ca3147db0dae601542"
+
+[[package]]
+name = "euclid"
+version = "0.22.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "event-listener"
+version = "5.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2"
+dependencies = [
+ "pin-project-lite",
+]
+
+[[package]]
+name = "event-listener-strategy"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93"
+dependencies = [
+ "event-listener",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "example-embed-gpui"
+version = "0.2.0"
+
+[[package]]
+name = "fancy-regex"
+version = "0.16.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f"
+dependencies = [
+ "bit-set",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "fast-glob"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a044ed96eb57253e806d08b74260638af189687e583f04947a5e11e75e0b0d1"
+dependencies = [
+ "arrayvec",
+]
+
+[[package]]
+name = "fastrand"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223"
+
+[[package]]
+name = "fdeflate"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c"
+dependencies = [
+ "simd-adler32",
+]
+
+[[package]]
+name = "ff"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1f686ab92a9fb0eaf188f6c6c87b89490baa6fdb0db4544ba4dc47f7942489f"
+dependencies = [
+ "rand_core 0.10.1",
+ "subtle",
+]
+
+[[package]]
+name = "fiat-crypto"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d"
+
+[[package]]
+name = "fiat-crypto"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24"
+
+[[package]]
+name = "field-offset"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f"
+dependencies = [
+ "memoffset",
+ "rustc_version",
+]
+
+[[package]]
+name = "filetime"
+version = "0.2.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759"
+dependencies = [
+ "cfg-if",
+ "libc",
+]
+
+[[package]]
+name = "find-msvc-tools"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484"
+
+[[package]]
+name = "fixedbitset"
+version = "0.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99"
+
+[[package]]
+name = "flate2"
+version = "1.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide 0.9.1",
+ "zlib-rs",
+]
+
+[[package]]
+name = "float-cmp"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
+
+[[package]]
+name = "float-cmp"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "foldhash"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
+
+[[package]]
+name = "foldhash"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
+
+[[package]]
+name = "fontconfig-parser"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646"
+dependencies = [
+ "roxmltree 0.20.0",
+]
+
+[[package]]
+name = "fontdb"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905"
+dependencies = [
+ "fontconfig-parser",
+ "log",
+ "slotmap",
+ "tinyvec",
+ "ttf-parser",
+]
+
+[[package]]
+name = "form_urlencoded"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "fs-set-times"
+version = "0.20.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a"
+dependencies = [
+ "io-lifetimes 2.0.4",
+ "rustix 1.1.5",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "fsevent-sys"
+version = "4.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "funty"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
+
+[[package]]
+name = "futf"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843"
+dependencies = [
+ "mac",
+ "new_debug_unreachable",
+]
+
+[[package]]
+name = "futures"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d"
+
+[[package]]
+name = "futures-task"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd"
+
+[[package]]
+name = "futures-util"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "slab",
+]
+
+[[package]]
+name = "gallery-native"
+version = "0.2.0"
+dependencies = [
+ "env_logger",
+ "log",
+ "nsh-base",
+ "nsh-core",
+ "nsh-platform-linux",
+ "nsh-platform-macos",
+ "nsh-platform-windows",
+ "serde_json",
+]
+
+[[package]]
+name = "gdk-pixbuf"
+version = "0.22.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25f420376dbee041b2db374ce4573892a36222bb3f6c0c43e24f0d67eae9b646"
+dependencies = [
+ "gdk-pixbuf-sys",
+ "gio",
+ "glib",
+ "libc",
+]
+
+[[package]]
+name = "gdk-pixbuf-sys"
+version = "0.22.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d5209294ba3775f9b650bf78bfadeba4332089f2329b3e2f6ce0a4957a45bff"
+dependencies = [
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps 9.0.0",
+]
+
+[[package]]
+name = "gdk4"
+version = "0.11.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e77c579bac9eff8b84c0625d5f533da6d69988c063062fe92c2e955ede8f28eb"
+dependencies = [
+ "cairo-rs",
+ "gdk-pixbuf",
+ "gdk4-sys",
+ "gio",
+ "glib",
+ "libc",
+ "pango",
+]
+
+[[package]]
+name = "gdk4-sys"
+version = "0.11.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3eff6238a30c1f198fb3c8d3d445fa7faf211d11d9075af0772e6e0ca32ae001"
+dependencies = [
+ "cairo-sys-rs",
+ "gdk-pixbuf-sys",
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "pango-sys",
+ "pkg-config",
+ "system-deps 9.0.0",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "r-efi 5.3.0",
+ "wasip2",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "r-efi 6.0.0",
+ "rand_core 0.10.1",
+]
+
+[[package]]
+name = "ghash"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2eecf2d5dc9b66b732b97707a0210906b1d30523eb773193ab777c0c84b3e8d5"
+dependencies = [
+ "polyval",
+]
+
+[[package]]
+name = "gif"
+version = "0.14.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159"
+dependencies = [
+ "color_quant",
+ "weezl",
+]
+
+[[package]]
+name = "gio"
+version = "0.22.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4620fbafdf19dba814473e19f18e75290cb3338662f6ae35f0402affd3b2b699"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-util",
+ "gio-sys",
+ "glib",
+ "libc",
+ "pin-project-lite",
+ "smallvec",
+]
+
+[[package]]
+name = "gio-sys"
+version = "0.22.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c28739f914c15b87a9856000bed9cbd5b3a8afbca5e982d9a299e1601422cb5"
+dependencies = [
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps 9.0.0",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "glib"
+version = "0.22.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4cf9e5bd8713f1990a92c422998826e0fb34824277b46bc59757373483c6694"
+dependencies = [
+ "bitflags 2.13.2",
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-task",
+ "futures-util",
+ "gio-sys",
+ "glib-macros",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "memchr",
+ "smallvec",
+]
+
+[[package]]
+name = "glib-macros"
+version = "0.22.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c9597c68fa7bdf4154a3079642cd21c4dccac0b0bdd2897d82861523bf91e7b9"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "glib-sys"
+version = "0.22.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99b38907e67e40dec9b60f858bcada952598719cb512a13eb13d6cdcd16f8295"
+dependencies = [
+ "libc",
+ "system-deps 9.0.0",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b"
+
+[[package]]
+name = "gobject-sys"
+version = "0.22.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07595c9ba696bd9819cb6a8df39f08078f3dd679508fe052dd558492c2053834"
+dependencies = [
+ "glib-sys",
+ "libc",
+ "system-deps 9.0.0",
+]
+
+[[package]]
+name = "graphene-rs"
+version = "0.22.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb856b9c558971c3f13ab692358926da710b046932a4e087aedcc35b040d7dff"
+dependencies = [
+ "glib",
+ "graphene-sys",
+]
+
+[[package]]
+name = "graphene-sys"
+version = "0.22.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97842c7543828f98aa5583aa54fcda28aa84fa2b0f8c556142177f7bbb638057"
+dependencies = [
+ "glib-sys",
+ "libc",
+ "system-deps 9.0.0",
+]
+
+[[package]]
+name = "group"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fd1a1c7a5206c5b7a3f5a0d7ccd3ff85d0c8f5133d62a02680255b0004af5f4"
+dependencies = [
+ "ff",
+ "rand_core 0.10.1",
+ "subtle",
+]
+
+[[package]]
+name = "gsk4"
+version = "0.11.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eee23d7425c5281ec5a2f40f7b69384aac66c15861d990d248e9d9c9368be464"
+dependencies = [
+ "cairo-rs",
+ "gdk4",
+ "glib",
+ "graphene-rs",
+ "gsk4-sys",
+ "libc",
+ "pango",
+]
+
+[[package]]
+name = "gsk4-sys"
+version = "0.11.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "27900c92e47df410bbe43b51818104051e3409da43fb88547a41c0bafddfd39c"
+dependencies = [
+ "cairo-sys-rs",
+ "gdk4-sys",
+ "glib-sys",
+ "gobject-sys",
+ "graphene-sys",
+ "libc",
+ "pango-sys",
+ "system-deps 9.0.0",
+]
+
+[[package]]
+name = "gtk4"
+version = "0.11.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0f8226c94dd0b65ba2e8fcd8ff402d380e890f6e5a6488e652a0158e827b9bf"
+dependencies = [
+ "cairo-rs",
+ "field-offset",
+ "futures-channel",
+ "gdk-pixbuf",
+ "gdk4",
+ "gio",
+ "glib",
+ "graphene-rs",
+ "gsk4",
+ "gtk4-macros",
+ "gtk4-sys",
+ "libc",
+ "pango",
+]
+
+[[package]]
+name = "gtk4-macros"
+version = "0.11.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb906c98f0b4cc9002594e337e83f40492aa6dca22c97242f13be5b046c5f338"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "gtk4-sys"
+version = "0.11.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd14af0137f269bdecee73404157d2a852f9651af7d68bd1023d3b8b914a14c3"
+dependencies = [
+ "cairo-sys-rs",
+ "gdk-pixbuf-sys",
+ "gdk4-sys",
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "graphene-sys",
+ "gsk4-sys",
+ "libc",
+ "pango-sys",
+ "system-deps 9.0.0",
+]
+
+[[package]]
+name = "half"
+version = "2.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b"
+dependencies = [
+ "cfg-if",
+ "crunchy",
+ "zerocopy",
+]
+
+[[package]]
+name = "halfbrown"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c7ed2f2edad8a14c8186b847909a41fbb9c3eafa44f88bd891114ed5019da09"
+dependencies = [
+ "hashbrown 0.16.1",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.14.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
+
+[[package]]
+name = "hashbrown"
+version = "0.15.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
+dependencies = [
+ "foldhash 0.1.5",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.16.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
+dependencies = [
+ "allocator-api2",
+ "equivalent",
+ "foldhash 0.2.0",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.17.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
+dependencies = [
+ "allocator-api2",
+ "equivalent",
+ "foldhash 0.2.0",
+]
+
+[[package]]
+name = "heck"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+
+[[package]]
+name = "hex-simd"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f7685beb53fc20efc2605f32f5d51e9ba18b8ef237961d1760169d2290d3bee"
+dependencies = [
+ "outref",
+ "vsimd",
+]
+
+[[package]]
+name = "hkdf"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4aaa26c720c68b866f2c96ef5c1264b3e6f473fe5d4ce61cd44bbe913e553018"
+dependencies = [
+ "hmac",
+]
+
+[[package]]
+name = "hmac"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f"
+dependencies = [
+ "digest 0.11.3",
+]
+
+[[package]]
+name = "hmac-sha1-compact"
+version = "1.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ed9b23855291da44e7e84616e19dc0d969c3580e14ffa6b759f28775e26afc1"
+
+[[package]]
+name = "html5ever"
+version = "0.27.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c13771afe0e6e846f1e67d038d4cb29998a6779f93c809212e4e9c32efd244d4"
+dependencies = [
+ "log",
+ "mac",
+ "markup5ever",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "http"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0"
+dependencies = [
+ "bytes",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c"
+dependencies = [
+ "bytes",
+ "http",
+]
+
+[[package]]
+name = "http-body-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "http",
+ "http-body",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
+
+[[package]]
+name = "httpdate"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
+
+[[package]]
+name = "hybrid-array"
+version = "0.4.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17"
+dependencies = [
+ "subtle",
+ "typenum",
+ "zeroize",
+]
+
+[[package]]
+name = "hyper"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c3e324da4c95177d6291d4c8730197c0d1822f8a9766814a4a44fa5ab797c9c"
+dependencies = [
+ "atomic-waker",
+ "bytes",
+ "futures-core",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "smallvec",
+ "tokio",
+]
+
+[[package]]
+name = "hyper-util"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff"
+dependencies = [
+ "bytes",
+ "http",
+ "http-body",
+ "hyper",
+ "pin-project-lite",
+ "tokio",
+ "tower-service",
+]
+
+[[package]]
+name = "icu_collections"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513"
+dependencies = [
+ "displaydoc",
+ "potential_utf",
+ "utf8_iter",
+ "yoke",
+ "zerofrom",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locale_core"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb"
+dependencies = [
+ "displaydoc",
+ "litemap",
+ "serde",
+ "tinystr",
+ "writeable",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locale_fallback"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "251af8e57c9400e3eb58242fe5b8b1152b2a64fdf4cf632f923c38ccee6f2fa9"
+dependencies = [
+ "icu_locale_core",
+ "icu_locale_fallback_data",
+ "icu_provider",
+ "potential_utf",
+ "tinystr",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locale_fallback_data"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "decf2a22ec8fa68f1a0c1129a3f8583f8f8bc24e8b9ccbe98ead99f62a4dc3a8"
+
+[[package]]
+name = "icu_normalizer"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f"
+dependencies = [
+ "icu_collections",
+ "icu_normalizer_data",
+ "icu_properties",
+ "icu_provider",
+ "smallvec",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_normalizer_data"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0"
+
+[[package]]
+name = "icu_properties"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148"
+dependencies = [
+ "displaydoc",
+ "icu_collections",
+ "icu_locale_core",
+ "icu_properties_data",
+ "icu_provider",
+ "zerotrie",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_properties_data"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa"
+
+[[package]]
+name = "icu_provider"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73"
+dependencies = [
+ "displaydoc",
+ "icu_locale_core",
+ "serde",
+ "stable_deref_trait",
+ "writeable",
+ "yoke",
+ "zerofrom",
+ "zerotrie",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_segmenter"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82d07aafccd67af15d02512a6adf5896fbc5ed00f2e99b471d2efa14016db3db"
+dependencies = [
+ "icu_collections",
+ "icu_locale_fallback",
+ "icu_provider",
+ "icu_segmenter_data",
+ "potential_utf",
+ "smallvec",
+ "utf8_iter",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_segmenter_data"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae293c039020f9ec10710af98d29ce6aa2051486638b49c9a6409f3b4a9e98ad"
+
+[[package]]
+name = "icy_sixel"
+version = "0.5.1"
+dependencies = [
+ "quantette",
+ "thiserror 2.0.21",
+]
+
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+[[package]]
+name = "idna"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
+dependencies = [
+ "idna_adapter",
+ "smallvec",
+ "utf8_iter",
+]
+
+[[package]]
+name = "idna_adapter"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714"
+dependencies = [
+ "icu_normalizer",
+ "icu_properties",
+]
+
+[[package]]
+name = "image"
+version = "0.25.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104"
+dependencies = [
+ "bytemuck",
+ "byteorder-lite",
+ "color_quant",
+ "gif",
+ "image-webp",
+ "moxcms",
+ "num-traits",
+ "png 0.18.1",
+ "zune-core",
+ "zune-jpeg",
+]
+
+[[package]]
+name = "image-webp"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3"
+dependencies = [
+ "byteorder-lite",
+ "quick-error",
+]
+
+[[package]]
+name = "imagesize"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09e54e57b4c48b40f7aec75635392b12b3421fa26fe8b4332e63138ed278459c"
+
+[[package]]
+name = "imagesize"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "65b27460c2c92b037f3f94c538ed9a3342f3fdf923606781629ccb35f82d042a"
+
+[[package]]
+name = "indexmap"
+version = "2.14.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855"
+dependencies = [
+ "equivalent",
+ "hashbrown 0.17.1",
+ "serde",
+ "serde_core",
+]
+
+[[package]]
+name = "indoc"
+version = "2.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a37b2691796cffeb8a8cd305ac66e65841559f147f4e63231d0eafa4db5384d1"
+dependencies = [
+ "rustversion",
+]
+
+[[package]]
+name = "infer"
+version = "0.22.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4200d433cbd5178df7797c9c2e75b348b728e39631cf14520d1e2fc424201f4"
+
+[[package]]
+name = "inotify"
+version = "0.11.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4cc00ea907cab49550b7da656f80ebb97be1b997d931fbcd28d39734e17ce592"
+dependencies = [
+ "bitflags 2.13.2",
+ "inotify-sys",
+ "libc",
+]
+
+[[package]]
+name = "inotify-sys"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c033f80b2c113cdf91ab7a33faa9cbc014726dcad99880c8609af2a370edf37d"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "inout"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b5cf4372d022092674a83b8febf5865f7a573cc0c5baec5e49c879b6a20978f"
+dependencies = [
+ "block-padding",
+ "hybrid-array",
+]
+
+[[package]]
+name = "instability"
+version = "0.3.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c3b5acc1e2fd9375041a388da33d1eb8aed5f7a8c0dd3543e3ea2805adfbe20"
+dependencies = [
+ "darling",
+ "indoc",
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "io-extras"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "20fd6de4ccfcc187e38bc21cfa543cb5a302cb86a8b114eb7f0bf0dc9f8ac00f"
+dependencies = [
+ "io-lifetimes 3.0.1",
+ "windows-sys 0.60.2",
+]
+
+[[package]]
+name = "io-lifetimes"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06432fb54d3be7964ecd3649233cddf80db2832f47fec34c01f65b3d9d774983"
+
+[[package]]
+name = "io-lifetimes"
+version = "3.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0fb0570afe1fed943c5c3d4102d5358592d8625fda6a0007fdbe65a92fba96"
+
+[[package]]
+name = "ipnet"
+version = "2.12.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0"
+
+[[package]]
+name = "is_terminal_polyfill"
+version = "1.70.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
+
+[[package]]
+name = "itertools"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itertools"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itertools"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
+
+[[package]]
+name = "javascriptcore6"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d8d4f64d976c6dc6068723b6ef7838acf954d56b675f376c826f7e773362ddb"
+dependencies = [
+ "glib",
+ "javascriptcore6-sys",
+ "libc",
+]
+
+[[package]]
+name = "javascriptcore6-sys"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2b9787581c8949a7061c9b8593c4d1faf4b0fe5e5643c6c7793df20dbe39cf6"
+dependencies = [
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps 7.0.8",
+]
+
+[[package]]
+name = "jiff"
+version = "0.2.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2b005715dcbeb0089a3c0dab99f2ff1cc3b2525323552703d648585d342a383"
+dependencies = [
+ "defmt",
+ "jiff-core",
+ "jiff-static",
+ "log",
+ "portable-atomic",
+ "portable-atomic-util",
+ "serde_core",
+]
+
+[[package]]
+name = "jiff-core"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e52fe76043ccecc9005d2305ebaadf7d7fc0cc89ca6baa10a94d6bc68c7128c"
+dependencies = [
+ "defmt",
+ "log",
+]
+
+[[package]]
+name = "jiff-static"
+version = "0.2.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2cc9817253cf7c7ee4684451bd327e88d6f3658014e54a29198625590650695c"
+dependencies = [
+ "jiff-core",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "jni"
+version = "0.21.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97"
+dependencies = [
+ "cesu8",
+ "cfg-if",
+ "combine",
+ "jni-sys 0.3.1",
+ "log",
+ "thiserror 1.0.69",
+ "walkdir",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "jni-sys"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258"
+dependencies = [
+ "jni-sys 0.4.1",
+]
+
+[[package]]
+name = "jni-sys"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2"
+dependencies = [
+ "jni-sys-macros",
+]
+
+[[package]]
+name = "jni-sys-macros"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264"
+dependencies = [
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "jobserver"
+version = "0.1.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3"
+dependencies = [
+ "getrandom 0.4.3",
+ "libc",
+]
+
+[[package]]
+name = "js-sys"
+version = "0.3.106"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5"
+dependencies = [
+ "cfg-if",
+ "futures-util",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "json-escape-simd"
+version = "3.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6520172708e1b08b95f31bbf76cec064db4203a615cf2fb4e1128d6dd142b033"
+dependencies = [
+ "escape-simd",
+]
+
+[[package]]
+name = "json-strip-comments"
+version = "3.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01ed659c5f428031b9c1fb7de6729af2eb491654d4bcd416a5b5b704986b9658"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "kasuari"
+version = "0.4.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72f14c90e40a6133f4805b83542a7ed7364f56070b447f56e7f4e90297122209"
+dependencies = [
+ "hashbrown 0.17.1",
+ "portable-atomic",
+ "thiserror 2.0.21",
+]
+
+[[package]]
+name = "keccak"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8f198d1db720e4940b5a493201d199d9f24f568f8f746bd13706243a2f71598"
+dependencies = [
+ "cfg-if",
+ "cpufeatures 0.3.1",
+]
+
+[[package]]
+name = "kqueue"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d763e5b24120b4ddf50de6c92308156765aabfbbccebf401da7cff2d70a41ea"
+dependencies = [
+ "kqueue-sys",
+ "libc",
+]
+
+[[package]]
+name = "kqueue-sys"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087"
+dependencies = [
+ "bitflags 2.13.2",
+ "libc",
+]
... 710079 lines suppressed ...


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@maka.apache.org
For additional commands, e-mail: commits-help@maka.apache.org