From c659dbe1ec3677f6872bd4a5f628b7bcf979c724 Mon Sep 17 00:00:00 2001 From: Charles Lowell Date: Fri, 17 Apr 2026 14:28:41 -0500 Subject: [PATCH 01/47] =?UTF-8?q?=E2=9C=A8=20add=20snapshot()=20for=20pre-?= =?UTF-8?q?packing=20directive=20subtrees?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduces a new `snapshot(ops)` constructor that pre-packs a directive array into its transfer encoding. The returned opaque `Op` can be spliced into any directive array, and during packing its bytes are copied directly into the command buffer without re-encoding. This enables higher-level frameworks to implement dirty tracking: unchanged component subtrees can reuse a cached snapshot, skipping the per-frame packing cost entirely. --- ops.ts | 53 ++++++++++++++++++++- specs/renderer-spec.md | 24 ++++++++++ test/term.test.ts | 104 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 179 insertions(+), 2 deletions(-) diff --git a/ops.ts b/ops.ts index 3344eea..9c4c6ff 100644 --- a/ops.ts +++ b/ops.ts @@ -2,6 +2,7 @@ const OP_OPEN_ELEMENT = 0x02; const OP_TEXT = 0x03; const OP_CLOSE_ELEMENT = 0x04; +const OP_SNAPSHOT = 0x05; /* Property group masks for OPEN_ELEMENT */ const PROP_LAYOUT = 0x01; @@ -176,6 +177,12 @@ export function pack( break; } + case OP_SNAPSHOT: { + new Uint8Array(mem).set(op.data, o); + o += op.data.length; + break; + } + case OP_TEXT: { view.setUint32(o, OP_TEXT, true); o += 4; @@ -281,7 +288,12 @@ export interface Text { attrs?: number; } -export type Op = OpenElement | Text | CloseElement; +interface Snapshot { + directive: typeof OP_SNAPSHOT; + data: Uint8Array; +} + +export type Op = OpenElement | Text | CloseElement | Snapshot; export function open( id: string, @@ -300,3 +312,42 @@ export function text( export function close(): CloseElement { return { directive: OP_CLOSE_ELEMENT }; } + +function packSize(ops: Op[]): number { + let n = 0; + for (let op of ops) { + switch (op.directive) { + case OP_CLOSE_ELEMENT: + n += 4; + break; + case OP_SNAPSHOT: + n += op.data.length; + break; + case OP_OPEN_ELEMENT: { + n += 4; // opcode + n += 4 + Math.ceil(encoder.encode(op.id).length / 4) * 4; // id string + n += 4; // mask + if (op.layout) n += 6 * 4 + 4 + 4 + 4; // 2 axes (3 words each) + pad + gap + align + if (op.bg !== undefined) n += 4; + if (op.cornerRadius) n += 4; + if (op.border) n += 8; + if (op.clip) n += 4; + if (op.floating) n += 16; + break; + } + case OP_TEXT: { + n += 4 + 4 + 4; // opcode + color + cfg + n += 4 + Math.ceil(encoder.encode(op.content).length / 4) * 4; // string + break; + } + } + } + return n; +} + +export function snapshot(ops: Op[]): Op { + let size = packSize(ops); + let buf = new ArrayBuffer(size); + let words = pack(ops, buf, 0, size); + return { directive: OP_SNAPSHOT, data: new Uint8Array(buf, 0, words * 4) }; +} diff --git a/specs/renderer-spec.md b/specs/renderer-spec.md index ac9c5f3..48bd3b0 100644 --- a/specs/renderer-spec.md +++ b/specs/renderer-spec.md @@ -403,6 +403,26 @@ Text directives MUST appear between a matching open/close pair. The set of styling properties accepted by `props` is part of the current implementation surface and may be extended. +#### 8.3.4 snapshot + +``` +snapshot(ops: Op[]): Op +``` + +Creates a snapshot by pre-packing the given directive array into its transfer +encoding. The returned value is an `Op` and can appear anywhere in a directive +array where the original ops would have appeared. The internal representation is +opaque. + +When the renderer encounters a snapshot during transfer, it copies the +pre-packed bytes directly into the command buffer without re-encoding. The +snapshot's ops MUST be structurally balanced (every `open` matched by a +`close`). + +Snapshots enable higher-level frameworks to implement dirty tracking: a +component whose inputs have not changed can reuse a previously created snapshot, +avoiding the cost of re-packing its subtree each frame. + ### 8.4 Sizing helpers These functions produce sizing-axis values for use in element layout @@ -459,6 +479,10 @@ that do not match a preceding open, is invalid input. Callers SHOULD validate directive arrays before rendering. The renderer's behavior when given an invalid directive array is unspecified by this specification. +A snapshot is semantically equivalent to splicing its source ops into the array +at the snapshot's position. The renderer MUST produce identical layout and +output regardless of whether ops are provided directly or via a snapshot. + ### 9.2 Transfer to the WASM module As part of the render transaction, the directive array is transferred into a diff --git a/test/term.test.ts b/test/term.test.ts index 47d8c94..adcd10a 100644 --- a/test/term.test.ts +++ b/test/term.test.ts @@ -1,6 +1,15 @@ import { beforeEach, describe, expect, it } from "./suite.ts"; import { createTerm, type Term } from "../term.ts"; -import { close, fixed, grow, open, rgba, text } from "../ops.ts"; +import { + close, + fixed, + grow, + type Op, + open, + rgba, + snapshot, + text, +} from "../ops.ts"; import { print } from "./print.ts"; const decode = (bytes: Uint8Array) => new TextDecoder().decode(bytes); @@ -191,6 +200,99 @@ describe("term", () => { }); }); + describe("snapshot", () => { + it("produces identical output to direct ops", async () => { + let ops = [ + open("root", { + layout: { width: grow(), height: grow(), direction: "ttb" }, + bg: rgba(0, 0, 128), + }), + open("child", { + layout: { + width: grow(), + padding: { left: 1 }, + direction: "ttb", + }, + border: { + color: rgba(255, 255, 255), + left: 1, + right: 1, + top: 1, + bottom: 1, + }, + }), + text("snapshot test"), + close(), + close(), + ]; + + let direct = await createTerm({ width: 40, height: 10 }); + let snapped = await createTerm({ width: 40, height: 10 }); + + let expected = direct.render(ops, { mode: "line" }).output; + let actual = snapped.render([snapshot(ops)], { mode: "line" }).output; + + expect(decode(actual)).toEqual(decode(expected)); + }); + + it("renders inside another element", async () => { + let child = snapshot([ + open("child", { + layout: { width: grow(), direction: "ttb" }, + }), + text("inner"), + close(), + ]); + + let direct = await createTerm({ width: 20, height: 5 }); + let snapped = await createTerm({ width: 20, height: 5 }); + + let wrapper = (content: Op[]) => [ + open("root", { + layout: { + width: grow(), + height: grow(), + direction: "ttb", + padding: { left: 1, top: 1 }, + }, + border: { + color: rgba(255, 255, 255), + left: 1, + right: 1, + top: 1, + bottom: 1, + }, + }), + ...content, + close(), + ]; + + let expected = direct.render( + wrapper([ + open("child", { + layout: { width: grow(), direction: "ttb" }, + }), + text("inner"), + close(), + ]), + { mode: "line" }, + ).output; + + let actual = snapped.render( + wrapper([child]), + { mode: "line" }, + ).output; + + expect(decode(actual)).toEqual(decode(expected)); + expect(trim(print(decode(actual), 20, 5))).toEqual(` +┌──────────────────┐ +│inner │ +│ │ +│ │ +└──────────────────┘`.trim()); + }); + }); + describe("row offset", () => { it("renders two frames at the offset position", async () => { let term = await createTerm({ width: 20, height: 5 }); From a44b553977e2da990e99853760585600311846bb Mon Sep 17 00:00:00 2001 From: Ryan Rauh Date: Sat, 9 May 2026 07:36:40 -0400 Subject: [PATCH 02/47] docs: add maintainer build guide --- BUILD.md | 279 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 9 +- 2 files changed, 281 insertions(+), 7 deletions(-) create mode 100644 BUILD.md diff --git a/BUILD.md b/BUILD.md new file mode 100644 index 0000000..d2ca6fd --- /dev/null +++ b/BUILD.md @@ -0,0 +1,279 @@ +# Building clayterm from source + +This guide is for maintainers and builders working on clayterm itself. + +It covers: +- cloning the repo correctly, +- initializing the `clay` git submodule, +- installing the toolchain needed to compile the C sources to WebAssembly, +- building the local development artifacts, and +- verifying that the repo is ready for development. + +It does **not** cover npm/JSR packaging or publishing. + +## What the local build produces + +The local source build is driven by `make`. + +It generates: +- `clayterm.wasm` — the compiled WebAssembly module built from the C sources +- `wasm.ts` — a generated TypeScript file derived from `clayterm.wasm` + +`wasm.ts` is generated output, not hand-maintained source. + +## Clone the repo with submodules + +The build depends on the `clay` git submodule. + +Preferred fresh clone: + +```sh +git clone --recurse-submodules https://github.com/thefrontside/clayterm.git +cd clayterm +``` + +If you already cloned without submodules: + +```sh +git submodule update --init --recursive +``` + +Quick check: + +```sh +git submodule status --recursive +``` + +You should also see a populated `clay/` directory. If `clay/` is missing or empty, fix the submodule state before building. + +## Required tools + +You need: +- `git` +- `make` +- `clang` with wasm32-capable support +- `deno` + +Equivalent packages are fine if your package manager uses different names. + +## Install the toolchain + +### macOS + +Install Apple's command line tools first. They provide the base developer tools, including `git` and `make`. + +```sh +xcode-select --install +``` + +Then install LLVM and Deno with Homebrew: + +```sh +brew install llvm deno +``` + +Use Homebrew LLVM before Apple's system `clang` when building clayterm: + +```sh +echo 'export PATH="$(brew --prefix llvm)/bin:$PATH"' >> ~/.zshrc +source ~/.zshrc +``` + +If you do not already have `git` available after installing the command line tools, install it with Homebrew: + +```sh +brew install git +``` + +### Debian / Ubuntu + +Install the build toolchain and Git: + +```sh +sudo apt-get update +sudo apt-get install -y build-essential clang lld git curl +``` + +Install Deno with the official installer: + +```sh +curl -fsSL https://deno.land/install.sh | sh +``` + +Add Deno to your shell path: + +```sh +echo 'export PATH="$HOME/.deno/bin:$PATH"' >> ~/.bashrc +source ~/.bashrc +``` + +### Fedora / RHEL + +Install the build toolchain and Git: + +```sh +sudo dnf install -y clang lld make git curl +``` + +Install Deno with the official installer: + +```sh +curl -fsSL https://deno.land/install.sh | sh +``` + +Add Deno to your shell path: + +```sh +echo 'export PATH="$HOME/.deno/bin:$PATH"' >> ~/.bashrc +source ~/.bashrc +``` + +### Windows + +The recommended Windows build-host path is **WSL2 with Ubuntu**. + +From an elevated PowerShell prompt: + +```powershell +wsl --install -d Ubuntu +``` + +Then open the Ubuntu environment and follow the **Debian / Ubuntu** instructions above. + +The build host runs inside WSL2, but the resulting WebAssembly artifacts are intended to run on **native Windows** at runtime. + +## Verify the toolchain + +Before building, confirm the required tools are available: + +```sh +git --version +make --version +clang --version +deno --version +``` + +For a quick wasm-target smoke test, make sure `clang` can compile for `wasm32`: + +```sh +clang --target=wasm32 -c -x c /dev/null -o /tmp/clayterm-wasm-test.o +rm -f /tmp/clayterm-wasm-test.o +``` + +On macOS, if `which clang` still points to `/usr/bin/clang` and the wasm test fails, make sure the Homebrew LLVM `bin/` directory is at the front of your `PATH`. + +## Build from source + +Run the local source build from the repository root: + +```sh +make +``` + +This should produce: +- `clayterm.wasm` +- `wasm.ts` + +For a clean rebuild: + +```sh +make clean && make +``` + +## When to rebuild + +Re-run `make` when: +- you change files under `src/` +- you update the `clay` submodule +- `clayterm.wasm` or `wasm.ts` is missing +- generated outputs look stale after switching branches or pulling changes + +When in doubt, use a clean rebuild: + +```sh +make clean && make +``` + +## Verify the build + +After `make` succeeds, run the test suite: + +```sh +deno task test +``` + +Before opening a PR, it is also a good idea to run the same checks CI runs: + +```sh +deno task fmt:check +deno lint +``` + +## Troubleshooting + +### `clay/` is missing or empty + +Symptoms may include build failures such as: +- `fatal error: '../clay/clay.h' file not found` + +Recovery: + +```sh +git submodule update --init --recursive +``` + +Then verify the submodule state and rebuild: + +```sh +git submodule status --recursive +make clean && make +``` + +### `clang` cannot target `wasm32` + +Symptoms may include: +- target-related `clang` errors mentioning `wasm32` +- linker failures while producing `clayterm.wasm` + +Recovery: +- make sure you are using an LLVM/Clang build with wasm support +- on macOS, prefer the Homebrew `llvm` toolchain over `/usr/bin/clang` +- on Linux/WSL2, make sure both `clang` and `lld` are installed +- rerun the wasm smoke test: + +```sh +clang --target=wasm32 -c -x c /dev/null -o /tmp/clayterm-wasm-test.o +rm -f /tmp/clayterm-wasm-test.o +``` + +If the smoke test fails, fix the toolchain first and only then rerun `make`. + +### Generated artifacts are missing or stale + +Symptoms may include: +- `clayterm.wasm` is missing +- `wasm.ts` is missing +- you changed `src/` or updated `clay/`, but the generated outputs do not match + +Recovery: + +```sh +make clean && make +``` + +Then verify the repo is in a good state: + +```sh +deno task test +``` + +## Scope note + +This document is intentionally limited to local source builds for development. + +Out of scope: +- `deno task build:npm` +- `deno task build:jsr` +- `npm publish` +- `deno publish` +- release tagging and package publishing workflows diff --git a/README.md b/README.md index 6af34a3..9da0e63 100644 --- a/README.md +++ b/README.md @@ -212,16 +212,11 @@ process.stdin.on("data", (buf) => { ## Development -Requires `clang` with wasm32 target support. +For local source builds, toolchain setup, and `clay` submodule instructions, see [BUILD.md](BUILD.md). -First build the `.wasm` +Quick local validation: ```sh make -``` - -run tests - -```sh deno task test ``` From 264616bc74c835768f7b3d6bb938d9be1b1ac18a Mon Sep 17 00:00:00 2001 From: Ryan Rauh Date: Sat, 9 May 2026 09:31:27 -0400 Subject: [PATCH 03/47] =?UTF-8?q?=F0=9F=92=84=20format=20build=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BUILD.md | 29 +++++++++++++++++++++++------ README.md | 3 ++- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/BUILD.md b/BUILD.md index d2ca6fd..f7c4782 100644 --- a/BUILD.md +++ b/BUILD.md @@ -3,6 +3,7 @@ This guide is for maintainers and builders working on clayterm itself. It covers: + - cloning the repo correctly, - initializing the `clay` git submodule, - installing the toolchain needed to compile the C sources to WebAssembly, @@ -16,6 +17,7 @@ It does **not** cover npm/JSR packaging or publishing. The local source build is driven by `make`. It generates: + - `clayterm.wasm` — the compiled WebAssembly module built from the C sources - `wasm.ts` — a generated TypeScript file derived from `clayterm.wasm` @@ -44,11 +46,13 @@ Quick check: git submodule status --recursive ``` -You should also see a populated `clay/` directory. If `clay/` is missing or empty, fix the submodule state before building. +You should also see a populated `clay/` directory. If `clay/` is missing or +empty, fix the submodule state before building. ## Required tools You need: + - `git` - `make` - `clang` with wasm32-capable support @@ -60,7 +64,8 @@ Equivalent packages are fine if your package manager uses different names. ### macOS -Install Apple's command line tools first. They provide the base developer tools, including `git` and `make`. +Install Apple's command line tools first. They provide the base developer tools, +including `git` and `make`. ```sh xcode-select --install @@ -79,7 +84,8 @@ echo 'export PATH="$(brew --prefix llvm)/bin:$PATH"' >> ~/.zshrc source ~/.zshrc ``` -If you do not already have `git` available after installing the command line tools, install it with Homebrew: +If you do not already have `git` available after installing the command line +tools, install it with Homebrew: ```sh brew install git @@ -138,9 +144,11 @@ From an elevated PowerShell prompt: wsl --install -d Ubuntu ``` -Then open the Ubuntu environment and follow the **Debian / Ubuntu** instructions above. +Then open the Ubuntu environment and follow the **Debian / Ubuntu** instructions +above. -The build host runs inside WSL2, but the resulting WebAssembly artifacts are intended to run on **native Windows** at runtime. +The build host runs inside WSL2, but the resulting WebAssembly artifacts are +intended to run on **native Windows** at runtime. ## Verify the toolchain @@ -160,7 +168,9 @@ clang --target=wasm32 -c -x c /dev/null -o /tmp/clayterm-wasm-test.o rm -f /tmp/clayterm-wasm-test.o ``` -On macOS, if `which clang` still points to `/usr/bin/clang` and the wasm test fails, make sure the Homebrew LLVM `bin/` directory is at the front of your `PATH`. +On macOS, if `which clang` still points to `/usr/bin/clang` and the wasm test +fails, make sure the Homebrew LLVM `bin/` directory is at the front of your +`PATH`. ## Build from source @@ -171,6 +181,7 @@ make ``` This should produce: + - `clayterm.wasm` - `wasm.ts` @@ -183,6 +194,7 @@ make clean && make ## When to rebuild Re-run `make` when: + - you change files under `src/` - you update the `clay` submodule - `clayterm.wasm` or `wasm.ts` is missing @@ -214,6 +226,7 @@ deno lint ### `clay/` is missing or empty Symptoms may include build failures such as: + - `fatal error: '../clay/clay.h' file not found` Recovery: @@ -232,10 +245,12 @@ make clean && make ### `clang` cannot target `wasm32` Symptoms may include: + - target-related `clang` errors mentioning `wasm32` - linker failures while producing `clayterm.wasm` Recovery: + - make sure you are using an LLVM/Clang build with wasm support - on macOS, prefer the Homebrew `llvm` toolchain over `/usr/bin/clang` - on Linux/WSL2, make sure both `clang` and `lld` are installed @@ -251,6 +266,7 @@ If the smoke test fails, fix the toolchain first and only then rerun `make`. ### Generated artifacts are missing or stale Symptoms may include: + - `clayterm.wasm` is missing - `wasm.ts` is missing - you changed `src/` or updated `clay/`, but the generated outputs do not match @@ -272,6 +288,7 @@ deno task test This document is intentionally limited to local source builds for development. Out of scope: + - `deno task build:npm` - `deno task build:jsr` - `npm publish` diff --git a/README.md b/README.md index 9da0e63..e6b853b 100644 --- a/README.md +++ b/README.md @@ -212,7 +212,8 @@ process.stdin.on("data", (buf) => { ## Development -For local source builds, toolchain setup, and `clay` submodule instructions, see [BUILD.md](BUILD.md). +For local source builds, toolchain setup, and `clay` submodule instructions, see +[BUILD.md](BUILD.md). Quick local validation: From a62376d09f2ac04b3b917c890805d2c5e9afcd9c Mon Sep 17 00:00:00 2001 From: Ryan Rauh Date: Sun, 10 May 2026 06:55:39 -0400 Subject: [PATCH 04/47] =?UTF-8?q?=F0=9F=90=9B=20improve=20pack=20string=20?= =?UTF-8?q?overflow=20errors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ops.ts | 24 +++++++++++++++---- specs/renderer-spec.md | 7 ++++++ test/pack.test.ts | 52 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 test/pack.test.ts diff --git a/ops.ts b/ops.ts index 3344eea..c76d584 100644 --- a/ops.ts +++ b/ops.ts @@ -52,11 +52,27 @@ function packAxis(view: DataView, offset: number, axis: SizingAxis): number { return o; } -function packString(view: DataView, bytes: Uint8Array, o: number): number { +function packString( + view: DataView, + bytes: Uint8Array, + o: number, + end: number, + context: string, +): number { + let paddedLength = Math.ceil(bytes.length / 4) * 4; + let next = o + 4 + paddedLength; + if (next > end) { + throw new RangeError( + `clayterm transfer buffer capacity exceeded while packing ${context} ` + + `(${next} byte offset, ${end} byte limit). ` + + `Render a smaller visible slice or reduce frame content.`, + ); + } + view.setUint32(o, bytes.length, true); o += 4; new Uint8Array(view.buffer).set(bytes, o); - o += Math.ceil(bytes.length / 4) * 4; + o += paddedLength; return o; } @@ -82,7 +98,7 @@ export function pack( o += 4; let bytes = encoder.encode(op.id); - o = packString(view, bytes, o); + o = packString(view, bytes, o, end, "element id"); let mask = 0; if (op.layout) mask |= PROP_LAYOUT; @@ -192,7 +208,7 @@ export function pack( o += 4; let str = encoder.encode(op.content); - o = packString(view, str, o); + o = packString(view, str, o, end, "text content"); break; } } diff --git a/specs/renderer-spec.md b/specs/renderer-spec.md index fa4276a..b78848c 100644 --- a/specs/renderer-spec.md +++ b/specs/renderer-spec.md @@ -466,6 +466,13 @@ form that the WASM module can process. This transfer is handled internally by the renderer and is not an operation the caller performs or observes. The transfer mechanism is an implementation detail described in Section 12.1. +If a frame exceeds transfer-buffer capacity while packing string content, the +renderer MUST throw a descriptive `RangeError` that identifies the condition as +a transfer-buffer, frame-capacity, or packing overflow. The renderer MUST NOT +expose only the raw host-level TypedArray message `"offset is out of bounds"` +for this condition. The error message SHOULD direct callers to render a smaller +visible slice or reduce frame content. + ### 9.3 Directive identity Each element directive carries an `id` provided by the caller via `open()`. diff --git a/test/pack.test.ts b/test/pack.test.ts new file mode 100644 index 0000000..9b3bee8 --- /dev/null +++ b/test/pack.test.ts @@ -0,0 +1,52 @@ +import { describe, expect, it } from "./suite.ts"; +import { close, open, pack, text } from "../ops.ts"; + +describe("pack", () => { + it("throws a descriptive RangeError when text exceeds the transfer buffer", () => { + let memory = new ArrayBuffer(64); + let error: unknown; + + try { + pack( + [ + open("root"), + text("x".repeat(128)), + close(), + ], + memory, + 0, + memory.byteLength, + ); + } catch (caught) { + error = caught; + } + + expect(error).toBeInstanceOf(RangeError); + expect((error as Error).message).toMatch( + /transfer buffer|capacity|packing/, + ); + expect((error as Error).message).toContain("text content"); + expect((error as Error).message).not.toBe("offset is out of bounds"); + expect((error as Error).message).toMatch( + /smaller visible slice|reduce frame content/, + ); + }); + + it("throws a descriptive RangeError when an element id exceeds the transfer buffer", () => { + let memory = new ArrayBuffer(16); + let error: unknown; + + try { + pack([open("x".repeat(64)), close()], memory, 0, memory.byteLength); + } catch (caught) { + error = caught; + } + + expect(error).toBeInstanceOf(RangeError); + expect((error as Error).message).toMatch( + /transfer buffer|capacity|packing/, + ); + expect((error as Error).message).toContain("element id"); + expect((error as Error).message).not.toBe("offset is out of bounds"); + }); +}); From 427deb491e99be6da1b9d2527a66a77f6b0e6a14 Mon Sep 17 00:00:00 2001 From: Jacob Bolda Date: Sat, 23 May 2026 08:55:33 -0500 Subject: [PATCH 05/47] os matrix test in ci (#36) --- .github/workflows/verify.yaml | 38 +++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/.github/workflows/verify.yaml b/.github/workflows/verify.yaml index 3ec7956..3fd5b3f 100644 --- a/.github/workflows/verify.yaml +++ b/.github/workflows/verify.yaml @@ -33,6 +33,44 @@ jobs: - name: build wasm run: make + - name: upload wasm artifact + uses: actions/upload-artifact@v7 + with: + name: clayterm-wasm + path: | + clayterm.wasm + wasm.ts + + test-alt-os: + needs: test + strategy: + matrix: + os: + - name: macos + value: macos-latest + - name: windows + value: windows-latest + fail-fast: false + runs-on: ${{ matrix.os.value }} + name: test ${{ matrix.os.name }} + + steps: + - name: checkout + uses: actions/checkout@v4 + with: + submodules: true + + - name: setup deno + uses: denoland/setup-deno@v2 + with: + deno-version: v2.x + + - name: download wasm artifact + uses: actions/download-artifact@v4 + with: + name: clayterm-wasm + path: . + - name: test run: deno task test From 982ced5e3769fa00b271cccf303b7db1bde1d003 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 22 May 2026 23:26:02 -0400 Subject: [PATCH 06/47] =?UTF-8?q?=F0=9F=A7=BC=20optimize=20build?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index bdd0d97..0bc07e7 100644 --- a/Makefile +++ b/Makefile @@ -1,25 +1,55 @@ -CC = clang +CC = /usr/local/opt/llvm/bin/clang +WASM_OPT ?= wasm-opt TARGET = clayterm.wasm SRC = src/module.c -CFLAGS = --target=wasm32 -nostdlib -O2 \ +CFLAGS = --target=wasm32 -nostdlib -Oz \ + -ffunction-sections -fdata-sections \ + -mbulk-memory \ -DCLAY_IMPLEMENTATION -DCLAY_WASM \ -Isrc -I. +EXPORTS = \ + -Wl,--export=__heap_base \ + -Wl,--export=clayterm_size \ + -Wl,--export=init \ + -Wl,--export=reduce \ + -Wl,--export=output \ + -Wl,--export=length \ + -Wl,--export=measure \ + -Wl,--export=Clay_SetPointerState \ + -Wl,--export=pointer_over_count \ + -Wl,--export=pointer_over_id_string_length \ + -Wl,--export=pointer_over_id_string_ptr \ + -Wl,--export=get_element_bounds \ + -Wl,--export=error_count \ + -Wl,--export=error_type \ + -Wl,--export=error_message_length \ + -Wl,--export=error_message_ptr \ + -Wl,--export=input_size \ + -Wl,--export=input_init \ + -Wl,--export=input_scan \ + -Wl,--export=input_count \ + -Wl,--export=input_event \ + -Wl,--export=input_delay + LDFLAGS = -Wl,--no-entry \ -Wl,--import-memory \ -Wl,--stack-first \ - -Wl,--export-all \ + -Wl,--strip-all \ + -Wl,--gc-sections \ -Wl,--undefined=Clay__MeasureText \ - -Wl,--undefined=Clay__QueryScrollOffset + -Wl,--undefined=Clay__QueryScrollOffset \ + $(EXPORTS) all: $(TARGET) wasm.ts - @echo "Built $(TARGET) ($$(wc -c < $(TARGET)) bytes)" + @echo "Built $(TARGET) ($$(wc -c < $(TARGET)) bytes raw, $$(gzip -c $(TARGET) | wc -c) bytes gzip)" DEPS = $(wildcard src/*.c src/*.h) $(TARGET): $(DEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(SRC) + $(WASM_OPT) -Oz --enable-bulk-memory -o $@ $@ wasm.ts: $(TARGET) deno run --allow-read --allow-write tasks/bundle-wasm.ts From c14f591f295c49cb2147f31a081d0b282ccfb4ce Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 22 May 2026 23:40:11 -0400 Subject: [PATCH 07/47] =?UTF-8?q?=F0=9F=A7=BC=20compress=20bundled=20wasm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tasks/bundle-wasm.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/tasks/bundle-wasm.ts b/tasks/bundle-wasm.ts index b6b033d..ab69236 100644 --- a/tasks/bundle-wasm.ts +++ b/tasks/bundle-wasm.ts @@ -1,13 +1,19 @@ import { encodeBase64 } from "@std/encoding/base64"; const wasm = await Deno.readFile("clayterm.wasm"); -const base64 = encodeBase64(wasm); + +const cs = new CompressionStream("deflate-raw"); +const compressed = await new Response( + new Blob([wasm]).stream().pipeThrough(cs), +).arrayBuffer(); + +const base64 = encodeBase64(new Uint8Array(compressed)); const source = `const bin = atob("${base64}"); -const bytes = new Uint8Array(bin.length); -for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i); -export const compiled = await WebAssembly.compile(bytes); +const compressed = Uint8Array.from(bin, c => c.charCodeAt(0)); +const stream = new Blob([compressed]).stream().pipeThrough(new DecompressionStream("deflate-raw")); +export const compiled = await WebAssembly.compile(await new Response(stream).arrayBuffer()); `; await Deno.writeTextFile("wasm.ts", source); -console.log(`wrote wasm.ts (${wasm.length} bytes encoded)`); +console.log(`wrote wasm.ts (${wasm.length} → ${compressed.byteLength} bytes compressed, ${Math.round(compressed.byteLength / wasm.length * 100)}%)`); From 82c9050bdf48ed4f3d5e92164ccf796c90fd4bf9 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Sat, 23 May 2026 00:16:58 -0400 Subject: [PATCH 08/47] =?UTF-8?q?=F0=9F=A7=BC=20optimize=20wcwidth.c=20siz?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/wcwidth.c | 1256 +++++++------------------------------------------ 1 file changed, 158 insertions(+), 1098 deletions(-) diff --git a/src/wcwidth.c b/src/wcwidth.c index b821866..a3a0faa 100644 --- a/src/wcwidth.c +++ b/src/wcwidth.c @@ -1,1096 +1,165 @@ /* wcwidth.c - Unicode character width lookup - * Extracted from termbox2 (https://github.com/termbox/termbox2) - * Table covers Unicode 15.0 + * Derived from termbox2 (https://github.com/termbox/termbox2), Unicode 15.0 * - * To verify or update, the canonical sources are: - * - https://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt - * Defines W (wide=2) and F (fullwidth=2) - * - https://www.unicode.org/Public/UNIDATA/UnicodeData.txt - * General_Category=Mn/Me for combining marks (width=0) - * - https://www.unicode.org/Public/UNIDATA/DerivedCoreProperties.txt - * Default_Ignorable_Code_Point for zero-width + * Minimal variant: only width-0 (combining) and width-2 (wide CJK) entries. + * All other assigned and unassigned codepoints default to width 1. + * Sources: EastAsianWidth.txt (W/F → 2), UnicodeData.txt Mn/Me (→ 0), + * DerivedCoreProperties.txt Default_Ignorable (→ 0) + * + * Encoding: two split tables (w=0 and w=2), each stored as parallel + * uint32_t lo[] + uint16_t count[] arrays where hi = lo + count. */ #include -static struct { - uint32_t lo; - uint32_t hi; - int w; -} wcwidth_table[] = {{0x000001, 0x00001f, -1}, {0x000020, 0x00007e, 1}, - {0x00007f, 0x00009f, -1}, {0x0000a0, 0x0002ff, 1}, - {0x000300, 0x00036f, 0}, {0x000370, 0x000377, 1}, - {0x000378, 0x000379, -1}, {0x00037a, 0x00037f, 1}, - {0x000380, 0x000383, -1}, {0x000384, 0x00038a, 1}, - {0x00038b, 0x00038b, -1}, {0x00038c, 0x00038c, 1}, - {0x00038d, 0x00038d, -1}, {0x00038e, 0x0003a1, 1}, - {0x0003a2, 0x0003a2, -1}, {0x0003a3, 0x000482, 1}, - {0x000483, 0x000489, 0}, {0x00048a, 0x00052f, 1}, - {0x000530, 0x000530, -1}, {0x000531, 0x000556, 1}, - {0x000557, 0x000558, -1}, {0x000559, 0x00058a, 1}, - {0x00058b, 0x00058c, -1}, {0x00058d, 0x00058f, 1}, - {0x000590, 0x000590, -1}, {0x000591, 0x0005bd, 0}, - {0x0005be, 0x0005be, 1}, {0x0005bf, 0x0005bf, 0}, - {0x0005c0, 0x0005c0, 1}, {0x0005c1, 0x0005c2, 0}, - {0x0005c3, 0x0005c3, 1}, {0x0005c4, 0x0005c5, 0}, - {0x0005c6, 0x0005c6, 1}, {0x0005c7, 0x0005c7, 0}, - {0x0005c8, 0x0005cf, -1}, {0x0005d0, 0x0005ea, 1}, - {0x0005eb, 0x0005ee, -1}, {0x0005ef, 0x0005f4, 1}, - {0x0005f5, 0x0005ff, -1}, {0x000600, 0x00060f, 1}, - {0x000610, 0x00061a, 0}, {0x00061b, 0x00061b, 1}, - {0x00061c, 0x00061c, 0}, {0x00061d, 0x00064a, 1}, - {0x00064b, 0x00065f, 0}, {0x000660, 0x00066f, 1}, - {0x000670, 0x000670, 0}, {0x000671, 0x0006d5, 1}, - {0x0006d6, 0x0006dc, 0}, {0x0006dd, 0x0006de, 1}, - {0x0006df, 0x0006e4, 0}, {0x0006e5, 0x0006e6, 1}, - {0x0006e7, 0x0006e8, 0}, {0x0006e9, 0x0006e9, 1}, - {0x0006ea, 0x0006ed, 0}, {0x0006ee, 0x00070d, 1}, - {0x00070e, 0x00070e, -1}, {0x00070f, 0x000710, 1}, - {0x000711, 0x000711, 0}, {0x000712, 0x00072f, 1}, - {0x000730, 0x00074a, 0}, {0x00074b, 0x00074c, -1}, - {0x00074d, 0x0007a5, 1}, {0x0007a6, 0x0007b0, 0}, - {0x0007b1, 0x0007b1, 1}, {0x0007b2, 0x0007bf, -1}, - {0x0007c0, 0x0007ea, 1}, {0x0007eb, 0x0007f3, 0}, - {0x0007f4, 0x0007fa, 1}, {0x0007fb, 0x0007fc, -1}, - {0x0007fd, 0x0007fd, 0}, {0x0007fe, 0x000815, 1}, - {0x000816, 0x000819, 0}, {0x00081a, 0x00081a, 1}, - {0x00081b, 0x000823, 0}, {0x000824, 0x000824, 1}, - {0x000825, 0x000827, 0}, {0x000828, 0x000828, 1}, - {0x000829, 0x00082d, 0}, {0x00082e, 0x00082f, -1}, - {0x000830, 0x00083e, 1}, {0x00083f, 0x00083f, -1}, - {0x000840, 0x000858, 1}, {0x000859, 0x00085b, 0}, - {0x00085c, 0x00085d, -1}, {0x00085e, 0x00085e, 1}, - {0x00085f, 0x00085f, -1}, {0x000860, 0x00086a, 1}, - {0x00086b, 0x00086f, -1}, {0x000870, 0x00088e, 1}, - {0x00088f, 0x00088f, -1}, {0x000890, 0x000891, 1}, - {0x000892, 0x000896, -1}, {0x000897, 0x00089f, 0}, - {0x0008a0, 0x0008c9, 1}, {0x0008ca, 0x0008e1, 0}, - {0x0008e2, 0x0008e2, 1}, {0x0008e3, 0x000902, 0}, - {0x000903, 0x000939, 1}, {0x00093a, 0x00093a, 0}, - {0x00093b, 0x00093b, 1}, {0x00093c, 0x00093c, 0}, - {0x00093d, 0x000940, 1}, {0x000941, 0x000948, 0}, - {0x000949, 0x00094c, 1}, {0x00094d, 0x00094d, 0}, - {0x00094e, 0x000950, 1}, {0x000951, 0x000957, 0}, - {0x000958, 0x000961, 1}, {0x000962, 0x000963, 0}, - {0x000964, 0x000980, 1}, {0x000981, 0x000981, 0}, - {0x000982, 0x000983, 1}, {0x000984, 0x000984, -1}, - {0x000985, 0x00098c, 1}, {0x00098d, 0x00098e, -1}, - {0x00098f, 0x000990, 1}, {0x000991, 0x000992, -1}, - {0x000993, 0x0009a8, 1}, {0x0009a9, 0x0009a9, -1}, - {0x0009aa, 0x0009b0, 1}, {0x0009b1, 0x0009b1, -1}, - {0x0009b2, 0x0009b2, 1}, {0x0009b3, 0x0009b5, -1}, - {0x0009b6, 0x0009b9, 1}, {0x0009ba, 0x0009bb, -1}, - {0x0009bc, 0x0009bc, 0}, {0x0009bd, 0x0009c0, 1}, - {0x0009c1, 0x0009c4, 0}, {0x0009c5, 0x0009c6, -1}, - {0x0009c7, 0x0009c8, 1}, {0x0009c9, 0x0009ca, -1}, - {0x0009cb, 0x0009cc, 1}, {0x0009cd, 0x0009cd, 0}, - {0x0009ce, 0x0009ce, 1}, {0x0009cf, 0x0009d6, -1}, - {0x0009d7, 0x0009d7, 1}, {0x0009d8, 0x0009db, -1}, - {0x0009dc, 0x0009dd, 1}, {0x0009de, 0x0009de, -1}, - {0x0009df, 0x0009e1, 1}, {0x0009e2, 0x0009e3, 0}, - {0x0009e4, 0x0009e5, -1}, {0x0009e6, 0x0009fd, 1}, - {0x0009fe, 0x0009fe, 0}, {0x0009ff, 0x000a00, -1}, - {0x000a01, 0x000a02, 0}, {0x000a03, 0x000a03, 1}, - {0x000a04, 0x000a04, -1}, {0x000a05, 0x000a0a, 1}, - {0x000a0b, 0x000a0e, -1}, {0x000a0f, 0x000a10, 1}, - {0x000a11, 0x000a12, -1}, {0x000a13, 0x000a28, 1}, - {0x000a29, 0x000a29, -1}, {0x000a2a, 0x000a30, 1}, - {0x000a31, 0x000a31, -1}, {0x000a32, 0x000a33, 1}, - {0x000a34, 0x000a34, -1}, {0x000a35, 0x000a36, 1}, - {0x000a37, 0x000a37, -1}, {0x000a38, 0x000a39, 1}, - {0x000a3a, 0x000a3b, -1}, {0x000a3c, 0x000a3c, 0}, - {0x000a3d, 0x000a3d, -1}, {0x000a3e, 0x000a40, 1}, - {0x000a41, 0x000a42, 0}, {0x000a43, 0x000a46, -1}, - {0x000a47, 0x000a48, 0}, {0x000a49, 0x000a4a, -1}, - {0x000a4b, 0x000a4d, 0}, {0x000a4e, 0x000a50, -1}, - {0x000a51, 0x000a51, 0}, {0x000a52, 0x000a58, -1}, - {0x000a59, 0x000a5c, 1}, {0x000a5d, 0x000a5d, -1}, - {0x000a5e, 0x000a5e, 1}, {0x000a5f, 0x000a65, -1}, - {0x000a66, 0x000a6f, 1}, {0x000a70, 0x000a71, 0}, - {0x000a72, 0x000a74, 1}, {0x000a75, 0x000a75, 0}, - {0x000a76, 0x000a76, 1}, {0x000a77, 0x000a80, -1}, - {0x000a81, 0x000a82, 0}, {0x000a83, 0x000a83, 1}, - {0x000a84, 0x000a84, -1}, {0x000a85, 0x000a8d, 1}, - {0x000a8e, 0x000a8e, -1}, {0x000a8f, 0x000a91, 1}, - {0x000a92, 0x000a92, -1}, {0x000a93, 0x000aa8, 1}, - {0x000aa9, 0x000aa9, -1}, {0x000aaa, 0x000ab0, 1}, - {0x000ab1, 0x000ab1, -1}, {0x000ab2, 0x000ab3, 1}, - {0x000ab4, 0x000ab4, -1}, {0x000ab5, 0x000ab9, 1}, - {0x000aba, 0x000abb, -1}, {0x000abc, 0x000abc, 0}, - {0x000abd, 0x000ac0, 1}, {0x000ac1, 0x000ac5, 0}, - {0x000ac6, 0x000ac6, -1}, {0x000ac7, 0x000ac8, 0}, - {0x000ac9, 0x000ac9, 1}, {0x000aca, 0x000aca, -1}, - {0x000acb, 0x000acc, 1}, {0x000acd, 0x000acd, 0}, - {0x000ace, 0x000acf, -1}, {0x000ad0, 0x000ad0, 1}, - {0x000ad1, 0x000adf, -1}, {0x000ae0, 0x000ae1, 1}, - {0x000ae2, 0x000ae3, 0}, {0x000ae4, 0x000ae5, -1}, - {0x000ae6, 0x000af1, 1}, {0x000af2, 0x000af8, -1}, - {0x000af9, 0x000af9, 1}, {0x000afa, 0x000aff, 0}, - {0x000b00, 0x000b00, -1}, {0x000b01, 0x000b01, 0}, - {0x000b02, 0x000b03, 1}, {0x000b04, 0x000b04, -1}, - {0x000b05, 0x000b0c, 1}, {0x000b0d, 0x000b0e, -1}, - {0x000b0f, 0x000b10, 1}, {0x000b11, 0x000b12, -1}, - {0x000b13, 0x000b28, 1}, {0x000b29, 0x000b29, -1}, - {0x000b2a, 0x000b30, 1}, {0x000b31, 0x000b31, -1}, - {0x000b32, 0x000b33, 1}, {0x000b34, 0x000b34, -1}, - {0x000b35, 0x000b39, 1}, {0x000b3a, 0x000b3b, -1}, - {0x000b3c, 0x000b3c, 0}, {0x000b3d, 0x000b3e, 1}, - {0x000b3f, 0x000b3f, 0}, {0x000b40, 0x000b40, 1}, - {0x000b41, 0x000b44, 0}, {0x000b45, 0x000b46, -1}, - {0x000b47, 0x000b48, 1}, {0x000b49, 0x000b4a, -1}, - {0x000b4b, 0x000b4c, 1}, {0x000b4d, 0x000b4d, 0}, - {0x000b4e, 0x000b54, -1}, {0x000b55, 0x000b56, 0}, - {0x000b57, 0x000b57, 1}, {0x000b58, 0x000b5b, -1}, - {0x000b5c, 0x000b5d, 1}, {0x000b5e, 0x000b5e, -1}, - {0x000b5f, 0x000b61, 1}, {0x000b62, 0x000b63, 0}, - {0x000b64, 0x000b65, -1}, {0x000b66, 0x000b77, 1}, - {0x000b78, 0x000b81, -1}, {0x000b82, 0x000b82, 0}, - {0x000b83, 0x000b83, 1}, {0x000b84, 0x000b84, -1}, - {0x000b85, 0x000b8a, 1}, {0x000b8b, 0x000b8d, -1}, - {0x000b8e, 0x000b90, 1}, {0x000b91, 0x000b91, -1}, - {0x000b92, 0x000b95, 1}, {0x000b96, 0x000b98, -1}, - {0x000b99, 0x000b9a, 1}, {0x000b9b, 0x000b9b, -1}, - {0x000b9c, 0x000b9c, 1}, {0x000b9d, 0x000b9d, -1}, - {0x000b9e, 0x000b9f, 1}, {0x000ba0, 0x000ba2, -1}, - {0x000ba3, 0x000ba4, 1}, {0x000ba5, 0x000ba7, -1}, - {0x000ba8, 0x000baa, 1}, {0x000bab, 0x000bad, -1}, - {0x000bae, 0x000bb9, 1}, {0x000bba, 0x000bbd, -1}, - {0x000bbe, 0x000bbf, 1}, {0x000bc0, 0x000bc0, 0}, - {0x000bc1, 0x000bc2, 1}, {0x000bc3, 0x000bc5, -1}, - {0x000bc6, 0x000bc8, 1}, {0x000bc9, 0x000bc9, -1}, - {0x000bca, 0x000bcc, 1}, {0x000bcd, 0x000bcd, 0}, - {0x000bce, 0x000bcf, -1}, {0x000bd0, 0x000bd0, 1}, - {0x000bd1, 0x000bd6, -1}, {0x000bd7, 0x000bd7, 1}, - {0x000bd8, 0x000be5, -1}, {0x000be6, 0x000bfa, 1}, - {0x000bfb, 0x000bff, -1}, {0x000c00, 0x000c00, 0}, - {0x000c01, 0x000c03, 1}, {0x000c04, 0x000c04, 0}, - {0x000c05, 0x000c0c, 1}, {0x000c0d, 0x000c0d, -1}, - {0x000c0e, 0x000c10, 1}, {0x000c11, 0x000c11, -1}, - {0x000c12, 0x000c28, 1}, {0x000c29, 0x000c29, -1}, - {0x000c2a, 0x000c39, 1}, {0x000c3a, 0x000c3b, -1}, - {0x000c3c, 0x000c3c, 0}, {0x000c3d, 0x000c3d, 1}, - {0x000c3e, 0x000c40, 0}, {0x000c41, 0x000c44, 1}, - {0x000c45, 0x000c45, -1}, {0x000c46, 0x000c48, 0}, - {0x000c49, 0x000c49, -1}, {0x000c4a, 0x000c4d, 0}, - {0x000c4e, 0x000c54, -1}, {0x000c55, 0x000c56, 0}, - {0x000c57, 0x000c57, -1}, {0x000c58, 0x000c5a, 1}, - {0x000c5b, 0x000c5c, -1}, {0x000c5d, 0x000c5d, 1}, - {0x000c5e, 0x000c5f, -1}, {0x000c60, 0x000c61, 1}, - {0x000c62, 0x000c63, 0}, {0x000c64, 0x000c65, -1}, - {0x000c66, 0x000c6f, 1}, {0x000c70, 0x000c76, -1}, - {0x000c77, 0x000c80, 1}, {0x000c81, 0x000c81, 0}, - {0x000c82, 0x000c8c, 1}, {0x000c8d, 0x000c8d, -1}, - {0x000c8e, 0x000c90, 1}, {0x000c91, 0x000c91, -1}, - {0x000c92, 0x000ca8, 1}, {0x000ca9, 0x000ca9, -1}, - {0x000caa, 0x000cb3, 1}, {0x000cb4, 0x000cb4, -1}, - {0x000cb5, 0x000cb9, 1}, {0x000cba, 0x000cbb, -1}, - {0x000cbc, 0x000cbc, 0}, {0x000cbd, 0x000cbe, 1}, - {0x000cbf, 0x000cbf, 0}, {0x000cc0, 0x000cc4, 1}, - {0x000cc5, 0x000cc5, -1}, {0x000cc6, 0x000cc6, 0}, - {0x000cc7, 0x000cc8, 1}, {0x000cc9, 0x000cc9, -1}, - {0x000cca, 0x000ccb, 1}, {0x000ccc, 0x000ccd, 0}, - {0x000cce, 0x000cd4, -1}, {0x000cd5, 0x000cd6, 1}, - {0x000cd7, 0x000cdc, -1}, {0x000cdd, 0x000cde, 1}, - {0x000cdf, 0x000cdf, -1}, {0x000ce0, 0x000ce1, 1}, - {0x000ce2, 0x000ce3, 0}, {0x000ce4, 0x000ce5, -1}, - {0x000ce6, 0x000cef, 1}, {0x000cf0, 0x000cf0, -1}, - {0x000cf1, 0x000cf3, 1}, {0x000cf4, 0x000cff, -1}, - {0x000d00, 0x000d01, 0}, {0x000d02, 0x000d0c, 1}, - {0x000d0d, 0x000d0d, -1}, {0x000d0e, 0x000d10, 1}, - {0x000d11, 0x000d11, -1}, {0x000d12, 0x000d3a, 1}, - {0x000d3b, 0x000d3c, 0}, {0x000d3d, 0x000d40, 1}, - {0x000d41, 0x000d44, 0}, {0x000d45, 0x000d45, -1}, - {0x000d46, 0x000d48, 1}, {0x000d49, 0x000d49, -1}, - {0x000d4a, 0x000d4c, 1}, {0x000d4d, 0x000d4d, 0}, - {0x000d4e, 0x000d4f, 1}, {0x000d50, 0x000d53, -1}, - {0x000d54, 0x000d61, 1}, {0x000d62, 0x000d63, 0}, - {0x000d64, 0x000d65, -1}, {0x000d66, 0x000d7f, 1}, - {0x000d80, 0x000d80, -1}, {0x000d81, 0x000d81, 0}, - {0x000d82, 0x000d83, 1}, {0x000d84, 0x000d84, -1}, - {0x000d85, 0x000d96, 1}, {0x000d97, 0x000d99, -1}, - {0x000d9a, 0x000db1, 1}, {0x000db2, 0x000db2, -1}, - {0x000db3, 0x000dbb, 1}, {0x000dbc, 0x000dbc, -1}, - {0x000dbd, 0x000dbd, 1}, {0x000dbe, 0x000dbf, -1}, - {0x000dc0, 0x000dc6, 1}, {0x000dc7, 0x000dc9, -1}, - {0x000dca, 0x000dca, 0}, {0x000dcb, 0x000dce, -1}, - {0x000dcf, 0x000dd1, 1}, {0x000dd2, 0x000dd4, 0}, - {0x000dd5, 0x000dd5, -1}, {0x000dd6, 0x000dd6, 0}, - {0x000dd7, 0x000dd7, -1}, {0x000dd8, 0x000ddf, 1}, - {0x000de0, 0x000de5, -1}, {0x000de6, 0x000def, 1}, - {0x000df0, 0x000df1, -1}, {0x000df2, 0x000df4, 1}, - {0x000df5, 0x000e00, -1}, {0x000e01, 0x000e30, 1}, - {0x000e31, 0x000e31, 0}, {0x000e32, 0x000e33, 1}, - {0x000e34, 0x000e3a, 0}, {0x000e3b, 0x000e3e, -1}, - {0x000e3f, 0x000e46, 1}, {0x000e47, 0x000e4e, 0}, - {0x000e4f, 0x000e5b, 1}, {0x000e5c, 0x000e80, -1}, - {0x000e81, 0x000e82, 1}, {0x000e83, 0x000e83, -1}, - {0x000e84, 0x000e84, 1}, {0x000e85, 0x000e85, -1}, - {0x000e86, 0x000e8a, 1}, {0x000e8b, 0x000e8b, -1}, - {0x000e8c, 0x000ea3, 1}, {0x000ea4, 0x000ea4, -1}, - {0x000ea5, 0x000ea5, 1}, {0x000ea6, 0x000ea6, -1}, - {0x000ea7, 0x000eb0, 1}, {0x000eb1, 0x000eb1, 0}, - {0x000eb2, 0x000eb3, 1}, {0x000eb4, 0x000ebc, 0}, - {0x000ebd, 0x000ebd, 1}, {0x000ebe, 0x000ebf, -1}, - {0x000ec0, 0x000ec4, 1}, {0x000ec5, 0x000ec5, -1}, - {0x000ec6, 0x000ec6, 1}, {0x000ec7, 0x000ec7, -1}, - {0x000ec8, 0x000ece, 0}, {0x000ecf, 0x000ecf, -1}, - {0x000ed0, 0x000ed9, 1}, {0x000eda, 0x000edb, -1}, - {0x000edc, 0x000edf, 1}, {0x000ee0, 0x000eff, -1}, - {0x000f00, 0x000f17, 1}, {0x000f18, 0x000f19, 0}, - {0x000f1a, 0x000f34, 1}, {0x000f35, 0x000f35, 0}, - {0x000f36, 0x000f36, 1}, {0x000f37, 0x000f37, 0}, - {0x000f38, 0x000f38, 1}, {0x000f39, 0x000f39, 0}, - {0x000f3a, 0x000f47, 1}, {0x000f48, 0x000f48, -1}, - {0x000f49, 0x000f6c, 1}, {0x000f6d, 0x000f70, -1}, - {0x000f71, 0x000f7e, 0}, {0x000f7f, 0x000f7f, 1}, - {0x000f80, 0x000f84, 0}, {0x000f85, 0x000f85, 1}, - {0x000f86, 0x000f87, 0}, {0x000f88, 0x000f8c, 1}, - {0x000f8d, 0x000f97, 0}, {0x000f98, 0x000f98, -1}, - {0x000f99, 0x000fbc, 0}, {0x000fbd, 0x000fbd, -1}, - {0x000fbe, 0x000fc5, 1}, {0x000fc6, 0x000fc6, 0}, - {0x000fc7, 0x000fcc, 1}, {0x000fcd, 0x000fcd, -1}, - {0x000fce, 0x000fda, 1}, {0x000fdb, 0x000fff, -1}, - {0x001000, 0x00102c, 1}, {0x00102d, 0x001030, 0}, - {0x001031, 0x001031, 1}, {0x001032, 0x001037, 0}, - {0x001038, 0x001038, 1}, {0x001039, 0x00103a, 0}, - {0x00103b, 0x00103c, 1}, {0x00103d, 0x00103e, 0}, - {0x00103f, 0x001057, 1}, {0x001058, 0x001059, 0}, - {0x00105a, 0x00105d, 1}, {0x00105e, 0x001060, 0}, - {0x001061, 0x001070, 1}, {0x001071, 0x001074, 0}, - {0x001075, 0x001081, 1}, {0x001082, 0x001082, 0}, - {0x001083, 0x001084, 1}, {0x001085, 0x001086, 0}, - {0x001087, 0x00108c, 1}, {0x00108d, 0x00108d, 0}, - {0x00108e, 0x00109c, 1}, {0x00109d, 0x00109d, 0}, - {0x00109e, 0x0010c5, 1}, {0x0010c6, 0x0010c6, -1}, - {0x0010c7, 0x0010c7, 1}, {0x0010c8, 0x0010cc, -1}, - {0x0010cd, 0x0010cd, 1}, {0x0010ce, 0x0010cf, -1}, - {0x0010d0, 0x0010ff, 1}, {0x001100, 0x00115f, 2}, - {0x001160, 0x0011ff, 0}, {0x001200, 0x001248, 1}, - {0x001249, 0x001249, -1}, {0x00124a, 0x00124d, 1}, - {0x00124e, 0x00124f, -1}, {0x001250, 0x001256, 1}, - {0x001257, 0x001257, -1}, {0x001258, 0x001258, 1}, - {0x001259, 0x001259, -1}, {0x00125a, 0x00125d, 1}, - {0x00125e, 0x00125f, -1}, {0x001260, 0x001288, 1}, - {0x001289, 0x001289, -1}, {0x00128a, 0x00128d, 1}, - {0x00128e, 0x00128f, -1}, {0x001290, 0x0012b0, 1}, - {0x0012b1, 0x0012b1, -1}, {0x0012b2, 0x0012b5, 1}, - {0x0012b6, 0x0012b7, -1}, {0x0012b8, 0x0012be, 1}, - {0x0012bf, 0x0012bf, -1}, {0x0012c0, 0x0012c0, 1}, - {0x0012c1, 0x0012c1, -1}, {0x0012c2, 0x0012c5, 1}, - {0x0012c6, 0x0012c7, -1}, {0x0012c8, 0x0012d6, 1}, - {0x0012d7, 0x0012d7, -1}, {0x0012d8, 0x001310, 1}, - {0x001311, 0x001311, -1}, {0x001312, 0x001315, 1}, - {0x001316, 0x001317, -1}, {0x001318, 0x00135a, 1}, - {0x00135b, 0x00135c, -1}, {0x00135d, 0x00135f, 0}, - {0x001360, 0x00137c, 1}, {0x00137d, 0x00137f, -1}, - {0x001380, 0x001399, 1}, {0x00139a, 0x00139f, -1}, - {0x0013a0, 0x0013f5, 1}, {0x0013f6, 0x0013f7, -1}, - {0x0013f8, 0x0013fd, 1}, {0x0013fe, 0x0013ff, -1}, - {0x001400, 0x00169c, 1}, {0x00169d, 0x00169f, -1}, - {0x0016a0, 0x0016f8, 1}, {0x0016f9, 0x0016ff, -1}, - {0x001700, 0x001711, 1}, {0x001712, 0x001714, 0}, - {0x001715, 0x001715, 1}, {0x001716, 0x00171e, -1}, - {0x00171f, 0x001731, 1}, {0x001732, 0x001733, 0}, - {0x001734, 0x001736, 1}, {0x001737, 0x00173f, -1}, - {0x001740, 0x001751, 1}, {0x001752, 0x001753, 0}, - {0x001754, 0x00175f, -1}, {0x001760, 0x00176c, 1}, - {0x00176d, 0x00176d, -1}, {0x00176e, 0x001770, 1}, - {0x001771, 0x001771, -1}, {0x001772, 0x001773, 0}, - {0x001774, 0x00177f, -1}, {0x001780, 0x0017b3, 1}, - {0x0017b4, 0x0017b5, 0}, {0x0017b6, 0x0017b6, 1}, - {0x0017b7, 0x0017bd, 0}, {0x0017be, 0x0017c5, 1}, - {0x0017c6, 0x0017c6, 0}, {0x0017c7, 0x0017c8, 1}, - {0x0017c9, 0x0017d3, 0}, {0x0017d4, 0x0017dc, 1}, - {0x0017dd, 0x0017dd, 0}, {0x0017de, 0x0017df, -1}, - {0x0017e0, 0x0017e9, 1}, {0x0017ea, 0x0017ef, -1}, - {0x0017f0, 0x0017f9, 1}, {0x0017fa, 0x0017ff, -1}, - {0x001800, 0x00180a, 1}, {0x00180b, 0x00180f, 0}, - {0x001810, 0x001819, 1}, {0x00181a, 0x00181f, -1}, - {0x001820, 0x001878, 1}, {0x001879, 0x00187f, -1}, - {0x001880, 0x001884, 1}, {0x001885, 0x001886, 0}, - {0x001887, 0x0018a8, 1}, {0x0018a9, 0x0018a9, 0}, - {0x0018aa, 0x0018aa, 1}, {0x0018ab, 0x0018af, -1}, - {0x0018b0, 0x0018f5, 1}, {0x0018f6, 0x0018ff, -1}, - {0x001900, 0x00191e, 1}, {0x00191f, 0x00191f, -1}, - {0x001920, 0x001922, 0}, {0x001923, 0x001926, 1}, - {0x001927, 0x001928, 0}, {0x001929, 0x00192b, 1}, - {0x00192c, 0x00192f, -1}, {0x001930, 0x001931, 1}, - {0x001932, 0x001932, 0}, {0x001933, 0x001938, 1}, - {0x001939, 0x00193b, 0}, {0x00193c, 0x00193f, -1}, - {0x001940, 0x001940, 1}, {0x001941, 0x001943, -1}, - {0x001944, 0x00196d, 1}, {0x00196e, 0x00196f, -1}, - {0x001970, 0x001974, 1}, {0x001975, 0x00197f, -1}, - {0x001980, 0x0019ab, 1}, {0x0019ac, 0x0019af, -1}, - {0x0019b0, 0x0019c9, 1}, {0x0019ca, 0x0019cf, -1}, - {0x0019d0, 0x0019da, 1}, {0x0019db, 0x0019dd, -1}, - {0x0019de, 0x001a16, 1}, {0x001a17, 0x001a18, 0}, - {0x001a19, 0x001a1a, 1}, {0x001a1b, 0x001a1b, 0}, - {0x001a1c, 0x001a1d, -1}, {0x001a1e, 0x001a55, 1}, - {0x001a56, 0x001a56, 0}, {0x001a57, 0x001a57, 1}, - {0x001a58, 0x001a5e, 0}, {0x001a5f, 0x001a5f, -1}, - {0x001a60, 0x001a60, 0}, {0x001a61, 0x001a61, 1}, - {0x001a62, 0x001a62, 0}, {0x001a63, 0x001a64, 1}, - {0x001a65, 0x001a6c, 0}, {0x001a6d, 0x001a72, 1}, - {0x001a73, 0x001a7c, 0}, {0x001a7d, 0x001a7e, -1}, - {0x001a7f, 0x001a7f, 0}, {0x001a80, 0x001a89, 1}, - {0x001a8a, 0x001a8f, -1}, {0x001a90, 0x001a99, 1}, - {0x001a9a, 0x001a9f, -1}, {0x001aa0, 0x001aad, 1}, - {0x001aae, 0x001aaf, -1}, {0x001ab0, 0x001ace, 0}, - {0x001acf, 0x001aff, -1}, {0x001b00, 0x001b03, 0}, - {0x001b04, 0x001b33, 1}, {0x001b34, 0x001b34, 0}, - {0x001b35, 0x001b35, 1}, {0x001b36, 0x001b3a, 0}, - {0x001b3b, 0x001b3b, 1}, {0x001b3c, 0x001b3c, 0}, - {0x001b3d, 0x001b41, 1}, {0x001b42, 0x001b42, 0}, - {0x001b43, 0x001b4c, 1}, {0x001b4d, 0x001b4d, -1}, - {0x001b4e, 0x001b6a, 1}, {0x001b6b, 0x001b73, 0}, - {0x001b74, 0x001b7f, 1}, {0x001b80, 0x001b81, 0}, - {0x001b82, 0x001ba1, 1}, {0x001ba2, 0x001ba5, 0}, - {0x001ba6, 0x001ba7, 1}, {0x001ba8, 0x001ba9, 0}, - {0x001baa, 0x001baa, 1}, {0x001bab, 0x001bad, 0}, - {0x001bae, 0x001be5, 1}, {0x001be6, 0x001be6, 0}, - {0x001be7, 0x001be7, 1}, {0x001be8, 0x001be9, 0}, - {0x001bea, 0x001bec, 1}, {0x001bed, 0x001bed, 0}, - {0x001bee, 0x001bee, 1}, {0x001bef, 0x001bf1, 0}, - {0x001bf2, 0x001bf3, 1}, {0x001bf4, 0x001bfb, -1}, - {0x001bfc, 0x001c2b, 1}, {0x001c2c, 0x001c33, 0}, - {0x001c34, 0x001c35, 1}, {0x001c36, 0x001c37, 0}, - {0x001c38, 0x001c3a, -1}, {0x001c3b, 0x001c49, 1}, - {0x001c4a, 0x001c4c, -1}, {0x001c4d, 0x001c8a, 1}, - {0x001c8b, 0x001c8f, -1}, {0x001c90, 0x001cba, 1}, - {0x001cbb, 0x001cbc, -1}, {0x001cbd, 0x001cc7, 1}, - {0x001cc8, 0x001ccf, -1}, {0x001cd0, 0x001cd2, 0}, - {0x001cd3, 0x001cd3, 1}, {0x001cd4, 0x001ce0, 0}, - {0x001ce1, 0x001ce1, 1}, {0x001ce2, 0x001ce8, 0}, - {0x001ce9, 0x001cec, 1}, {0x001ced, 0x001ced, 0}, - {0x001cee, 0x001cf3, 1}, {0x001cf4, 0x001cf4, 0}, - {0x001cf5, 0x001cf7, 1}, {0x001cf8, 0x001cf9, 0}, - {0x001cfa, 0x001cfa, 1}, {0x001cfb, 0x001cff, -1}, - {0x001d00, 0x001dbf, 1}, {0x001dc0, 0x001dff, 0}, - {0x001e00, 0x001f15, 1}, {0x001f16, 0x001f17, -1}, - {0x001f18, 0x001f1d, 1}, {0x001f1e, 0x001f1f, -1}, - {0x001f20, 0x001f45, 1}, {0x001f46, 0x001f47, -1}, - {0x001f48, 0x001f4d, 1}, {0x001f4e, 0x001f4f, -1}, - {0x001f50, 0x001f57, 1}, {0x001f58, 0x001f58, -1}, - {0x001f59, 0x001f59, 1}, {0x001f5a, 0x001f5a, -1}, - {0x001f5b, 0x001f5b, 1}, {0x001f5c, 0x001f5c, -1}, - {0x001f5d, 0x001f5d, 1}, {0x001f5e, 0x001f5e, -1}, - {0x001f5f, 0x001f7d, 1}, {0x001f7e, 0x001f7f, -1}, - {0x001f80, 0x001fb4, 1}, {0x001fb5, 0x001fb5, -1}, - {0x001fb6, 0x001fc4, 1}, {0x001fc5, 0x001fc5, -1}, - {0x001fc6, 0x001fd3, 1}, {0x001fd4, 0x001fd5, -1}, - {0x001fd6, 0x001fdb, 1}, {0x001fdc, 0x001fdc, -1}, - {0x001fdd, 0x001fef, 1}, {0x001ff0, 0x001ff1, -1}, - {0x001ff2, 0x001ff4, 1}, {0x001ff5, 0x001ff5, -1}, - {0x001ff6, 0x001ffe, 1}, {0x001fff, 0x001fff, -1}, - {0x002000, 0x00200a, 1}, {0x00200b, 0x00200f, 0}, - {0x002010, 0x002027, 1}, {0x002028, 0x002029, -1}, - {0x00202a, 0x00202e, 0}, {0x00202f, 0x00205f, 1}, - {0x002060, 0x002064, 0}, {0x002065, 0x002065, -1}, - {0x002066, 0x00206f, 0}, {0x002070, 0x002071, 1}, - {0x002072, 0x002073, -1}, {0x002074, 0x00208e, 1}, - {0x00208f, 0x00208f, -1}, {0x002090, 0x00209c, 1}, - {0x00209d, 0x00209f, -1}, {0x0020a0, 0x0020c0, 1}, - {0x0020c1, 0x0020cf, -1}, {0x0020d0, 0x0020f0, 0}, - {0x0020f1, 0x0020ff, -1}, {0x002100, 0x00218b, 1}, - {0x00218c, 0x00218f, -1}, {0x002190, 0x002319, 1}, - {0x00231a, 0x00231b, 2}, {0x00231c, 0x002328, 1}, - {0x002329, 0x00232a, 2}, {0x00232b, 0x0023e8, 1}, - {0x0023e9, 0x0023ec, 2}, {0x0023ed, 0x0023ef, 1}, - {0x0023f0, 0x0023f0, 2}, {0x0023f1, 0x0023f2, 1}, - {0x0023f3, 0x0023f3, 2}, {0x0023f4, 0x002429, 1}, - {0x00242a, 0x00243f, -1}, {0x002440, 0x00244a, 1}, - {0x00244b, 0x00245f, -1}, {0x002460, 0x0025fc, 1}, - {0x0025fd, 0x0025fe, 2}, {0x0025ff, 0x002613, 1}, - {0x002614, 0x002615, 2}, {0x002616, 0x00262f, 1}, - {0x002630, 0x002637, 2}, {0x002638, 0x002647, 1}, - {0x002648, 0x002653, 2}, {0x002654, 0x00267e, 1}, - {0x00267f, 0x00267f, 2}, {0x002680, 0x002689, 1}, - {0x00268a, 0x00268f, 2}, {0x002690, 0x002692, 1}, - {0x002693, 0x002693, 2}, {0x002694, 0x0026a0, 1}, - {0x0026a1, 0x0026a1, 2}, {0x0026a2, 0x0026a9, 1}, - {0x0026aa, 0x0026ab, 2}, {0x0026ac, 0x0026bc, 1}, - {0x0026bd, 0x0026be, 2}, {0x0026bf, 0x0026c3, 1}, - {0x0026c4, 0x0026c5, 2}, {0x0026c6, 0x0026cd, 1}, - {0x0026ce, 0x0026ce, 2}, {0x0026cf, 0x0026d3, 1}, - {0x0026d4, 0x0026d4, 2}, {0x0026d5, 0x0026e9, 1}, - {0x0026ea, 0x0026ea, 2}, {0x0026eb, 0x0026f1, 1}, - {0x0026f2, 0x0026f3, 2}, {0x0026f4, 0x0026f4, 1}, - {0x0026f5, 0x0026f5, 2}, {0x0026f6, 0x0026f9, 1}, - {0x0026fa, 0x0026fa, 2}, {0x0026fb, 0x0026fc, 1}, - {0x0026fd, 0x0026fd, 2}, {0x0026fe, 0x002704, 1}, - {0x002705, 0x002705, 2}, {0x002706, 0x002709, 1}, - {0x00270a, 0x00270b, 2}, {0x00270c, 0x002727, 1}, - {0x002728, 0x002728, 2}, {0x002729, 0x00274b, 1}, - {0x00274c, 0x00274c, 2}, {0x00274d, 0x00274d, 1}, - {0x00274e, 0x00274e, 2}, {0x00274f, 0x002752, 1}, - {0x002753, 0x002755, 2}, {0x002756, 0x002756, 1}, - {0x002757, 0x002757, 2}, {0x002758, 0x002794, 1}, - {0x002795, 0x002797, 2}, {0x002798, 0x0027af, 1}, - {0x0027b0, 0x0027b0, 2}, {0x0027b1, 0x0027be, 1}, - {0x0027bf, 0x0027bf, 2}, {0x0027c0, 0x002b1a, 1}, - {0x002b1b, 0x002b1c, 2}, {0x002b1d, 0x002b4f, 1}, - {0x002b50, 0x002b50, 2}, {0x002b51, 0x002b54, 1}, - {0x002b55, 0x002b55, 2}, {0x002b56, 0x002b73, 1}, - {0x002b74, 0x002b75, -1}, {0x002b76, 0x002b95, 1}, - {0x002b96, 0x002b96, -1}, {0x002b97, 0x002cee, 1}, - {0x002cef, 0x002cf1, 0}, {0x002cf2, 0x002cf3, 1}, - {0x002cf4, 0x002cf8, -1}, {0x002cf9, 0x002d25, 1}, - {0x002d26, 0x002d26, -1}, {0x002d27, 0x002d27, 1}, - {0x002d28, 0x002d2c, -1}, {0x002d2d, 0x002d2d, 1}, - {0x002d2e, 0x002d2f, -1}, {0x002d30, 0x002d67, 1}, - {0x002d68, 0x002d6e, -1}, {0x002d6f, 0x002d70, 1}, - {0x002d71, 0x002d7e, -1}, {0x002d7f, 0x002d7f, 0}, - {0x002d80, 0x002d96, 1}, {0x002d97, 0x002d9f, -1}, - {0x002da0, 0x002da6, 1}, {0x002da7, 0x002da7, -1}, - {0x002da8, 0x002dae, 1}, {0x002daf, 0x002daf, -1}, - {0x002db0, 0x002db6, 1}, {0x002db7, 0x002db7, -1}, - {0x002db8, 0x002dbe, 1}, {0x002dbf, 0x002dbf, -1}, - {0x002dc0, 0x002dc6, 1}, {0x002dc7, 0x002dc7, -1}, - {0x002dc8, 0x002dce, 1}, {0x002dcf, 0x002dcf, -1}, - {0x002dd0, 0x002dd6, 1}, {0x002dd7, 0x002dd7, -1}, - {0x002dd8, 0x002dde, 1}, {0x002ddf, 0x002ddf, -1}, - {0x002de0, 0x002dff, 0}, {0x002e00, 0x002e5d, 1}, - {0x002e5e, 0x002e7f, -1}, {0x002e80, 0x002e99, 2}, - {0x002e9a, 0x002e9a, -1}, {0x002e9b, 0x002ef3, 2}, - {0x002ef4, 0x002eff, -1}, {0x002f00, 0x002fd5, 2}, - {0x002fd6, 0x002fef, -1}, {0x002ff0, 0x003029, 2}, - {0x00302a, 0x00302d, 0}, {0x00302e, 0x00303e, 2}, - {0x00303f, 0x00303f, 1}, {0x003040, 0x003040, -1}, - {0x003041, 0x003096, 2}, {0x003097, 0x003098, -1}, - {0x003099, 0x00309a, 0}, {0x00309b, 0x0030ff, 2}, - {0x003100, 0x003104, -1}, {0x003105, 0x00312f, 2}, - {0x003130, 0x003130, -1}, {0x003131, 0x003163, 2}, - {0x003164, 0x003164, 0}, {0x003165, 0x00318e, 2}, - {0x00318f, 0x00318f, -1}, {0x003190, 0x0031e5, 2}, - {0x0031e6, 0x0031ee, -1}, {0x0031ef, 0x00321e, 2}, - {0x00321f, 0x00321f, -1}, {0x003220, 0x00a48c, 2}, - {0x00a48d, 0x00a48f, -1}, {0x00a490, 0x00a4c6, 2}, - {0x00a4c7, 0x00a4cf, -1}, {0x00a4d0, 0x00a62b, 1}, - {0x00a62c, 0x00a63f, -1}, {0x00a640, 0x00a66e, 1}, - {0x00a66f, 0x00a672, 0}, {0x00a673, 0x00a673, 1}, - {0x00a674, 0x00a67d, 0}, {0x00a67e, 0x00a69d, 1}, - {0x00a69e, 0x00a69f, 0}, {0x00a6a0, 0x00a6ef, 1}, - {0x00a6f0, 0x00a6f1, 0}, {0x00a6f2, 0x00a6f7, 1}, - {0x00a6f8, 0x00a6ff, -1}, {0x00a700, 0x00a7cd, 1}, - {0x00a7ce, 0x00a7cf, -1}, {0x00a7d0, 0x00a7d1, 1}, - {0x00a7d2, 0x00a7d2, -1}, {0x00a7d3, 0x00a7d3, 1}, - {0x00a7d4, 0x00a7d4, -1}, {0x00a7d5, 0x00a7dc, 1}, - {0x00a7dd, 0x00a7f1, -1}, {0x00a7f2, 0x00a801, 1}, - {0x00a802, 0x00a802, 0}, {0x00a803, 0x00a805, 1}, - {0x00a806, 0x00a806, 0}, {0x00a807, 0x00a80a, 1}, - {0x00a80b, 0x00a80b, 0}, {0x00a80c, 0x00a824, 1}, - {0x00a825, 0x00a826, 0}, {0x00a827, 0x00a82b, 1}, - {0x00a82c, 0x00a82c, 0}, {0x00a82d, 0x00a82f, -1}, - {0x00a830, 0x00a839, 1}, {0x00a83a, 0x00a83f, -1}, - {0x00a840, 0x00a877, 1}, {0x00a878, 0x00a87f, -1}, - {0x00a880, 0x00a8c3, 1}, {0x00a8c4, 0x00a8c5, 0}, - {0x00a8c6, 0x00a8cd, -1}, {0x00a8ce, 0x00a8d9, 1}, - {0x00a8da, 0x00a8df, -1}, {0x00a8e0, 0x00a8f1, 0}, - {0x00a8f2, 0x00a8fe, 1}, {0x00a8ff, 0x00a8ff, 0}, - {0x00a900, 0x00a925, 1}, {0x00a926, 0x00a92d, 0}, - {0x00a92e, 0x00a946, 1}, {0x00a947, 0x00a951, 0}, - {0x00a952, 0x00a953, 1}, {0x00a954, 0x00a95e, -1}, - {0x00a95f, 0x00a95f, 1}, {0x00a960, 0x00a97c, 2}, - {0x00a97d, 0x00a97f, -1}, {0x00a980, 0x00a982, 0}, - {0x00a983, 0x00a9b2, 1}, {0x00a9b3, 0x00a9b3, 0}, - {0x00a9b4, 0x00a9b5, 1}, {0x00a9b6, 0x00a9b9, 0}, - {0x00a9ba, 0x00a9bb, 1}, {0x00a9bc, 0x00a9bd, 0}, - {0x00a9be, 0x00a9cd, 1}, {0x00a9ce, 0x00a9ce, -1}, - {0x00a9cf, 0x00a9d9, 1}, {0x00a9da, 0x00a9dd, -1}, - {0x00a9de, 0x00a9e4, 1}, {0x00a9e5, 0x00a9e5, 0}, - {0x00a9e6, 0x00a9fe, 1}, {0x00a9ff, 0x00a9ff, -1}, - {0x00aa00, 0x00aa28, 1}, {0x00aa29, 0x00aa2e, 0}, - {0x00aa2f, 0x00aa30, 1}, {0x00aa31, 0x00aa32, 0}, - {0x00aa33, 0x00aa34, 1}, {0x00aa35, 0x00aa36, 0}, - {0x00aa37, 0x00aa3f, -1}, {0x00aa40, 0x00aa42, 1}, - {0x00aa43, 0x00aa43, 0}, {0x00aa44, 0x00aa4b, 1}, - {0x00aa4c, 0x00aa4c, 0}, {0x00aa4d, 0x00aa4d, 1}, - {0x00aa4e, 0x00aa4f, -1}, {0x00aa50, 0x00aa59, 1}, - {0x00aa5a, 0x00aa5b, -1}, {0x00aa5c, 0x00aa7b, 1}, - {0x00aa7c, 0x00aa7c, 0}, {0x00aa7d, 0x00aaaf, 1}, - {0x00aab0, 0x00aab0, 0}, {0x00aab1, 0x00aab1, 1}, - {0x00aab2, 0x00aab4, 0}, {0x00aab5, 0x00aab6, 1}, - {0x00aab7, 0x00aab8, 0}, {0x00aab9, 0x00aabd, 1}, - {0x00aabe, 0x00aabf, 0}, {0x00aac0, 0x00aac0, 1}, - {0x00aac1, 0x00aac1, 0}, {0x00aac2, 0x00aac2, 1}, - {0x00aac3, 0x00aada, -1}, {0x00aadb, 0x00aaeb, 1}, - {0x00aaec, 0x00aaed, 0}, {0x00aaee, 0x00aaf5, 1}, - {0x00aaf6, 0x00aaf6, 0}, {0x00aaf7, 0x00ab00, -1}, - {0x00ab01, 0x00ab06, 1}, {0x00ab07, 0x00ab08, -1}, - {0x00ab09, 0x00ab0e, 1}, {0x00ab0f, 0x00ab10, -1}, - {0x00ab11, 0x00ab16, 1}, {0x00ab17, 0x00ab1f, -1}, - {0x00ab20, 0x00ab26, 1}, {0x00ab27, 0x00ab27, -1}, - {0x00ab28, 0x00ab2e, 1}, {0x00ab2f, 0x00ab2f, -1}, - {0x00ab30, 0x00ab6b, 1}, {0x00ab6c, 0x00ab6f, -1}, - {0x00ab70, 0x00abe4, 1}, {0x00abe5, 0x00abe5, 0}, - {0x00abe6, 0x00abe7, 1}, {0x00abe8, 0x00abe8, 0}, - {0x00abe9, 0x00abec, 1}, {0x00abed, 0x00abed, 0}, - {0x00abee, 0x00abef, -1}, {0x00abf0, 0x00abf9, 1}, - {0x00abfa, 0x00abff, -1}, {0x00ac00, 0x00d7a3, 2}, - {0x00d7a4, 0x00d7af, -1}, {0x00d7b0, 0x00d7c6, 0}, - {0x00d7c7, 0x00d7ca, -1}, {0x00d7cb, 0x00d7fb, 0}, - {0x00d7fc, 0x00dfff, -1}, {0x00e000, 0x00f8ff, 1}, - {0x00f900, 0x00fa6d, 2}, {0x00fa6e, 0x00fa6f, -1}, - {0x00fa70, 0x00fad9, 2}, {0x00fada, 0x00faff, -1}, - {0x00fb00, 0x00fb06, 1}, {0x00fb07, 0x00fb12, -1}, - {0x00fb13, 0x00fb17, 1}, {0x00fb18, 0x00fb1c, -1}, - {0x00fb1d, 0x00fb1d, 1}, {0x00fb1e, 0x00fb1e, 0}, - {0x00fb1f, 0x00fb36, 1}, {0x00fb37, 0x00fb37, -1}, - {0x00fb38, 0x00fb3c, 1}, {0x00fb3d, 0x00fb3d, -1}, - {0x00fb3e, 0x00fb3e, 1}, {0x00fb3f, 0x00fb3f, -1}, - {0x00fb40, 0x00fb41, 1}, {0x00fb42, 0x00fb42, -1}, - {0x00fb43, 0x00fb44, 1}, {0x00fb45, 0x00fb45, -1}, - {0x00fb46, 0x00fbc2, 1}, {0x00fbc3, 0x00fbd2, -1}, - {0x00fbd3, 0x00fd8f, 1}, {0x00fd90, 0x00fd91, -1}, - {0x00fd92, 0x00fdc7, 1}, {0x00fdc8, 0x00fdce, -1}, - {0x00fdcf, 0x00fdcf, 1}, {0x00fdd0, 0x00fdef, -1}, - {0x00fdf0, 0x00fdff, 1}, {0x00fe00, 0x00fe0f, 0}, - {0x00fe10, 0x00fe19, 2}, {0x00fe1a, 0x00fe1f, -1}, - {0x00fe20, 0x00fe2f, 0}, {0x00fe30, 0x00fe52, 2}, - {0x00fe53, 0x00fe53, -1}, {0x00fe54, 0x00fe66, 2}, - {0x00fe67, 0x00fe67, -1}, {0x00fe68, 0x00fe6b, 2}, - {0x00fe6c, 0x00fe6f, -1}, {0x00fe70, 0x00fe74, 1}, - {0x00fe75, 0x00fe75, -1}, {0x00fe76, 0x00fefc, 1}, - {0x00fefd, 0x00fefe, -1}, {0x00feff, 0x00feff, 0}, - {0x00ff00, 0x00ff00, -1}, {0x00ff01, 0x00ff60, 2}, - {0x00ff61, 0x00ff9f, 1}, {0x00ffa0, 0x00ffa0, 0}, - {0x00ffa1, 0x00ffbe, 1}, {0x00ffbf, 0x00ffc1, -1}, - {0x00ffc2, 0x00ffc7, 1}, {0x00ffc8, 0x00ffc9, -1}, - {0x00ffca, 0x00ffcf, 1}, {0x00ffd0, 0x00ffd1, -1}, - {0x00ffd2, 0x00ffd7, 1}, {0x00ffd8, 0x00ffd9, -1}, - {0x00ffda, 0x00ffdc, 1}, {0x00ffdd, 0x00ffdf, -1}, - {0x00ffe0, 0x00ffe6, 2}, {0x00ffe7, 0x00ffe7, -1}, - {0x00ffe8, 0x00ffee, 1}, {0x00ffef, 0x00fff8, -1}, - {0x00fff9, 0x00fffd, 1}, {0x00fffe, 0x00ffff, -1}, - {0x010000, 0x01000b, 1}, {0x01000c, 0x01000c, -1}, - {0x01000d, 0x010026, 1}, {0x010027, 0x010027, -1}, - {0x010028, 0x01003a, 1}, {0x01003b, 0x01003b, -1}, - {0x01003c, 0x01003d, 1}, {0x01003e, 0x01003e, -1}, - {0x01003f, 0x01004d, 1}, {0x01004e, 0x01004f, -1}, - {0x010050, 0x01005d, 1}, {0x01005e, 0x01007f, -1}, - {0x010080, 0x0100fa, 1}, {0x0100fb, 0x0100ff, -1}, - {0x010100, 0x010102, 1}, {0x010103, 0x010106, -1}, - {0x010107, 0x010133, 1}, {0x010134, 0x010136, -1}, - {0x010137, 0x01018e, 1}, {0x01018f, 0x01018f, -1}, - {0x010190, 0x01019c, 1}, {0x01019d, 0x01019f, -1}, - {0x0101a0, 0x0101a0, 1}, {0x0101a1, 0x0101cf, -1}, - {0x0101d0, 0x0101fc, 1}, {0x0101fd, 0x0101fd, 0}, - {0x0101fe, 0x01027f, -1}, {0x010280, 0x01029c, 1}, - {0x01029d, 0x01029f, -1}, {0x0102a0, 0x0102d0, 1}, - {0x0102d1, 0x0102df, -1}, {0x0102e0, 0x0102e0, 0}, - {0x0102e1, 0x0102fb, 1}, {0x0102fc, 0x0102ff, -1}, - {0x010300, 0x010323, 1}, {0x010324, 0x01032c, -1}, - {0x01032d, 0x01034a, 1}, {0x01034b, 0x01034f, -1}, - {0x010350, 0x010375, 1}, {0x010376, 0x01037a, 0}, - {0x01037b, 0x01037f, -1}, {0x010380, 0x01039d, 1}, - {0x01039e, 0x01039e, -1}, {0x01039f, 0x0103c3, 1}, - {0x0103c4, 0x0103c7, -1}, {0x0103c8, 0x0103d5, 1}, - {0x0103d6, 0x0103ff, -1}, {0x010400, 0x01049d, 1}, - {0x01049e, 0x01049f, -1}, {0x0104a0, 0x0104a9, 1}, - {0x0104aa, 0x0104af, -1}, {0x0104b0, 0x0104d3, 1}, - {0x0104d4, 0x0104d7, -1}, {0x0104d8, 0x0104fb, 1}, - {0x0104fc, 0x0104ff, -1}, {0x010500, 0x010527, 1}, - {0x010528, 0x01052f, -1}, {0x010530, 0x010563, 1}, - {0x010564, 0x01056e, -1}, {0x01056f, 0x01057a, 1}, - {0x01057b, 0x01057b, -1}, {0x01057c, 0x01058a, 1}, - {0x01058b, 0x01058b, -1}, {0x01058c, 0x010592, 1}, - {0x010593, 0x010593, -1}, {0x010594, 0x010595, 1}, - {0x010596, 0x010596, -1}, {0x010597, 0x0105a1, 1}, - {0x0105a2, 0x0105a2, -1}, {0x0105a3, 0x0105b1, 1}, - {0x0105b2, 0x0105b2, -1}, {0x0105b3, 0x0105b9, 1}, - {0x0105ba, 0x0105ba, -1}, {0x0105bb, 0x0105bc, 1}, - {0x0105bd, 0x0105bf, -1}, {0x0105c0, 0x0105f3, 1}, - {0x0105f4, 0x0105ff, -1}, {0x010600, 0x010736, 1}, - {0x010737, 0x01073f, -1}, {0x010740, 0x010755, 1}, - {0x010756, 0x01075f, -1}, {0x010760, 0x010767, 1}, - {0x010768, 0x01077f, -1}, {0x010780, 0x010785, 1}, - {0x010786, 0x010786, -1}, {0x010787, 0x0107b0, 1}, - {0x0107b1, 0x0107b1, -1}, {0x0107b2, 0x0107ba, 1}, - {0x0107bb, 0x0107ff, -1}, {0x010800, 0x010805, 1}, - {0x010806, 0x010807, -1}, {0x010808, 0x010808, 1}, - {0x010809, 0x010809, -1}, {0x01080a, 0x010835, 1}, - {0x010836, 0x010836, -1}, {0x010837, 0x010838, 1}, - {0x010839, 0x01083b, -1}, {0x01083c, 0x01083c, 1}, - {0x01083d, 0x01083e, -1}, {0x01083f, 0x010855, 1}, - {0x010856, 0x010856, -1}, {0x010857, 0x01089e, 1}, - {0x01089f, 0x0108a6, -1}, {0x0108a7, 0x0108af, 1}, - {0x0108b0, 0x0108df, -1}, {0x0108e0, 0x0108f2, 1}, - {0x0108f3, 0x0108f3, -1}, {0x0108f4, 0x0108f5, 1}, - {0x0108f6, 0x0108fa, -1}, {0x0108fb, 0x01091b, 1}, - {0x01091c, 0x01091e, -1}, {0x01091f, 0x010939, 1}, - {0x01093a, 0x01093e, -1}, {0x01093f, 0x01093f, 1}, - {0x010940, 0x01097f, -1}, {0x010980, 0x0109b7, 1}, - {0x0109b8, 0x0109bb, -1}, {0x0109bc, 0x0109cf, 1}, - {0x0109d0, 0x0109d1, -1}, {0x0109d2, 0x010a00, 1}, - {0x010a01, 0x010a03, 0}, {0x010a04, 0x010a04, -1}, - {0x010a05, 0x010a06, 0}, {0x010a07, 0x010a0b, -1}, - {0x010a0c, 0x010a0f, 0}, {0x010a10, 0x010a13, 1}, - {0x010a14, 0x010a14, -1}, {0x010a15, 0x010a17, 1}, - {0x010a18, 0x010a18, -1}, {0x010a19, 0x010a35, 1}, - {0x010a36, 0x010a37, -1}, {0x010a38, 0x010a3a, 0}, - {0x010a3b, 0x010a3e, -1}, {0x010a3f, 0x010a3f, 0}, - {0x010a40, 0x010a48, 1}, {0x010a49, 0x010a4f, -1}, - {0x010a50, 0x010a58, 1}, {0x010a59, 0x010a5f, -1}, - {0x010a60, 0x010a9f, 1}, {0x010aa0, 0x010abf, -1}, - {0x010ac0, 0x010ae4, 1}, {0x010ae5, 0x010ae6, 0}, - {0x010ae7, 0x010aea, -1}, {0x010aeb, 0x010af6, 1}, - {0x010af7, 0x010aff, -1}, {0x010b00, 0x010b35, 1}, - {0x010b36, 0x010b38, -1}, {0x010b39, 0x010b55, 1}, - {0x010b56, 0x010b57, -1}, {0x010b58, 0x010b72, 1}, - {0x010b73, 0x010b77, -1}, {0x010b78, 0x010b91, 1}, - {0x010b92, 0x010b98, -1}, {0x010b99, 0x010b9c, 1}, - {0x010b9d, 0x010ba8, -1}, {0x010ba9, 0x010baf, 1}, - {0x010bb0, 0x010bff, -1}, {0x010c00, 0x010c48, 1}, - {0x010c49, 0x010c7f, -1}, {0x010c80, 0x010cb2, 1}, - {0x010cb3, 0x010cbf, -1}, {0x010cc0, 0x010cf2, 1}, - {0x010cf3, 0x010cf9, -1}, {0x010cfa, 0x010d23, 1}, - {0x010d24, 0x010d27, 0}, {0x010d28, 0x010d2f, -1}, - {0x010d30, 0x010d39, 1}, {0x010d3a, 0x010d3f, -1}, - {0x010d40, 0x010d65, 1}, {0x010d66, 0x010d68, -1}, - {0x010d69, 0x010d6d, 0}, {0x010d6e, 0x010d85, 1}, - {0x010d86, 0x010d8d, -1}, {0x010d8e, 0x010d8f, 1}, - {0x010d90, 0x010e5f, -1}, {0x010e60, 0x010e7e, 1}, - {0x010e7f, 0x010e7f, -1}, {0x010e80, 0x010ea9, 1}, - {0x010eaa, 0x010eaa, -1}, {0x010eab, 0x010eac, 0}, - {0x010ead, 0x010ead, 1}, {0x010eae, 0x010eaf, -1}, - {0x010eb0, 0x010eb1, 1}, {0x010eb2, 0x010ec1, -1}, - {0x010ec2, 0x010ec4, 1}, {0x010ec5, 0x010efb, -1}, - {0x010efc, 0x010eff, 0}, {0x010f00, 0x010f27, 1}, - {0x010f28, 0x010f2f, -1}, {0x010f30, 0x010f45, 1}, - {0x010f46, 0x010f50, 0}, {0x010f51, 0x010f59, 1}, - {0x010f5a, 0x010f6f, -1}, {0x010f70, 0x010f81, 1}, - {0x010f82, 0x010f85, 0}, {0x010f86, 0x010f89, 1}, - {0x010f8a, 0x010faf, -1}, {0x010fb0, 0x010fcb, 1}, - {0x010fcc, 0x010fdf, -1}, {0x010fe0, 0x010ff6, 1}, - {0x010ff7, 0x010fff, -1}, {0x011000, 0x011000, 1}, - {0x011001, 0x011001, 0}, {0x011002, 0x011037, 1}, - {0x011038, 0x011046, 0}, {0x011047, 0x01104d, 1}, - {0x01104e, 0x011051, -1}, {0x011052, 0x01106f, 1}, - {0x011070, 0x011070, 0}, {0x011071, 0x011072, 1}, - {0x011073, 0x011074, 0}, {0x011075, 0x011075, 1}, - {0x011076, 0x01107e, -1}, {0x01107f, 0x011081, 0}, - {0x011082, 0x0110b2, 1}, {0x0110b3, 0x0110b6, 0}, - {0x0110b7, 0x0110b8, 1}, {0x0110b9, 0x0110ba, 0}, - {0x0110bb, 0x0110c1, 1}, {0x0110c2, 0x0110c2, 0}, - {0x0110c3, 0x0110cc, -1}, {0x0110cd, 0x0110cd, 1}, - {0x0110ce, 0x0110cf, -1}, {0x0110d0, 0x0110e8, 1}, - {0x0110e9, 0x0110ef, -1}, {0x0110f0, 0x0110f9, 1}, - {0x0110fa, 0x0110ff, -1}, {0x011100, 0x011102, 0}, - {0x011103, 0x011126, 1}, {0x011127, 0x01112b, 0}, - {0x01112c, 0x01112c, 1}, {0x01112d, 0x011134, 0}, - {0x011135, 0x011135, -1}, {0x011136, 0x011147, 1}, - {0x011148, 0x01114f, -1}, {0x011150, 0x011172, 1}, - {0x011173, 0x011173, 0}, {0x011174, 0x011176, 1}, - {0x011177, 0x01117f, -1}, {0x011180, 0x011181, 0}, - {0x011182, 0x0111b5, 1}, {0x0111b6, 0x0111be, 0}, - {0x0111bf, 0x0111c8, 1}, {0x0111c9, 0x0111cc, 0}, - {0x0111cd, 0x0111ce, 1}, {0x0111cf, 0x0111cf, 0}, - {0x0111d0, 0x0111df, 1}, {0x0111e0, 0x0111e0, -1}, - {0x0111e1, 0x0111f4, 1}, {0x0111f5, 0x0111ff, -1}, - {0x011200, 0x011211, 1}, {0x011212, 0x011212, -1}, - {0x011213, 0x01122e, 1}, {0x01122f, 0x011231, 0}, - {0x011232, 0x011233, 1}, {0x011234, 0x011234, 0}, - {0x011235, 0x011235, 1}, {0x011236, 0x011237, 0}, - {0x011238, 0x01123d, 1}, {0x01123e, 0x01123e, 0}, - {0x01123f, 0x011240, 1}, {0x011241, 0x011241, 0}, - {0x011242, 0x01127f, -1}, {0x011280, 0x011286, 1}, - {0x011287, 0x011287, -1}, {0x011288, 0x011288, 1}, - {0x011289, 0x011289, -1}, {0x01128a, 0x01128d, 1}, - {0x01128e, 0x01128e, -1}, {0x01128f, 0x01129d, 1}, - {0x01129e, 0x01129e, -1}, {0x01129f, 0x0112a9, 1}, - {0x0112aa, 0x0112af, -1}, {0x0112b0, 0x0112de, 1}, - {0x0112df, 0x0112df, 0}, {0x0112e0, 0x0112e2, 1}, - {0x0112e3, 0x0112ea, 0}, {0x0112eb, 0x0112ef, -1}, - {0x0112f0, 0x0112f9, 1}, {0x0112fa, 0x0112ff, -1}, - {0x011300, 0x011301, 0}, {0x011302, 0x011303, 1}, - {0x011304, 0x011304, -1}, {0x011305, 0x01130c, 1}, - {0x01130d, 0x01130e, -1}, {0x01130f, 0x011310, 1}, - {0x011311, 0x011312, -1}, {0x011313, 0x011328, 1}, - {0x011329, 0x011329, -1}, {0x01132a, 0x011330, 1}, - {0x011331, 0x011331, -1}, {0x011332, 0x011333, 1}, - {0x011334, 0x011334, -1}, {0x011335, 0x011339, 1}, - {0x01133a, 0x01133a, -1}, {0x01133b, 0x01133c, 0}, - {0x01133d, 0x01133f, 1}, {0x011340, 0x011340, 0}, - {0x011341, 0x011344, 1}, {0x011345, 0x011346, -1}, - {0x011347, 0x011348, 1}, {0x011349, 0x01134a, -1}, - {0x01134b, 0x01134d, 1}, {0x01134e, 0x01134f, -1}, - {0x011350, 0x011350, 1}, {0x011351, 0x011356, -1}, - {0x011357, 0x011357, 1}, {0x011358, 0x01135c, -1}, - {0x01135d, 0x011363, 1}, {0x011364, 0x011365, -1}, - {0x011366, 0x01136c, 0}, {0x01136d, 0x01136f, -1}, - {0x011370, 0x011374, 0}, {0x011375, 0x01137f, -1}, - {0x011380, 0x011389, 1}, {0x01138a, 0x01138a, -1}, - {0x01138b, 0x01138b, 1}, {0x01138c, 0x01138d, -1}, - {0x01138e, 0x01138e, 1}, {0x01138f, 0x01138f, -1}, - {0x011390, 0x0113b5, 1}, {0x0113b6, 0x0113b6, -1}, - {0x0113b7, 0x0113ba, 1}, {0x0113bb, 0x0113c0, 0}, - {0x0113c1, 0x0113c1, -1}, {0x0113c2, 0x0113c2, 1}, - {0x0113c3, 0x0113c4, -1}, {0x0113c5, 0x0113c5, 1}, - {0x0113c6, 0x0113c6, -1}, {0x0113c7, 0x0113ca, 1}, - {0x0113cb, 0x0113cb, -1}, {0x0113cc, 0x0113cd, 1}, - {0x0113ce, 0x0113ce, 0}, {0x0113cf, 0x0113cf, 1}, - {0x0113d0, 0x0113d0, 0}, {0x0113d1, 0x0113d1, 1}, - {0x0113d2, 0x0113d2, 0}, {0x0113d3, 0x0113d5, 1}, - {0x0113d6, 0x0113d6, -1}, {0x0113d7, 0x0113d8, 1}, - {0x0113d9, 0x0113e0, -1}, {0x0113e1, 0x0113e2, 0}, - {0x0113e3, 0x0113ff, -1}, {0x011400, 0x011437, 1}, - {0x011438, 0x01143f, 0}, {0x011440, 0x011441, 1}, - {0x011442, 0x011444, 0}, {0x011445, 0x011445, 1}, - {0x011446, 0x011446, 0}, {0x011447, 0x01145b, 1}, - {0x01145c, 0x01145c, -1}, {0x01145d, 0x01145d, 1}, - {0x01145e, 0x01145e, 0}, {0x01145f, 0x011461, 1}, - {0x011462, 0x01147f, -1}, {0x011480, 0x0114b2, 1}, - {0x0114b3, 0x0114b8, 0}, {0x0114b9, 0x0114b9, 1}, - {0x0114ba, 0x0114ba, 0}, {0x0114bb, 0x0114be, 1}, - {0x0114bf, 0x0114c0, 0}, {0x0114c1, 0x0114c1, 1}, - {0x0114c2, 0x0114c3, 0}, {0x0114c4, 0x0114c7, 1}, - {0x0114c8, 0x0114cf, -1}, {0x0114d0, 0x0114d9, 1}, - {0x0114da, 0x01157f, -1}, {0x011580, 0x0115b1, 1}, - {0x0115b2, 0x0115b5, 0}, {0x0115b6, 0x0115b7, -1}, - {0x0115b8, 0x0115bb, 1}, {0x0115bc, 0x0115bd, 0}, - {0x0115be, 0x0115be, 1}, {0x0115bf, 0x0115c0, 0}, - {0x0115c1, 0x0115db, 1}, {0x0115dc, 0x0115dd, 0}, - {0x0115de, 0x0115ff, -1}, {0x011600, 0x011632, 1}, - {0x011633, 0x01163a, 0}, {0x01163b, 0x01163c, 1}, - {0x01163d, 0x01163d, 0}, {0x01163e, 0x01163e, 1}, - {0x01163f, 0x011640, 0}, {0x011641, 0x011644, 1}, - {0x011645, 0x01164f, -1}, {0x011650, 0x011659, 1}, - {0x01165a, 0x01165f, -1}, {0x011660, 0x01166c, 1}, - {0x01166d, 0x01167f, -1}, {0x011680, 0x0116aa, 1}, - {0x0116ab, 0x0116ab, 0}, {0x0116ac, 0x0116ac, 1}, - {0x0116ad, 0x0116ad, 0}, {0x0116ae, 0x0116af, 1}, - {0x0116b0, 0x0116b5, 0}, {0x0116b6, 0x0116b6, 1}, - {0x0116b7, 0x0116b7, 0}, {0x0116b8, 0x0116b9, 1}, - {0x0116ba, 0x0116bf, -1}, {0x0116c0, 0x0116c9, 1}, - {0x0116ca, 0x0116cf, -1}, {0x0116d0, 0x0116e3, 1}, - {0x0116e4, 0x0116ff, -1}, {0x011700, 0x01171a, 1}, - {0x01171b, 0x01171c, -1}, {0x01171d, 0x01171d, 0}, - {0x01171e, 0x01171e, 1}, {0x01171f, 0x01171f, 0}, - {0x011720, 0x011721, 1}, {0x011722, 0x011725, 0}, - {0x011726, 0x011726, 1}, {0x011727, 0x01172b, 0}, - {0x01172c, 0x01172f, -1}, {0x011730, 0x011746, 1}, - {0x011747, 0x0117ff, -1}, {0x011800, 0x01182e, 1}, - {0x01182f, 0x011837, 0}, {0x011838, 0x011838, 1}, - {0x011839, 0x01183a, 0}, {0x01183b, 0x01183b, 1}, - {0x01183c, 0x01189f, -1}, {0x0118a0, 0x0118f2, 1}, - {0x0118f3, 0x0118fe, -1}, {0x0118ff, 0x011906, 1}, - {0x011907, 0x011908, -1}, {0x011909, 0x011909, 1}, - {0x01190a, 0x01190b, -1}, {0x01190c, 0x011913, 1}, - {0x011914, 0x011914, -1}, {0x011915, 0x011916, 1}, - {0x011917, 0x011917, -1}, {0x011918, 0x011935, 1}, - {0x011936, 0x011936, -1}, {0x011937, 0x011938, 1}, - {0x011939, 0x01193a, -1}, {0x01193b, 0x01193c, 0}, - {0x01193d, 0x01193d, 1}, {0x01193e, 0x01193e, 0}, - {0x01193f, 0x011942, 1}, {0x011943, 0x011943, 0}, - {0x011944, 0x011946, 1}, {0x011947, 0x01194f, -1}, - {0x011950, 0x011959, 1}, {0x01195a, 0x01199f, -1}, - {0x0119a0, 0x0119a7, 1}, {0x0119a8, 0x0119a9, -1}, - {0x0119aa, 0x0119d3, 1}, {0x0119d4, 0x0119d7, 0}, - {0x0119d8, 0x0119d9, -1}, {0x0119da, 0x0119db, 0}, - {0x0119dc, 0x0119df, 1}, {0x0119e0, 0x0119e0, 0}, - {0x0119e1, 0x0119e4, 1}, {0x0119e5, 0x0119ff, -1}, - {0x011a00, 0x011a00, 1}, {0x011a01, 0x011a0a, 0}, - {0x011a0b, 0x011a32, 1}, {0x011a33, 0x011a38, 0}, - {0x011a39, 0x011a3a, 1}, {0x011a3b, 0x011a3e, 0}, - {0x011a3f, 0x011a46, 1}, {0x011a47, 0x011a47, 0}, - {0x011a48, 0x011a4f, -1}, {0x011a50, 0x011a50, 1}, - {0x011a51, 0x011a56, 0}, {0x011a57, 0x011a58, 1}, - {0x011a59, 0x011a5b, 0}, {0x011a5c, 0x011a89, 1}, - {0x011a8a, 0x011a96, 0}, {0x011a97, 0x011a97, 1}, - {0x011a98, 0x011a99, 0}, {0x011a9a, 0x011aa2, 1}, - {0x011aa3, 0x011aaf, -1}, {0x011ab0, 0x011af8, 1}, - {0x011af9, 0x011aff, -1}, {0x011b00, 0x011b09, 1}, - {0x011b0a, 0x011bbf, -1}, {0x011bc0, 0x011be1, 1}, - {0x011be2, 0x011bef, -1}, {0x011bf0, 0x011bf9, 1}, - {0x011bfa, 0x011bff, -1}, {0x011c00, 0x011c08, 1}, - {0x011c09, 0x011c09, -1}, {0x011c0a, 0x011c2f, 1}, - {0x011c30, 0x011c36, 0}, {0x011c37, 0x011c37, -1}, - {0x011c38, 0x011c3d, 0}, {0x011c3e, 0x011c3e, 1}, - {0x011c3f, 0x011c3f, 0}, {0x011c40, 0x011c45, 1}, - {0x011c46, 0x011c4f, -1}, {0x011c50, 0x011c6c, 1}, - {0x011c6d, 0x011c6f, -1}, {0x011c70, 0x011c8f, 1}, - {0x011c90, 0x011c91, -1}, {0x011c92, 0x011ca7, 0}, - {0x011ca8, 0x011ca8, -1}, {0x011ca9, 0x011ca9, 1}, - {0x011caa, 0x011cb0, 0}, {0x011cb1, 0x011cb1, 1}, - {0x011cb2, 0x011cb3, 0}, {0x011cb4, 0x011cb4, 1}, - {0x011cb5, 0x011cb6, 0}, {0x011cb7, 0x011cff, -1}, - {0x011d00, 0x011d06, 1}, {0x011d07, 0x011d07, -1}, - {0x011d08, 0x011d09, 1}, {0x011d0a, 0x011d0a, -1}, - {0x011d0b, 0x011d30, 1}, {0x011d31, 0x011d36, 0}, - {0x011d37, 0x011d39, -1}, {0x011d3a, 0x011d3a, 0}, - {0x011d3b, 0x011d3b, -1}, {0x011d3c, 0x011d3d, 0}, - {0x011d3e, 0x011d3e, -1}, {0x011d3f, 0x011d45, 0}, - {0x011d46, 0x011d46, 1}, {0x011d47, 0x011d47, 0}, - {0x011d48, 0x011d4f, -1}, {0x011d50, 0x011d59, 1}, - {0x011d5a, 0x011d5f, -1}, {0x011d60, 0x011d65, 1}, - {0x011d66, 0x011d66, -1}, {0x011d67, 0x011d68, 1}, - {0x011d69, 0x011d69, -1}, {0x011d6a, 0x011d8e, 1}, - {0x011d8f, 0x011d8f, -1}, {0x011d90, 0x011d91, 0}, - {0x011d92, 0x011d92, -1}, {0x011d93, 0x011d94, 1}, - {0x011d95, 0x011d95, 0}, {0x011d96, 0x011d96, 1}, - {0x011d97, 0x011d97, 0}, {0x011d98, 0x011d98, 1}, - {0x011d99, 0x011d9f, -1}, {0x011da0, 0x011da9, 1}, - {0x011daa, 0x011edf, -1}, {0x011ee0, 0x011ef2, 1}, - {0x011ef3, 0x011ef4, 0}, {0x011ef5, 0x011ef8, 1}, - {0x011ef9, 0x011eff, -1}, {0x011f00, 0x011f01, 0}, - {0x011f02, 0x011f10, 1}, {0x011f11, 0x011f11, -1}, - {0x011f12, 0x011f35, 1}, {0x011f36, 0x011f3a, 0}, - {0x011f3b, 0x011f3d, -1}, {0x011f3e, 0x011f3f, 1}, - {0x011f40, 0x011f40, 0}, {0x011f41, 0x011f41, 1}, - {0x011f42, 0x011f42, 0}, {0x011f43, 0x011f59, 1}, - {0x011f5a, 0x011f5a, 0}, {0x011f5b, 0x011faf, -1}, - {0x011fb0, 0x011fb0, 1}, {0x011fb1, 0x011fbf, -1}, - {0x011fc0, 0x011ff1, 1}, {0x011ff2, 0x011ffe, -1}, - {0x011fff, 0x012399, 1}, {0x01239a, 0x0123ff, -1}, - {0x012400, 0x01246e, 1}, {0x01246f, 0x01246f, -1}, - {0x012470, 0x012474, 1}, {0x012475, 0x01247f, -1}, - {0x012480, 0x012543, 1}, {0x012544, 0x012f8f, -1}, - {0x012f90, 0x012ff2, 1}, {0x012ff3, 0x012fff, -1}, - {0x013000, 0x01343f, 1}, {0x013440, 0x013440, 0}, - {0x013441, 0x013446, 1}, {0x013447, 0x013455, 0}, - {0x013456, 0x01345f, -1}, {0x013460, 0x0143fa, 1}, - {0x0143fb, 0x0143ff, -1}, {0x014400, 0x014646, 1}, - {0x014647, 0x0160ff, -1}, {0x016100, 0x01611d, 1}, - {0x01611e, 0x016129, 0}, {0x01612a, 0x01612c, 1}, - {0x01612d, 0x01612f, 0}, {0x016130, 0x016139, 1}, - {0x01613a, 0x0167ff, -1}, {0x016800, 0x016a38, 1}, - {0x016a39, 0x016a3f, -1}, {0x016a40, 0x016a5e, 1}, - {0x016a5f, 0x016a5f, -1}, {0x016a60, 0x016a69, 1}, - {0x016a6a, 0x016a6d, -1}, {0x016a6e, 0x016abe, 1}, - {0x016abf, 0x016abf, -1}, {0x016ac0, 0x016ac9, 1}, - {0x016aca, 0x016acf, -1}, {0x016ad0, 0x016aed, 1}, - {0x016aee, 0x016aef, -1}, {0x016af0, 0x016af4, 0}, - {0x016af5, 0x016af5, 1}, {0x016af6, 0x016aff, -1}, - {0x016b00, 0x016b2f, 1}, {0x016b30, 0x016b36, 0}, - {0x016b37, 0x016b45, 1}, {0x016b46, 0x016b4f, -1}, - {0x016b50, 0x016b59, 1}, {0x016b5a, 0x016b5a, -1}, - {0x016b5b, 0x016b61, 1}, {0x016b62, 0x016b62, -1}, - {0x016b63, 0x016b77, 1}, {0x016b78, 0x016b7c, -1}, - {0x016b7d, 0x016b8f, 1}, {0x016b90, 0x016d3f, -1}, - {0x016d40, 0x016d79, 1}, {0x016d7a, 0x016e3f, -1}, - {0x016e40, 0x016e9a, 1}, {0x016e9b, 0x016eff, -1}, - {0x016f00, 0x016f4a, 1}, {0x016f4b, 0x016f4e, -1}, - {0x016f4f, 0x016f4f, 0}, {0x016f50, 0x016f87, 1}, - {0x016f88, 0x016f8e, -1}, {0x016f8f, 0x016f92, 0}, - {0x016f93, 0x016f9f, 1}, {0x016fa0, 0x016fdf, -1}, - {0x016fe0, 0x016fe3, 2}, {0x016fe4, 0x016fe4, 0}, - {0x016fe5, 0x016fef, -1}, {0x016ff0, 0x016ff1, 2}, - {0x016ff2, 0x016fff, -1}, {0x017000, 0x0187f7, 2}, - {0x0187f8, 0x0187ff, -1}, {0x018800, 0x018cd5, 2}, - {0x018cd6, 0x018cfe, -1}, {0x018cff, 0x018d08, 2}, - {0x018d09, 0x01afef, -1}, {0x01aff0, 0x01aff3, 2}, - {0x01aff4, 0x01aff4, -1}, {0x01aff5, 0x01affb, 2}, - {0x01affc, 0x01affc, -1}, {0x01affd, 0x01affe, 2}, - {0x01afff, 0x01afff, -1}, {0x01b000, 0x01b122, 2}, - {0x01b123, 0x01b131, -1}, {0x01b132, 0x01b132, 2}, - {0x01b133, 0x01b14f, -1}, {0x01b150, 0x01b152, 2}, - {0x01b153, 0x01b154, -1}, {0x01b155, 0x01b155, 2}, - {0x01b156, 0x01b163, -1}, {0x01b164, 0x01b167, 2}, - {0x01b168, 0x01b16f, -1}, {0x01b170, 0x01b2fb, 2}, - {0x01b2fc, 0x01bbff, -1}, {0x01bc00, 0x01bc6a, 1}, - {0x01bc6b, 0x01bc6f, -1}, {0x01bc70, 0x01bc7c, 1}, - {0x01bc7d, 0x01bc7f, -1}, {0x01bc80, 0x01bc88, 1}, - {0x01bc89, 0x01bc8f, -1}, {0x01bc90, 0x01bc99, 1}, - {0x01bc9a, 0x01bc9b, -1}, {0x01bc9c, 0x01bc9c, 1}, - {0x01bc9d, 0x01bc9e, 0}, {0x01bc9f, 0x01bc9f, 1}, - {0x01bca0, 0x01bca3, 0}, {0x01bca4, 0x01cbff, -1}, - {0x01cc00, 0x01ccf9, 1}, {0x01ccfa, 0x01ccff, -1}, - {0x01cd00, 0x01ceb3, 1}, {0x01ceb4, 0x01ceff, -1}, - {0x01cf00, 0x01cf2d, 0}, {0x01cf2e, 0x01cf2f, -1}, - {0x01cf30, 0x01cf46, 0}, {0x01cf47, 0x01cf4f, -1}, - {0x01cf50, 0x01cfc3, 1}, {0x01cfc4, 0x01cfff, -1}, - {0x01d000, 0x01d0f5, 1}, {0x01d0f6, 0x01d0ff, -1}, - {0x01d100, 0x01d126, 1}, {0x01d127, 0x01d128, -1}, - {0x01d129, 0x01d166, 1}, {0x01d167, 0x01d169, 0}, - {0x01d16a, 0x01d172, 1}, {0x01d173, 0x01d182, 0}, - {0x01d183, 0x01d184, 1}, {0x01d185, 0x01d18b, 0}, - {0x01d18c, 0x01d1a9, 1}, {0x01d1aa, 0x01d1ad, 0}, - {0x01d1ae, 0x01d1ea, 1}, {0x01d1eb, 0x01d1ff, -1}, - {0x01d200, 0x01d241, 1}, {0x01d242, 0x01d244, 0}, - {0x01d245, 0x01d245, 1}, {0x01d246, 0x01d2bf, -1}, - {0x01d2c0, 0x01d2d3, 1}, {0x01d2d4, 0x01d2df, -1}, - {0x01d2e0, 0x01d2f3, 1}, {0x01d2f4, 0x01d2ff, -1}, - {0x01d300, 0x01d356, 2}, {0x01d357, 0x01d35f, -1}, - {0x01d360, 0x01d376, 2}, {0x01d377, 0x01d378, 1}, - {0x01d379, 0x01d3ff, -1}, {0x01d400, 0x01d454, 1}, - {0x01d455, 0x01d455, -1}, {0x01d456, 0x01d49c, 1}, - {0x01d49d, 0x01d49d, -1}, {0x01d49e, 0x01d49f, 1}, - {0x01d4a0, 0x01d4a1, -1}, {0x01d4a2, 0x01d4a2, 1}, - {0x01d4a3, 0x01d4a4, -1}, {0x01d4a5, 0x01d4a6, 1}, - {0x01d4a7, 0x01d4a8, -1}, {0x01d4a9, 0x01d4ac, 1}, - {0x01d4ad, 0x01d4ad, -1}, {0x01d4ae, 0x01d4b9, 1}, - {0x01d4ba, 0x01d4ba, -1}, {0x01d4bb, 0x01d4bb, 1}, - {0x01d4bc, 0x01d4bc, -1}, {0x01d4bd, 0x01d4c3, 1}, - {0x01d4c4, 0x01d4c4, -1}, {0x01d4c5, 0x01d505, 1}, - {0x01d506, 0x01d506, -1}, {0x01d507, 0x01d50a, 1}, - {0x01d50b, 0x01d50c, -1}, {0x01d50d, 0x01d514, 1}, - {0x01d515, 0x01d515, -1}, {0x01d516, 0x01d51c, 1}, - {0x01d51d, 0x01d51d, -1}, {0x01d51e, 0x01d539, 1}, - {0x01d53a, 0x01d53a, -1}, {0x01d53b, 0x01d53e, 1}, - {0x01d53f, 0x01d53f, -1}, {0x01d540, 0x01d544, 1}, - {0x01d545, 0x01d545, -1}, {0x01d546, 0x01d546, 1}, - {0x01d547, 0x01d549, -1}, {0x01d54a, 0x01d550, 1}, - {0x01d551, 0x01d551, -1}, {0x01d552, 0x01d6a5, 1}, - {0x01d6a6, 0x01d6a7, -1}, {0x01d6a8, 0x01d7cb, 1}, - {0x01d7cc, 0x01d7cd, -1}, {0x01d7ce, 0x01d9ff, 1}, - {0x01da00, 0x01da36, 0}, {0x01da37, 0x01da3a, 1}, - {0x01da3b, 0x01da6c, 0}, {0x01da6d, 0x01da74, 1}, - {0x01da75, 0x01da75, 0}, {0x01da76, 0x01da83, 1}, - {0x01da84, 0x01da84, 0}, {0x01da85, 0x01da8b, 1}, - {0x01da8c, 0x01da9a, -1}, {0x01da9b, 0x01da9f, 0}, - {0x01daa0, 0x01daa0, -1}, {0x01daa1, 0x01daaf, 0}, - {0x01dab0, 0x01deff, -1}, {0x01df00, 0x01df1e, 1}, - {0x01df1f, 0x01df24, -1}, {0x01df25, 0x01df2a, 1}, - {0x01df2b, 0x01dfff, -1}, {0x01e000, 0x01e006, 0}, - {0x01e007, 0x01e007, -1}, {0x01e008, 0x01e018, 0}, - {0x01e019, 0x01e01a, -1}, {0x01e01b, 0x01e021, 0}, - {0x01e022, 0x01e022, -1}, {0x01e023, 0x01e024, 0}, - {0x01e025, 0x01e025, -1}, {0x01e026, 0x01e02a, 0}, - {0x01e02b, 0x01e02f, -1}, {0x01e030, 0x01e06d, 1}, - {0x01e06e, 0x01e08e, -1}, {0x01e08f, 0x01e08f, 0}, - {0x01e090, 0x01e0ff, -1}, {0x01e100, 0x01e12c, 1}, - {0x01e12d, 0x01e12f, -1}, {0x01e130, 0x01e136, 0}, - {0x01e137, 0x01e13d, 1}, {0x01e13e, 0x01e13f, -1}, - {0x01e140, 0x01e149, 1}, {0x01e14a, 0x01e14d, -1}, - {0x01e14e, 0x01e14f, 1}, {0x01e150, 0x01e28f, -1}, - {0x01e290, 0x01e2ad, 1}, {0x01e2ae, 0x01e2ae, 0}, - {0x01e2af, 0x01e2bf, -1}, {0x01e2c0, 0x01e2eb, 1}, - {0x01e2ec, 0x01e2ef, 0}, {0x01e2f0, 0x01e2f9, 1}, - {0x01e2fa, 0x01e2fe, -1}, {0x01e2ff, 0x01e2ff, 1}, - {0x01e300, 0x01e4cf, -1}, {0x01e4d0, 0x01e4eb, 1}, - {0x01e4ec, 0x01e4ef, 0}, {0x01e4f0, 0x01e4f9, 1}, - {0x01e4fa, 0x01e5cf, -1}, {0x01e5d0, 0x01e5ed, 1}, - {0x01e5ee, 0x01e5ef, 0}, {0x01e5f0, 0x01e5fa, 1}, - {0x01e5fb, 0x01e5fe, -1}, {0x01e5ff, 0x01e5ff, 1}, - {0x01e600, 0x01e7df, -1}, {0x01e7e0, 0x01e7e6, 1}, - {0x01e7e7, 0x01e7e7, -1}, {0x01e7e8, 0x01e7eb, 1}, - {0x01e7ec, 0x01e7ec, -1}, {0x01e7ed, 0x01e7ee, 1}, - {0x01e7ef, 0x01e7ef, -1}, {0x01e7f0, 0x01e7fe, 1}, - {0x01e7ff, 0x01e7ff, -1}, {0x01e800, 0x01e8c4, 1}, - {0x01e8c5, 0x01e8c6, -1}, {0x01e8c7, 0x01e8cf, 1}, - {0x01e8d0, 0x01e8d6, 0}, {0x01e8d7, 0x01e8ff, -1}, - {0x01e900, 0x01e943, 1}, {0x01e944, 0x01e94a, 0}, - {0x01e94b, 0x01e94b, 1}, {0x01e94c, 0x01e94f, -1}, - {0x01e950, 0x01e959, 1}, {0x01e95a, 0x01e95d, -1}, - {0x01e95e, 0x01e95f, 1}, {0x01e960, 0x01ec70, -1}, - {0x01ec71, 0x01ecb4, 1}, {0x01ecb5, 0x01ed00, -1}, - {0x01ed01, 0x01ed3d, 1}, {0x01ed3e, 0x01edff, -1}, - {0x01ee00, 0x01ee03, 1}, {0x01ee04, 0x01ee04, -1}, - {0x01ee05, 0x01ee1f, 1}, {0x01ee20, 0x01ee20, -1}, - {0x01ee21, 0x01ee22, 1}, {0x01ee23, 0x01ee23, -1}, - {0x01ee24, 0x01ee24, 1}, {0x01ee25, 0x01ee26, -1}, - {0x01ee27, 0x01ee27, 1}, {0x01ee28, 0x01ee28, -1}, - {0x01ee29, 0x01ee32, 1}, {0x01ee33, 0x01ee33, -1}, - {0x01ee34, 0x01ee37, 1}, {0x01ee38, 0x01ee38, -1}, - {0x01ee39, 0x01ee39, 1}, {0x01ee3a, 0x01ee3a, -1}, - {0x01ee3b, 0x01ee3b, 1}, {0x01ee3c, 0x01ee41, -1}, - {0x01ee42, 0x01ee42, 1}, {0x01ee43, 0x01ee46, -1}, - {0x01ee47, 0x01ee47, 1}, {0x01ee48, 0x01ee48, -1}, - {0x01ee49, 0x01ee49, 1}, {0x01ee4a, 0x01ee4a, -1}, - {0x01ee4b, 0x01ee4b, 1}, {0x01ee4c, 0x01ee4c, -1}, - {0x01ee4d, 0x01ee4f, 1}, {0x01ee50, 0x01ee50, -1}, - {0x01ee51, 0x01ee52, 1}, {0x01ee53, 0x01ee53, -1}, - {0x01ee54, 0x01ee54, 1}, {0x01ee55, 0x01ee56, -1}, - {0x01ee57, 0x01ee57, 1}, {0x01ee58, 0x01ee58, -1}, - {0x01ee59, 0x01ee59, 1}, {0x01ee5a, 0x01ee5a, -1}, - {0x01ee5b, 0x01ee5b, 1}, {0x01ee5c, 0x01ee5c, -1}, - {0x01ee5d, 0x01ee5d, 1}, {0x01ee5e, 0x01ee5e, -1}, - {0x01ee5f, 0x01ee5f, 1}, {0x01ee60, 0x01ee60, -1}, - {0x01ee61, 0x01ee62, 1}, {0x01ee63, 0x01ee63, -1}, - {0x01ee64, 0x01ee64, 1}, {0x01ee65, 0x01ee66, -1}, - {0x01ee67, 0x01ee6a, 1}, {0x01ee6b, 0x01ee6b, -1}, - {0x01ee6c, 0x01ee72, 1}, {0x01ee73, 0x01ee73, -1}, - {0x01ee74, 0x01ee77, 1}, {0x01ee78, 0x01ee78, -1}, - {0x01ee79, 0x01ee7c, 1}, {0x01ee7d, 0x01ee7d, -1}, - {0x01ee7e, 0x01ee7e, 1}, {0x01ee7f, 0x01ee7f, -1}, - {0x01ee80, 0x01ee89, 1}, {0x01ee8a, 0x01ee8a, -1}, - {0x01ee8b, 0x01ee9b, 1}, {0x01ee9c, 0x01eea0, -1}, - {0x01eea1, 0x01eea3, 1}, {0x01eea4, 0x01eea4, -1}, - {0x01eea5, 0x01eea9, 1}, {0x01eeaa, 0x01eeaa, -1}, - {0x01eeab, 0x01eebb, 1}, {0x01eebc, 0x01eeef, -1}, - {0x01eef0, 0x01eef1, 1}, {0x01eef2, 0x01efff, -1}, - {0x01f000, 0x01f003, 1}, {0x01f004, 0x01f004, 2}, - {0x01f005, 0x01f02b, 1}, {0x01f02c, 0x01f02f, -1}, - {0x01f030, 0x01f093, 1}, {0x01f094, 0x01f09f, -1}, - {0x01f0a0, 0x01f0ae, 1}, {0x01f0af, 0x01f0b0, -1}, - {0x01f0b1, 0x01f0bf, 1}, {0x01f0c0, 0x01f0c0, -1}, - {0x01f0c1, 0x01f0ce, 1}, {0x01f0cf, 0x01f0cf, 2}, - {0x01f0d0, 0x01f0d0, -1}, {0x01f0d1, 0x01f0f5, 1}, - {0x01f0f6, 0x01f0ff, -1}, {0x01f100, 0x01f18d, 1}, - {0x01f18e, 0x01f18e, 2}, {0x01f18f, 0x01f190, 1}, - {0x01f191, 0x01f19a, 2}, {0x01f19b, 0x01f1ad, 1}, - {0x01f1ae, 0x01f1e5, -1}, {0x01f1e6, 0x01f1ff, 1}, - {0x01f200, 0x01f202, 2}, {0x01f203, 0x01f20f, -1}, - {0x01f210, 0x01f23b, 2}, {0x01f23c, 0x01f23f, -1}, - {0x01f240, 0x01f248, 2}, {0x01f249, 0x01f24f, -1}, - {0x01f250, 0x01f251, 2}, {0x01f252, 0x01f25f, -1}, - {0x01f260, 0x01f265, 2}, {0x01f266, 0x01f2ff, -1}, - {0x01f300, 0x01f320, 2}, {0x01f321, 0x01f32c, 1}, - {0x01f32d, 0x01f335, 2}, {0x01f336, 0x01f336, 1}, - {0x01f337, 0x01f37c, 2}, {0x01f37d, 0x01f37d, 1}, - {0x01f37e, 0x01f393, 2}, {0x01f394, 0x01f39f, 1}, - {0x01f3a0, 0x01f3ca, 2}, {0x01f3cb, 0x01f3ce, 1}, - {0x01f3cf, 0x01f3d3, 2}, {0x01f3d4, 0x01f3df, 1}, - {0x01f3e0, 0x01f3f0, 2}, {0x01f3f1, 0x01f3f3, 1}, - {0x01f3f4, 0x01f3f4, 2}, {0x01f3f5, 0x01f3f7, 1}, - {0x01f3f8, 0x01f43e, 2}, {0x01f43f, 0x01f43f, 1}, - {0x01f440, 0x01f440, 2}, {0x01f441, 0x01f441, 1}, - {0x01f442, 0x01f4fc, 2}, {0x01f4fd, 0x01f4fe, 1}, - {0x01f4ff, 0x01f53d, 2}, {0x01f53e, 0x01f54a, 1}, - {0x01f54b, 0x01f54e, 2}, {0x01f54f, 0x01f54f, 1}, - {0x01f550, 0x01f567, 2}, {0x01f568, 0x01f579, 1}, - {0x01f57a, 0x01f57a, 2}, {0x01f57b, 0x01f594, 1}, - {0x01f595, 0x01f596, 2}, {0x01f597, 0x01f5a3, 1}, - {0x01f5a4, 0x01f5a4, 2}, {0x01f5a5, 0x01f5fa, 1}, - {0x01f5fb, 0x01f64f, 2}, {0x01f650, 0x01f67f, 1}, - {0x01f680, 0x01f6c5, 2}, {0x01f6c6, 0x01f6cb, 1}, - {0x01f6cc, 0x01f6cc, 2}, {0x01f6cd, 0x01f6cf, 1}, - {0x01f6d0, 0x01f6d2, 2}, {0x01f6d3, 0x01f6d4, 1}, - {0x01f6d5, 0x01f6d7, 2}, {0x01f6d8, 0x01f6db, -1}, - {0x01f6dc, 0x01f6df, 2}, {0x01f6e0, 0x01f6ea, 1}, - {0x01f6eb, 0x01f6ec, 2}, {0x01f6ed, 0x01f6ef, -1}, - {0x01f6f0, 0x01f6f3, 1}, {0x01f6f4, 0x01f6fc, 2}, - {0x01f6fd, 0x01f6ff, -1}, {0x01f700, 0x01f776, 1}, - {0x01f777, 0x01f77a, -1}, {0x01f77b, 0x01f7d9, 1}, - {0x01f7da, 0x01f7df, -1}, {0x01f7e0, 0x01f7eb, 2}, - {0x01f7ec, 0x01f7ef, -1}, {0x01f7f0, 0x01f7f0, 2}, - {0x01f7f1, 0x01f7ff, -1}, {0x01f800, 0x01f80b, 1}, - {0x01f80c, 0x01f80f, -1}, {0x01f810, 0x01f847, 1}, - {0x01f848, 0x01f84f, -1}, {0x01f850, 0x01f859, 1}, - {0x01f85a, 0x01f85f, -1}, {0x01f860, 0x01f887, 1}, - {0x01f888, 0x01f88f, -1}, {0x01f890, 0x01f8ad, 1}, - {0x01f8ae, 0x01f8af, -1}, {0x01f8b0, 0x01f8bb, 1}, - {0x01f8bc, 0x01f8bf, -1}, {0x01f8c0, 0x01f8c1, 1}, - {0x01f8c2, 0x01f8ff, -1}, {0x01f900, 0x01f90b, 1}, - {0x01f90c, 0x01f93a, 2}, {0x01f93b, 0x01f93b, 1}, - {0x01f93c, 0x01f945, 2}, {0x01f946, 0x01f946, 1}, - {0x01f947, 0x01f9ff, 2}, {0x01fa00, 0x01fa53, 1}, - {0x01fa54, 0x01fa5f, -1}, {0x01fa60, 0x01fa6d, 1}, - {0x01fa6e, 0x01fa6f, -1}, {0x01fa70, 0x01fa7c, 2}, - {0x01fa7d, 0x01fa7f, -1}, {0x01fa80, 0x01fa89, 2}, - {0x01fa8a, 0x01fa8e, -1}, {0x01fa8f, 0x01fac6, 2}, - {0x01fac7, 0x01facd, -1}, {0x01face, 0x01fadc, 2}, - {0x01fadd, 0x01fade, -1}, {0x01fadf, 0x01fae9, 2}, - {0x01faea, 0x01faef, -1}, {0x01faf0, 0x01faf8, 2}, - {0x01faf9, 0x01faff, -1}, {0x01fb00, 0x01fb92, 1}, - {0x01fb93, 0x01fb93, -1}, {0x01fb94, 0x01fbf9, 1}, - {0x01fbfa, 0x01ffff, -1}, {0x020000, 0x02a6df, 2}, - {0x02a6e0, 0x02a6ff, -1}, {0x02a700, 0x02b739, 2}, - {0x02b73a, 0x02b73f, -1}, {0x02b740, 0x02b81d, 2}, - {0x02b81e, 0x02b81f, -1}, {0x02b820, 0x02cea1, 2}, - {0x02cea2, 0x02ceaf, -1}, {0x02ceb0, 0x02ebe0, 2}, - {0x02ebe1, 0x02ebef, -1}, {0x02ebf0, 0x02ee5d, 2}, - {0x02ee5e, 0x02f7ff, -1}, {0x02f800, 0x02fa1d, 2}, - {0x02fa1e, 0x02ffff, -1}, {0x030000, 0x03134a, 2}, - {0x03134b, 0x03134f, -1}, {0x031350, 0x0323af, 2}, - {0x0323b0, 0x0e0000, -1}, {0x0e0001, 0x0e0001, 0}, - {0x0e0002, 0x0e001f, -1}, {0x0e0020, 0x0e007f, 0}, - {0x0e0080, 0x0e00ff, -1}, {0x0e0100, 0x0e01ef, 0}, - {0x0e01f0, 0x0effff, -1}, {0x0f0000, 0x0ffffd, 1}, - {0x0ffffe, 0x0fffff, -1}, {0x100000, 0x10fffd, 1}, - {0x10fffe, 0x10ffff, -1}}; +static const uint32_t wcw0_lo[] = { + 0x000300, 0x000483, 0x000591, 0x0005bf, 0x0005c1, 0x0005c4, 0x0005c7, 0x000610, + 0x00061c, 0x00064b, 0x000670, 0x0006d6, 0x0006df, 0x0006e7, 0x0006ea, 0x000711, + 0x000730, 0x0007a6, 0x0007eb, 0x0007fd, 0x000816, 0x00081b, 0x000825, 0x000829, + 0x000859, 0x000897, 0x0008ca, 0x0008e3, 0x00093a, 0x00093c, 0x000941, 0x00094d, + 0x000951, 0x000962, 0x000981, 0x0009bc, 0x0009c1, 0x0009cd, 0x0009e2, 0x0009fe, + 0x000a01, 0x000a3c, 0x000a41, 0x000a47, 0x000a4b, 0x000a51, 0x000a70, 0x000a75, + 0x000a81, 0x000abc, 0x000ac1, 0x000ac7, 0x000acd, 0x000ae2, 0x000afa, 0x000b01, + 0x000b3c, 0x000b3f, 0x000b41, 0x000b4d, 0x000b55, 0x000b62, 0x000b82, 0x000bc0, + 0x000bcd, 0x000c00, 0x000c04, 0x000c3c, 0x000c3e, 0x000c46, 0x000c4a, 0x000c55, + 0x000c62, 0x000c81, 0x000cbc, 0x000cbf, 0x000cc6, 0x000ccc, 0x000ce2, 0x000d00, + 0x000d3b, 0x000d41, 0x000d4d, 0x000d62, 0x000d81, 0x000dca, 0x000dd2, 0x000dd6, + 0x000e31, 0x000e34, 0x000e47, 0x000eb1, 0x000eb4, 0x000ec8, 0x000f18, 0x000f35, + 0x000f37, 0x000f39, 0x000f71, 0x000f80, 0x000f86, 0x000f8d, 0x000f99, 0x000fc6, + 0x00102d, 0x001032, 0x001039, 0x00103d, 0x001058, 0x00105e, 0x001071, 0x001082, + 0x001085, 0x00108d, 0x00109d, 0x001160, 0x00135d, 0x001712, 0x001732, 0x001752, + 0x001772, 0x0017b4, 0x0017b7, 0x0017c6, 0x0017c9, 0x0017dd, 0x00180b, 0x001885, + 0x0018a9, 0x001920, 0x001927, 0x001932, 0x001939, 0x001a17, 0x001a1b, 0x001a56, + 0x001a58, 0x001a60, 0x001a62, 0x001a65, 0x001a73, 0x001a7f, 0x001ab0, 0x001b00, + 0x001b34, 0x001b36, 0x001b3c, 0x001b42, 0x001b6b, 0x001b80, 0x001ba2, 0x001ba8, + 0x001bab, 0x001be6, 0x001be8, 0x001bed, 0x001bef, 0x001c2c, 0x001c36, 0x001cd0, + 0x001cd4, 0x001ce2, 0x001ced, 0x001cf4, 0x001cf8, 0x001dc0, 0x00200b, 0x00202a, + 0x002060, 0x002066, 0x0020d0, 0x002cef, 0x002d7f, 0x002de0, 0x00302a, 0x003099, + 0x003164, 0x00a66f, 0x00a674, 0x00a69e, 0x00a6f0, 0x00a802, 0x00a806, 0x00a80b, + 0x00a825, 0x00a82c, 0x00a8c4, 0x00a8e0, 0x00a8ff, 0x00a926, 0x00a947, 0x00a980, + 0x00a9b3, 0x00a9b6, 0x00a9bc, 0x00a9e5, 0x00aa29, 0x00aa31, 0x00aa35, 0x00aa43, + 0x00aa4c, 0x00aa7c, 0x00aab0, 0x00aab2, 0x00aab7, 0x00aabe, 0x00aac1, 0x00aaec, + 0x00aaf6, 0x00abe5, 0x00abe8, 0x00abed, 0x00d7b0, 0x00d7cb, 0x00fb1e, 0x00fe00, + 0x00fe20, 0x00feff, 0x00ffa0, 0x0101fd, 0x0102e0, 0x010376, 0x010a01, 0x010a05, + 0x010a0c, 0x010a38, 0x010a3f, 0x010ae5, 0x010d24, 0x010d69, 0x010eab, 0x010efc, + 0x010f46, 0x010f82, 0x011001, 0x011038, 0x011070, 0x011073, 0x01107f, 0x0110b3, + 0x0110b9, 0x0110c2, 0x011100, 0x011127, 0x01112d, 0x011173, 0x011180, 0x0111b6, + 0x0111c9, 0x0111cf, 0x01122f, 0x011234, 0x011236, 0x01123e, 0x011241, 0x0112df, + 0x0112e3, 0x011300, 0x01133b, 0x011340, 0x011366, 0x011370, 0x0113bb, 0x0113ce, + 0x0113d0, 0x0113d2, 0x0113e1, 0x011438, 0x011442, 0x011446, 0x01145e, 0x0114b3, + 0x0114ba, 0x0114bf, 0x0114c2, 0x0115b2, 0x0115bc, 0x0115bf, 0x0115dc, 0x011633, + 0x01163d, 0x01163f, 0x0116ab, 0x0116ad, 0x0116b0, 0x0116b7, 0x01171d, 0x01171f, + 0x011722, 0x011727, 0x01182f, 0x011839, 0x01193b, 0x01193e, 0x011943, 0x0119d4, + 0x0119da, 0x0119e0, 0x011a01, 0x011a33, 0x011a3b, 0x011a47, 0x011a51, 0x011a59, + 0x011a8a, 0x011a98, 0x011c30, 0x011c38, 0x011c3f, 0x011c92, 0x011caa, 0x011cb2, + 0x011cb5, 0x011d31, 0x011d3a, 0x011d3c, 0x011d3f, 0x011d47, 0x011d90, 0x011d95, + 0x011d97, 0x011ef3, 0x011f00, 0x011f36, 0x011f40, 0x011f42, 0x011f5a, 0x013440, + 0x013447, 0x01611e, 0x01612d, 0x016af0, 0x016b30, 0x016f4f, 0x016f8f, 0x016fe4, + 0x01bc9d, 0x01bca0, 0x01cf00, 0x01cf30, 0x01d167, 0x01d173, 0x01d185, 0x01d1aa, + 0x01d242, 0x01da00, 0x01da3b, 0x01da75, 0x01da84, 0x01da9b, 0x01daa1, 0x01e000, + 0x01e008, 0x01e01b, 0x01e023, 0x01e026, 0x01e08f, 0x01e130, 0x01e2ae, 0x01e2ec, + 0x01e4ec, 0x01e5ee, 0x01e8d0, 0x01e944, 0x0e0001, 0x0e0020, 0x0e0100 +}; +static const uint16_t wcw0_cnt[] = { + 0x006f, 0x0006, 0x002c, 0x0000, 0x0001, 0x0001, 0x0000, 0x000a, + 0x0000, 0x0014, 0x0000, 0x0006, 0x0005, 0x0001, 0x0003, 0x0000, + 0x001a, 0x000a, 0x0008, 0x0000, 0x0003, 0x0008, 0x0002, 0x0004, + 0x0002, 0x0008, 0x0017, 0x001f, 0x0000, 0x0000, 0x0007, 0x0000, + 0x0006, 0x0001, 0x0000, 0x0000, 0x0003, 0x0000, 0x0001, 0x0000, + 0x0001, 0x0000, 0x0001, 0x0001, 0x0002, 0x0000, 0x0001, 0x0000, + 0x0001, 0x0000, 0x0004, 0x0001, 0x0000, 0x0001, 0x0005, 0x0000, + 0x0000, 0x0000, 0x0003, 0x0000, 0x0001, 0x0001, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0002, 0x0003, 0x0001, + 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0003, 0x0000, 0x0001, 0x0000, 0x0000, 0x0002, 0x0000, + 0x0000, 0x0006, 0x0007, 0x0000, 0x0008, 0x0006, 0x0001, 0x0000, + 0x0000, 0x0000, 0x000d, 0x0004, 0x0001, 0x000a, 0x0023, 0x0000, + 0x0003, 0x0005, 0x0001, 0x0001, 0x0001, 0x0002, 0x0003, 0x0000, + 0x0001, 0x0000, 0x0000, 0x009f, 0x0002, 0x0002, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0006, 0x0000, 0x000a, 0x0000, 0x0004, 0x0001, + 0x0000, 0x0002, 0x0001, 0x0000, 0x0002, 0x0001, 0x0000, 0x0000, + 0x0006, 0x0000, 0x0000, 0x0007, 0x0009, 0x0000, 0x001e, 0x0003, + 0x0000, 0x0004, 0x0000, 0x0000, 0x0008, 0x0001, 0x0003, 0x0001, + 0x0002, 0x0000, 0x0001, 0x0000, 0x0002, 0x0007, 0x0001, 0x0002, + 0x000c, 0x0006, 0x0000, 0x0000, 0x0001, 0x003f, 0x0004, 0x0004, + 0x0004, 0x0009, 0x0020, 0x0002, 0x0000, 0x001f, 0x0003, 0x0001, + 0x0000, 0x0003, 0x0009, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, + 0x0001, 0x0000, 0x0001, 0x0011, 0x0000, 0x0007, 0x000a, 0x0002, + 0x0000, 0x0003, 0x0001, 0x0000, 0x0005, 0x0001, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0002, 0x0001, 0x0001, 0x0000, 0x0001, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0016, 0x0030, 0x0000, 0x000f, + 0x000f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0002, 0x0001, + 0x0003, 0x0002, 0x0000, 0x0001, 0x0003, 0x0004, 0x0001, 0x0003, + 0x000a, 0x0003, 0x0000, 0x000e, 0x0000, 0x0001, 0x0002, 0x0003, + 0x0001, 0x0000, 0x0002, 0x0004, 0x0007, 0x0000, 0x0001, 0x0008, + 0x0003, 0x0000, 0x0002, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, + 0x0007, 0x0001, 0x0001, 0x0000, 0x0006, 0x0004, 0x0005, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0007, 0x0002, 0x0000, 0x0000, 0x0005, + 0x0000, 0x0001, 0x0001, 0x0003, 0x0001, 0x0001, 0x0001, 0x0007, + 0x0000, 0x0001, 0x0000, 0x0000, 0x0005, 0x0000, 0x0000, 0x0000, + 0x0003, 0x0004, 0x0008, 0x0001, 0x0001, 0x0000, 0x0000, 0x0003, + 0x0001, 0x0000, 0x0009, 0x0005, 0x0003, 0x0000, 0x0005, 0x0002, + 0x000c, 0x0001, 0x0006, 0x0005, 0x0000, 0x0015, 0x0006, 0x0001, + 0x0001, 0x0005, 0x0000, 0x0001, 0x0006, 0x0000, 0x0001, 0x0000, + 0x0000, 0x0001, 0x0001, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, + 0x000e, 0x000b, 0x0002, 0x0004, 0x0006, 0x0000, 0x0003, 0x0000, + 0x0001, 0x0003, 0x002d, 0x0016, 0x0002, 0x000f, 0x0006, 0x0003, + 0x0002, 0x0036, 0x0031, 0x0000, 0x0000, 0x0004, 0x000e, 0x0006, + 0x0010, 0x0006, 0x0001, 0x0004, 0x0000, 0x0006, 0x0000, 0x0003, + 0x0003, 0x0001, 0x0006, 0x0006, 0x0000, 0x005f, 0x00ef +}; +#define WCW0_LEN 367 + +static const uint32_t wcw2_lo[] = { + 0x001100, 0x00231a, 0x002329, 0x0023e9, 0x0023f0, 0x0023f3, 0x0025fd, 0x002614, + 0x002630, 0x002648, 0x00267f, 0x00268a, 0x002693, 0x0026a1, 0x0026aa, 0x0026bd, + 0x0026c4, 0x0026ce, 0x0026d4, 0x0026ea, 0x0026f2, 0x0026f5, 0x0026fa, 0x0026fd, + 0x002705, 0x00270a, 0x002728, 0x00274c, 0x00274e, 0x002753, 0x002757, 0x002795, + 0x0027b0, 0x0027bf, 0x002b1b, 0x002b50, 0x002b55, 0x002e80, 0x002e9b, 0x002f00, + 0x002ff0, 0x00302e, 0x003041, 0x00309b, 0x003105, 0x003131, 0x003165, 0x003190, + 0x0031ef, 0x003220, 0x00a490, 0x00a960, 0x00ac00, 0x00f900, 0x00fa70, 0x00fe10, + 0x00fe30, 0x00fe54, 0x00fe68, 0x00ff01, 0x00ffe0, 0x016fe0, 0x016ff0, 0x017000, + 0x018800, 0x018cff, 0x01aff0, 0x01aff5, 0x01affd, 0x01b000, 0x01b132, 0x01b150, + 0x01b155, 0x01b164, 0x01b170, 0x01d300, 0x01d360, 0x01f004, 0x01f0cf, 0x01f18e, + 0x01f191, 0x01f200, 0x01f210, 0x01f240, 0x01f250, 0x01f260, 0x01f300, 0x01f32d, + 0x01f337, 0x01f37e, 0x01f3a0, 0x01f3cf, 0x01f3e0, 0x01f3f4, 0x01f3f8, 0x01f440, + 0x01f442, 0x01f4ff, 0x01f54b, 0x01f550, 0x01f57a, 0x01f595, 0x01f5a4, 0x01f5fb, + 0x01f680, 0x01f6cc, 0x01f6d0, 0x01f6d5, 0x01f6dc, 0x01f6eb, 0x01f6f4, 0x01f7e0, + 0x01f7f0, 0x01f90c, 0x01f93c, 0x01f947, 0x01fa70, 0x01fa80, 0x01fa8f, 0x01face, + 0x01fadf, 0x01faf0, 0x020000, 0x02a700, 0x02b740, 0x02b820, 0x02ceb0, 0x02ebf0, + 0x02f800, 0x030000, 0x031350 +}; +static const uint16_t wcw2_cnt[] = { + 0x005f, 0x0001, 0x0001, 0x0003, 0x0000, 0x0000, 0x0001, 0x0001, + 0x0007, 0x000b, 0x0000, 0x0005, 0x0000, 0x0000, 0x0001, 0x0001, + 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0002, + 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0019, 0x0058, 0x00d5, + 0x0039, 0x0010, 0x0055, 0x0064, 0x002a, 0x0032, 0x0029, 0x0055, + 0x002f, 0x726c, 0x0036, 0x001c, 0x2ba3, 0x016d, 0x0069, 0x0009, + 0x0022, 0x0012, 0x0003, 0x005f, 0x0006, 0x0003, 0x0001, 0x17f7, + 0x04d5, 0x0009, 0x0003, 0x0006, 0x0001, 0x0122, 0x0000, 0x0002, + 0x0000, 0x0003, 0x018b, 0x0056, 0x0016, 0x0000, 0x0000, 0x0000, + 0x0009, 0x0002, 0x002b, 0x0008, 0x0001, 0x0005, 0x0020, 0x0008, + 0x0045, 0x0015, 0x002a, 0x0004, 0x0010, 0x0000, 0x0046, 0x0000, + 0x00ba, 0x003e, 0x0003, 0x0017, 0x0000, 0x0001, 0x0000, 0x0054, + 0x0045, 0x0000, 0x0002, 0x0002, 0x0003, 0x0001, 0x0008, 0x000b, + 0x0000, 0x002e, 0x0009, 0x00b8, 0x000c, 0x0009, 0x0037, 0x000e, + 0x000a, 0x0008, 0xa6df, 0x1039, 0x00dd, 0x1681, 0x1d30, 0x026d, + 0x021d, 0x134a, 0x105f +}; +#define WCW2_LEN 131 -#define WCWIDTH_TABLE_LEN 2143 +static int wcrange(const uint32_t *lo, const uint16_t *cnt, int n, uint32_t ch) { + int l = 0, h = n - 1; + while (l <= h) { + int m = (l + h) / 2; + if (ch < lo[m]) h = m - 1; + else if (ch > lo[m] + cnt[m]) l = m + 1; + else return 1; + } + return 0; +} int wcwidth(uint32_t ch) { if (ch >= 0x20 && ch <= 0x7e) @@ -1099,18 +168,9 @@ int wcwidth(uint32_t ch) { return 1; if (ch < 0x20 || (ch > 0x7e && ch < 0xa0)) return ch == 0 ? 0 : -1; - - int lo = 0, hi = WCWIDTH_TABLE_LEN - 1; - while (lo <= hi) { - int mid = (lo + hi) / 2; - if (ch < wcwidth_table[mid].lo) - hi = mid - 1; - else if (ch > wcwidth_table[mid].hi) - lo = mid + 1; - else - return wcwidth_table[mid].w; - } - return -1; + if (wcrange(wcw0_lo, wcw0_cnt, WCW0_LEN, ch)) return 0; + if (wcrange(wcw2_lo, wcw2_cnt, WCW2_LEN, ch)) return 2; + return 1; } int iswprint(uint32_t ch) { return wcwidth(ch) >= 0; } From f8c5c1b0456c0829289da9b1a654f5206200087d Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Sat, 23 May 2026 00:17:17 -0400 Subject: [PATCH 09/47] =?UTF-8?q?=E2=9A=99=EF=B8=8F=20update=20npm=20setti?= =?UTF-8?q?ngs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- src/wcwidth.c | 276 ++++++++++++++++++++++--------------------- tasks/build-npm.ts | 8 +- tasks/bundle-wasm.ts | 6 +- 4 files changed, 151 insertions(+), 141 deletions(-) diff --git a/Makefile b/Makefile index 0bc07e7..cb6e391 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -CC = /usr/local/opt/llvm/bin/clang +CC = clang WASM_OPT ?= wasm-opt TARGET = clayterm.wasm SRC = src/module.c diff --git a/src/wcwidth.c b/src/wcwidth.c index a3a0faa..11922f5 100644 --- a/src/wcwidth.c +++ b/src/wcwidth.c @@ -13,150 +13,152 @@ #include static const uint32_t wcw0_lo[] = { - 0x000300, 0x000483, 0x000591, 0x0005bf, 0x0005c1, 0x0005c4, 0x0005c7, 0x000610, - 0x00061c, 0x00064b, 0x000670, 0x0006d6, 0x0006df, 0x0006e7, 0x0006ea, 0x000711, - 0x000730, 0x0007a6, 0x0007eb, 0x0007fd, 0x000816, 0x00081b, 0x000825, 0x000829, - 0x000859, 0x000897, 0x0008ca, 0x0008e3, 0x00093a, 0x00093c, 0x000941, 0x00094d, - 0x000951, 0x000962, 0x000981, 0x0009bc, 0x0009c1, 0x0009cd, 0x0009e2, 0x0009fe, - 0x000a01, 0x000a3c, 0x000a41, 0x000a47, 0x000a4b, 0x000a51, 0x000a70, 0x000a75, - 0x000a81, 0x000abc, 0x000ac1, 0x000ac7, 0x000acd, 0x000ae2, 0x000afa, 0x000b01, - 0x000b3c, 0x000b3f, 0x000b41, 0x000b4d, 0x000b55, 0x000b62, 0x000b82, 0x000bc0, - 0x000bcd, 0x000c00, 0x000c04, 0x000c3c, 0x000c3e, 0x000c46, 0x000c4a, 0x000c55, - 0x000c62, 0x000c81, 0x000cbc, 0x000cbf, 0x000cc6, 0x000ccc, 0x000ce2, 0x000d00, - 0x000d3b, 0x000d41, 0x000d4d, 0x000d62, 0x000d81, 0x000dca, 0x000dd2, 0x000dd6, - 0x000e31, 0x000e34, 0x000e47, 0x000eb1, 0x000eb4, 0x000ec8, 0x000f18, 0x000f35, - 0x000f37, 0x000f39, 0x000f71, 0x000f80, 0x000f86, 0x000f8d, 0x000f99, 0x000fc6, - 0x00102d, 0x001032, 0x001039, 0x00103d, 0x001058, 0x00105e, 0x001071, 0x001082, - 0x001085, 0x00108d, 0x00109d, 0x001160, 0x00135d, 0x001712, 0x001732, 0x001752, - 0x001772, 0x0017b4, 0x0017b7, 0x0017c6, 0x0017c9, 0x0017dd, 0x00180b, 0x001885, - 0x0018a9, 0x001920, 0x001927, 0x001932, 0x001939, 0x001a17, 0x001a1b, 0x001a56, - 0x001a58, 0x001a60, 0x001a62, 0x001a65, 0x001a73, 0x001a7f, 0x001ab0, 0x001b00, - 0x001b34, 0x001b36, 0x001b3c, 0x001b42, 0x001b6b, 0x001b80, 0x001ba2, 0x001ba8, - 0x001bab, 0x001be6, 0x001be8, 0x001bed, 0x001bef, 0x001c2c, 0x001c36, 0x001cd0, - 0x001cd4, 0x001ce2, 0x001ced, 0x001cf4, 0x001cf8, 0x001dc0, 0x00200b, 0x00202a, - 0x002060, 0x002066, 0x0020d0, 0x002cef, 0x002d7f, 0x002de0, 0x00302a, 0x003099, - 0x003164, 0x00a66f, 0x00a674, 0x00a69e, 0x00a6f0, 0x00a802, 0x00a806, 0x00a80b, - 0x00a825, 0x00a82c, 0x00a8c4, 0x00a8e0, 0x00a8ff, 0x00a926, 0x00a947, 0x00a980, - 0x00a9b3, 0x00a9b6, 0x00a9bc, 0x00a9e5, 0x00aa29, 0x00aa31, 0x00aa35, 0x00aa43, - 0x00aa4c, 0x00aa7c, 0x00aab0, 0x00aab2, 0x00aab7, 0x00aabe, 0x00aac1, 0x00aaec, - 0x00aaf6, 0x00abe5, 0x00abe8, 0x00abed, 0x00d7b0, 0x00d7cb, 0x00fb1e, 0x00fe00, - 0x00fe20, 0x00feff, 0x00ffa0, 0x0101fd, 0x0102e0, 0x010376, 0x010a01, 0x010a05, - 0x010a0c, 0x010a38, 0x010a3f, 0x010ae5, 0x010d24, 0x010d69, 0x010eab, 0x010efc, - 0x010f46, 0x010f82, 0x011001, 0x011038, 0x011070, 0x011073, 0x01107f, 0x0110b3, - 0x0110b9, 0x0110c2, 0x011100, 0x011127, 0x01112d, 0x011173, 0x011180, 0x0111b6, - 0x0111c9, 0x0111cf, 0x01122f, 0x011234, 0x011236, 0x01123e, 0x011241, 0x0112df, - 0x0112e3, 0x011300, 0x01133b, 0x011340, 0x011366, 0x011370, 0x0113bb, 0x0113ce, - 0x0113d0, 0x0113d2, 0x0113e1, 0x011438, 0x011442, 0x011446, 0x01145e, 0x0114b3, - 0x0114ba, 0x0114bf, 0x0114c2, 0x0115b2, 0x0115bc, 0x0115bf, 0x0115dc, 0x011633, - 0x01163d, 0x01163f, 0x0116ab, 0x0116ad, 0x0116b0, 0x0116b7, 0x01171d, 0x01171f, - 0x011722, 0x011727, 0x01182f, 0x011839, 0x01193b, 0x01193e, 0x011943, 0x0119d4, - 0x0119da, 0x0119e0, 0x011a01, 0x011a33, 0x011a3b, 0x011a47, 0x011a51, 0x011a59, - 0x011a8a, 0x011a98, 0x011c30, 0x011c38, 0x011c3f, 0x011c92, 0x011caa, 0x011cb2, - 0x011cb5, 0x011d31, 0x011d3a, 0x011d3c, 0x011d3f, 0x011d47, 0x011d90, 0x011d95, - 0x011d97, 0x011ef3, 0x011f00, 0x011f36, 0x011f40, 0x011f42, 0x011f5a, 0x013440, - 0x013447, 0x01611e, 0x01612d, 0x016af0, 0x016b30, 0x016f4f, 0x016f8f, 0x016fe4, - 0x01bc9d, 0x01bca0, 0x01cf00, 0x01cf30, 0x01d167, 0x01d173, 0x01d185, 0x01d1aa, - 0x01d242, 0x01da00, 0x01da3b, 0x01da75, 0x01da84, 0x01da9b, 0x01daa1, 0x01e000, - 0x01e008, 0x01e01b, 0x01e023, 0x01e026, 0x01e08f, 0x01e130, 0x01e2ae, 0x01e2ec, - 0x01e4ec, 0x01e5ee, 0x01e8d0, 0x01e944, 0x0e0001, 0x0e0020, 0x0e0100 -}; + 0x000300, 0x000483, 0x000591, 0x0005bf, 0x0005c1, 0x0005c4, 0x0005c7, + 0x000610, 0x00061c, 0x00064b, 0x000670, 0x0006d6, 0x0006df, 0x0006e7, + 0x0006ea, 0x000711, 0x000730, 0x0007a6, 0x0007eb, 0x0007fd, 0x000816, + 0x00081b, 0x000825, 0x000829, 0x000859, 0x000897, 0x0008ca, 0x0008e3, + 0x00093a, 0x00093c, 0x000941, 0x00094d, 0x000951, 0x000962, 0x000981, + 0x0009bc, 0x0009c1, 0x0009cd, 0x0009e2, 0x0009fe, 0x000a01, 0x000a3c, + 0x000a41, 0x000a47, 0x000a4b, 0x000a51, 0x000a70, 0x000a75, 0x000a81, + 0x000abc, 0x000ac1, 0x000ac7, 0x000acd, 0x000ae2, 0x000afa, 0x000b01, + 0x000b3c, 0x000b3f, 0x000b41, 0x000b4d, 0x000b55, 0x000b62, 0x000b82, + 0x000bc0, 0x000bcd, 0x000c00, 0x000c04, 0x000c3c, 0x000c3e, 0x000c46, + 0x000c4a, 0x000c55, 0x000c62, 0x000c81, 0x000cbc, 0x000cbf, 0x000cc6, + 0x000ccc, 0x000ce2, 0x000d00, 0x000d3b, 0x000d41, 0x000d4d, 0x000d62, + 0x000d81, 0x000dca, 0x000dd2, 0x000dd6, 0x000e31, 0x000e34, 0x000e47, + 0x000eb1, 0x000eb4, 0x000ec8, 0x000f18, 0x000f35, 0x000f37, 0x000f39, + 0x000f71, 0x000f80, 0x000f86, 0x000f8d, 0x000f99, 0x000fc6, 0x00102d, + 0x001032, 0x001039, 0x00103d, 0x001058, 0x00105e, 0x001071, 0x001082, + 0x001085, 0x00108d, 0x00109d, 0x001160, 0x00135d, 0x001712, 0x001732, + 0x001752, 0x001772, 0x0017b4, 0x0017b7, 0x0017c6, 0x0017c9, 0x0017dd, + 0x00180b, 0x001885, 0x0018a9, 0x001920, 0x001927, 0x001932, 0x001939, + 0x001a17, 0x001a1b, 0x001a56, 0x001a58, 0x001a60, 0x001a62, 0x001a65, + 0x001a73, 0x001a7f, 0x001ab0, 0x001b00, 0x001b34, 0x001b36, 0x001b3c, + 0x001b42, 0x001b6b, 0x001b80, 0x001ba2, 0x001ba8, 0x001bab, 0x001be6, + 0x001be8, 0x001bed, 0x001bef, 0x001c2c, 0x001c36, 0x001cd0, 0x001cd4, + 0x001ce2, 0x001ced, 0x001cf4, 0x001cf8, 0x001dc0, 0x00200b, 0x00202a, + 0x002060, 0x002066, 0x0020d0, 0x002cef, 0x002d7f, 0x002de0, 0x00302a, + 0x003099, 0x003164, 0x00a66f, 0x00a674, 0x00a69e, 0x00a6f0, 0x00a802, + 0x00a806, 0x00a80b, 0x00a825, 0x00a82c, 0x00a8c4, 0x00a8e0, 0x00a8ff, + 0x00a926, 0x00a947, 0x00a980, 0x00a9b3, 0x00a9b6, 0x00a9bc, 0x00a9e5, + 0x00aa29, 0x00aa31, 0x00aa35, 0x00aa43, 0x00aa4c, 0x00aa7c, 0x00aab0, + 0x00aab2, 0x00aab7, 0x00aabe, 0x00aac1, 0x00aaec, 0x00aaf6, 0x00abe5, + 0x00abe8, 0x00abed, 0x00d7b0, 0x00d7cb, 0x00fb1e, 0x00fe00, 0x00fe20, + 0x00feff, 0x00ffa0, 0x0101fd, 0x0102e0, 0x010376, 0x010a01, 0x010a05, + 0x010a0c, 0x010a38, 0x010a3f, 0x010ae5, 0x010d24, 0x010d69, 0x010eab, + 0x010efc, 0x010f46, 0x010f82, 0x011001, 0x011038, 0x011070, 0x011073, + 0x01107f, 0x0110b3, 0x0110b9, 0x0110c2, 0x011100, 0x011127, 0x01112d, + 0x011173, 0x011180, 0x0111b6, 0x0111c9, 0x0111cf, 0x01122f, 0x011234, + 0x011236, 0x01123e, 0x011241, 0x0112df, 0x0112e3, 0x011300, 0x01133b, + 0x011340, 0x011366, 0x011370, 0x0113bb, 0x0113ce, 0x0113d0, 0x0113d2, + 0x0113e1, 0x011438, 0x011442, 0x011446, 0x01145e, 0x0114b3, 0x0114ba, + 0x0114bf, 0x0114c2, 0x0115b2, 0x0115bc, 0x0115bf, 0x0115dc, 0x011633, + 0x01163d, 0x01163f, 0x0116ab, 0x0116ad, 0x0116b0, 0x0116b7, 0x01171d, + 0x01171f, 0x011722, 0x011727, 0x01182f, 0x011839, 0x01193b, 0x01193e, + 0x011943, 0x0119d4, 0x0119da, 0x0119e0, 0x011a01, 0x011a33, 0x011a3b, + 0x011a47, 0x011a51, 0x011a59, 0x011a8a, 0x011a98, 0x011c30, 0x011c38, + 0x011c3f, 0x011c92, 0x011caa, 0x011cb2, 0x011cb5, 0x011d31, 0x011d3a, + 0x011d3c, 0x011d3f, 0x011d47, 0x011d90, 0x011d95, 0x011d97, 0x011ef3, + 0x011f00, 0x011f36, 0x011f40, 0x011f42, 0x011f5a, 0x013440, 0x013447, + 0x01611e, 0x01612d, 0x016af0, 0x016b30, 0x016f4f, 0x016f8f, 0x016fe4, + 0x01bc9d, 0x01bca0, 0x01cf00, 0x01cf30, 0x01d167, 0x01d173, 0x01d185, + 0x01d1aa, 0x01d242, 0x01da00, 0x01da3b, 0x01da75, 0x01da84, 0x01da9b, + 0x01daa1, 0x01e000, 0x01e008, 0x01e01b, 0x01e023, 0x01e026, 0x01e08f, + 0x01e130, 0x01e2ae, 0x01e2ec, 0x01e4ec, 0x01e5ee, 0x01e8d0, 0x01e944, + 0x0e0001, 0x0e0020, 0x0e0100}; static const uint16_t wcw0_cnt[] = { - 0x006f, 0x0006, 0x002c, 0x0000, 0x0001, 0x0001, 0x0000, 0x000a, - 0x0000, 0x0014, 0x0000, 0x0006, 0x0005, 0x0001, 0x0003, 0x0000, - 0x001a, 0x000a, 0x0008, 0x0000, 0x0003, 0x0008, 0x0002, 0x0004, - 0x0002, 0x0008, 0x0017, 0x001f, 0x0000, 0x0000, 0x0007, 0x0000, - 0x0006, 0x0001, 0x0000, 0x0000, 0x0003, 0x0000, 0x0001, 0x0000, - 0x0001, 0x0000, 0x0001, 0x0001, 0x0002, 0x0000, 0x0001, 0x0000, - 0x0001, 0x0000, 0x0004, 0x0001, 0x0000, 0x0001, 0x0005, 0x0000, - 0x0000, 0x0000, 0x0003, 0x0000, 0x0001, 0x0001, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0002, 0x0003, 0x0001, - 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, - 0x0001, 0x0003, 0x0000, 0x0001, 0x0000, 0x0000, 0x0002, 0x0000, - 0x0000, 0x0006, 0x0007, 0x0000, 0x0008, 0x0006, 0x0001, 0x0000, - 0x0000, 0x0000, 0x000d, 0x0004, 0x0001, 0x000a, 0x0023, 0x0000, - 0x0003, 0x0005, 0x0001, 0x0001, 0x0001, 0x0002, 0x0003, 0x0000, - 0x0001, 0x0000, 0x0000, 0x009f, 0x0002, 0x0002, 0x0001, 0x0001, - 0x0001, 0x0001, 0x0006, 0x0000, 0x000a, 0x0000, 0x0004, 0x0001, - 0x0000, 0x0002, 0x0001, 0x0000, 0x0002, 0x0001, 0x0000, 0x0000, - 0x0006, 0x0000, 0x0000, 0x0007, 0x0009, 0x0000, 0x001e, 0x0003, - 0x0000, 0x0004, 0x0000, 0x0000, 0x0008, 0x0001, 0x0003, 0x0001, - 0x0002, 0x0000, 0x0001, 0x0000, 0x0002, 0x0007, 0x0001, 0x0002, - 0x000c, 0x0006, 0x0000, 0x0000, 0x0001, 0x003f, 0x0004, 0x0004, - 0x0004, 0x0009, 0x0020, 0x0002, 0x0000, 0x001f, 0x0003, 0x0001, - 0x0000, 0x0003, 0x0009, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, - 0x0001, 0x0000, 0x0001, 0x0011, 0x0000, 0x0007, 0x000a, 0x0002, - 0x0000, 0x0003, 0x0001, 0x0000, 0x0005, 0x0001, 0x0001, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0002, 0x0001, 0x0001, 0x0000, 0x0001, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0016, 0x0030, 0x0000, 0x000f, - 0x000f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0002, 0x0001, - 0x0003, 0x0002, 0x0000, 0x0001, 0x0003, 0x0004, 0x0001, 0x0003, - 0x000a, 0x0003, 0x0000, 0x000e, 0x0000, 0x0001, 0x0002, 0x0003, - 0x0001, 0x0000, 0x0002, 0x0004, 0x0007, 0x0000, 0x0001, 0x0008, - 0x0003, 0x0000, 0x0002, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, - 0x0007, 0x0001, 0x0001, 0x0000, 0x0006, 0x0004, 0x0005, 0x0000, - 0x0000, 0x0000, 0x0001, 0x0007, 0x0002, 0x0000, 0x0000, 0x0005, - 0x0000, 0x0001, 0x0001, 0x0003, 0x0001, 0x0001, 0x0001, 0x0007, - 0x0000, 0x0001, 0x0000, 0x0000, 0x0005, 0x0000, 0x0000, 0x0000, - 0x0003, 0x0004, 0x0008, 0x0001, 0x0001, 0x0000, 0x0000, 0x0003, - 0x0001, 0x0000, 0x0009, 0x0005, 0x0003, 0x0000, 0x0005, 0x0002, - 0x000c, 0x0001, 0x0006, 0x0005, 0x0000, 0x0015, 0x0006, 0x0001, - 0x0001, 0x0005, 0x0000, 0x0001, 0x0006, 0x0000, 0x0001, 0x0000, - 0x0000, 0x0001, 0x0001, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, - 0x000e, 0x000b, 0x0002, 0x0004, 0x0006, 0x0000, 0x0003, 0x0000, - 0x0001, 0x0003, 0x002d, 0x0016, 0x0002, 0x000f, 0x0006, 0x0003, - 0x0002, 0x0036, 0x0031, 0x0000, 0x0000, 0x0004, 0x000e, 0x0006, - 0x0010, 0x0006, 0x0001, 0x0004, 0x0000, 0x0006, 0x0000, 0x0003, - 0x0003, 0x0001, 0x0006, 0x0006, 0x0000, 0x005f, 0x00ef -}; + 0x006f, 0x0006, 0x002c, 0x0000, 0x0001, 0x0001, 0x0000, 0x000a, 0x0000, + 0x0014, 0x0000, 0x0006, 0x0005, 0x0001, 0x0003, 0x0000, 0x001a, 0x000a, + 0x0008, 0x0000, 0x0003, 0x0008, 0x0002, 0x0004, 0x0002, 0x0008, 0x0017, + 0x001f, 0x0000, 0x0000, 0x0007, 0x0000, 0x0006, 0x0001, 0x0000, 0x0000, + 0x0003, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0001, 0x0002, + 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0004, 0x0001, 0x0000, 0x0001, + 0x0005, 0x0000, 0x0000, 0x0000, 0x0003, 0x0000, 0x0001, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0002, 0x0003, 0x0001, + 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0003, 0x0000, 0x0001, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0006, + 0x0007, 0x0000, 0x0008, 0x0006, 0x0001, 0x0000, 0x0000, 0x0000, 0x000d, + 0x0004, 0x0001, 0x000a, 0x0023, 0x0000, 0x0003, 0x0005, 0x0001, 0x0001, + 0x0001, 0x0002, 0x0003, 0x0000, 0x0001, 0x0000, 0x0000, 0x009f, 0x0002, + 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0000, 0x000a, 0x0000, + 0x0004, 0x0001, 0x0000, 0x0002, 0x0001, 0x0000, 0x0002, 0x0001, 0x0000, + 0x0000, 0x0006, 0x0000, 0x0000, 0x0007, 0x0009, 0x0000, 0x001e, 0x0003, + 0x0000, 0x0004, 0x0000, 0x0000, 0x0008, 0x0001, 0x0003, 0x0001, 0x0002, + 0x0000, 0x0001, 0x0000, 0x0002, 0x0007, 0x0001, 0x0002, 0x000c, 0x0006, + 0x0000, 0x0000, 0x0001, 0x003f, 0x0004, 0x0004, 0x0004, 0x0009, 0x0020, + 0x0002, 0x0000, 0x001f, 0x0003, 0x0001, 0x0000, 0x0003, 0x0009, 0x0001, + 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0001, 0x0011, 0x0000, + 0x0007, 0x000a, 0x0002, 0x0000, 0x0003, 0x0001, 0x0000, 0x0005, 0x0001, + 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0001, 0x0001, 0x0000, + 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0016, 0x0030, 0x0000, 0x000f, + 0x000f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0002, 0x0001, 0x0003, + 0x0002, 0x0000, 0x0001, 0x0003, 0x0004, 0x0001, 0x0003, 0x000a, 0x0003, + 0x0000, 0x000e, 0x0000, 0x0001, 0x0002, 0x0003, 0x0001, 0x0000, 0x0002, + 0x0004, 0x0007, 0x0000, 0x0001, 0x0008, 0x0003, 0x0000, 0x0002, 0x0000, + 0x0001, 0x0000, 0x0000, 0x0000, 0x0007, 0x0001, 0x0001, 0x0000, 0x0006, + 0x0004, 0x0005, 0x0000, 0x0000, 0x0000, 0x0001, 0x0007, 0x0002, 0x0000, + 0x0000, 0x0005, 0x0000, 0x0001, 0x0001, 0x0003, 0x0001, 0x0001, 0x0001, + 0x0007, 0x0000, 0x0001, 0x0000, 0x0000, 0x0005, 0x0000, 0x0000, 0x0000, + 0x0003, 0x0004, 0x0008, 0x0001, 0x0001, 0x0000, 0x0000, 0x0003, 0x0001, + 0x0000, 0x0009, 0x0005, 0x0003, 0x0000, 0x0005, 0x0002, 0x000c, 0x0001, + 0x0006, 0x0005, 0x0000, 0x0015, 0x0006, 0x0001, 0x0001, 0x0005, 0x0000, + 0x0001, 0x0006, 0x0000, 0x0001, 0x0000, 0x0000, 0x0001, 0x0001, 0x0004, + 0x0000, 0x0000, 0x0000, 0x0000, 0x000e, 0x000b, 0x0002, 0x0004, 0x0006, + 0x0000, 0x0003, 0x0000, 0x0001, 0x0003, 0x002d, 0x0016, 0x0002, 0x000f, + 0x0006, 0x0003, 0x0002, 0x0036, 0x0031, 0x0000, 0x0000, 0x0004, 0x000e, + 0x0006, 0x0010, 0x0006, 0x0001, 0x0004, 0x0000, 0x0006, 0x0000, 0x0003, + 0x0003, 0x0001, 0x0006, 0x0006, 0x0000, 0x005f, 0x00ef}; #define WCW0_LEN 367 static const uint32_t wcw2_lo[] = { - 0x001100, 0x00231a, 0x002329, 0x0023e9, 0x0023f0, 0x0023f3, 0x0025fd, 0x002614, - 0x002630, 0x002648, 0x00267f, 0x00268a, 0x002693, 0x0026a1, 0x0026aa, 0x0026bd, - 0x0026c4, 0x0026ce, 0x0026d4, 0x0026ea, 0x0026f2, 0x0026f5, 0x0026fa, 0x0026fd, - 0x002705, 0x00270a, 0x002728, 0x00274c, 0x00274e, 0x002753, 0x002757, 0x002795, - 0x0027b0, 0x0027bf, 0x002b1b, 0x002b50, 0x002b55, 0x002e80, 0x002e9b, 0x002f00, - 0x002ff0, 0x00302e, 0x003041, 0x00309b, 0x003105, 0x003131, 0x003165, 0x003190, - 0x0031ef, 0x003220, 0x00a490, 0x00a960, 0x00ac00, 0x00f900, 0x00fa70, 0x00fe10, - 0x00fe30, 0x00fe54, 0x00fe68, 0x00ff01, 0x00ffe0, 0x016fe0, 0x016ff0, 0x017000, - 0x018800, 0x018cff, 0x01aff0, 0x01aff5, 0x01affd, 0x01b000, 0x01b132, 0x01b150, - 0x01b155, 0x01b164, 0x01b170, 0x01d300, 0x01d360, 0x01f004, 0x01f0cf, 0x01f18e, - 0x01f191, 0x01f200, 0x01f210, 0x01f240, 0x01f250, 0x01f260, 0x01f300, 0x01f32d, - 0x01f337, 0x01f37e, 0x01f3a0, 0x01f3cf, 0x01f3e0, 0x01f3f4, 0x01f3f8, 0x01f440, - 0x01f442, 0x01f4ff, 0x01f54b, 0x01f550, 0x01f57a, 0x01f595, 0x01f5a4, 0x01f5fb, - 0x01f680, 0x01f6cc, 0x01f6d0, 0x01f6d5, 0x01f6dc, 0x01f6eb, 0x01f6f4, 0x01f7e0, - 0x01f7f0, 0x01f90c, 0x01f93c, 0x01f947, 0x01fa70, 0x01fa80, 0x01fa8f, 0x01face, - 0x01fadf, 0x01faf0, 0x020000, 0x02a700, 0x02b740, 0x02b820, 0x02ceb0, 0x02ebf0, - 0x02f800, 0x030000, 0x031350 -}; + 0x001100, 0x00231a, 0x002329, 0x0023e9, 0x0023f0, 0x0023f3, 0x0025fd, + 0x002614, 0x002630, 0x002648, 0x00267f, 0x00268a, 0x002693, 0x0026a1, + 0x0026aa, 0x0026bd, 0x0026c4, 0x0026ce, 0x0026d4, 0x0026ea, 0x0026f2, + 0x0026f5, 0x0026fa, 0x0026fd, 0x002705, 0x00270a, 0x002728, 0x00274c, + 0x00274e, 0x002753, 0x002757, 0x002795, 0x0027b0, 0x0027bf, 0x002b1b, + 0x002b50, 0x002b55, 0x002e80, 0x002e9b, 0x002f00, 0x002ff0, 0x00302e, + 0x003041, 0x00309b, 0x003105, 0x003131, 0x003165, 0x003190, 0x0031ef, + 0x003220, 0x00a490, 0x00a960, 0x00ac00, 0x00f900, 0x00fa70, 0x00fe10, + 0x00fe30, 0x00fe54, 0x00fe68, 0x00ff01, 0x00ffe0, 0x016fe0, 0x016ff0, + 0x017000, 0x018800, 0x018cff, 0x01aff0, 0x01aff5, 0x01affd, 0x01b000, + 0x01b132, 0x01b150, 0x01b155, 0x01b164, 0x01b170, 0x01d300, 0x01d360, + 0x01f004, 0x01f0cf, 0x01f18e, 0x01f191, 0x01f200, 0x01f210, 0x01f240, + 0x01f250, 0x01f260, 0x01f300, 0x01f32d, 0x01f337, 0x01f37e, 0x01f3a0, + 0x01f3cf, 0x01f3e0, 0x01f3f4, 0x01f3f8, 0x01f440, 0x01f442, 0x01f4ff, + 0x01f54b, 0x01f550, 0x01f57a, 0x01f595, 0x01f5a4, 0x01f5fb, 0x01f680, + 0x01f6cc, 0x01f6d0, 0x01f6d5, 0x01f6dc, 0x01f6eb, 0x01f6f4, 0x01f7e0, + 0x01f7f0, 0x01f90c, 0x01f93c, 0x01f947, 0x01fa70, 0x01fa80, 0x01fa8f, + 0x01face, 0x01fadf, 0x01faf0, 0x020000, 0x02a700, 0x02b740, 0x02b820, + 0x02ceb0, 0x02ebf0, 0x02f800, 0x030000, 0x031350}; static const uint16_t wcw2_cnt[] = { - 0x005f, 0x0001, 0x0001, 0x0003, 0x0000, 0x0000, 0x0001, 0x0001, - 0x0007, 0x000b, 0x0000, 0x0005, 0x0000, 0x0000, 0x0001, 0x0001, - 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0002, - 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0019, 0x0058, 0x00d5, - 0x0039, 0x0010, 0x0055, 0x0064, 0x002a, 0x0032, 0x0029, 0x0055, - 0x002f, 0x726c, 0x0036, 0x001c, 0x2ba3, 0x016d, 0x0069, 0x0009, - 0x0022, 0x0012, 0x0003, 0x005f, 0x0006, 0x0003, 0x0001, 0x17f7, - 0x04d5, 0x0009, 0x0003, 0x0006, 0x0001, 0x0122, 0x0000, 0x0002, - 0x0000, 0x0003, 0x018b, 0x0056, 0x0016, 0x0000, 0x0000, 0x0000, - 0x0009, 0x0002, 0x002b, 0x0008, 0x0001, 0x0005, 0x0020, 0x0008, - 0x0045, 0x0015, 0x002a, 0x0004, 0x0010, 0x0000, 0x0046, 0x0000, - 0x00ba, 0x003e, 0x0003, 0x0017, 0x0000, 0x0001, 0x0000, 0x0054, - 0x0045, 0x0000, 0x0002, 0x0002, 0x0003, 0x0001, 0x0008, 0x000b, - 0x0000, 0x002e, 0x0009, 0x00b8, 0x000c, 0x0009, 0x0037, 0x000e, - 0x000a, 0x0008, 0xa6df, 0x1039, 0x00dd, 0x1681, 0x1d30, 0x026d, - 0x021d, 0x134a, 0x105f -}; + 0x005f, 0x0001, 0x0001, 0x0003, 0x0000, 0x0000, 0x0001, 0x0001, 0x0007, + 0x000b, 0x0000, 0x0005, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0002, 0x0000, 0x0002, 0x0000, 0x0000, 0x0001, 0x0000, + 0x0000, 0x0019, 0x0058, 0x00d5, 0x0039, 0x0010, 0x0055, 0x0064, 0x002a, + 0x0032, 0x0029, 0x0055, 0x002f, 0x726c, 0x0036, 0x001c, 0x2ba3, 0x016d, + 0x0069, 0x0009, 0x0022, 0x0012, 0x0003, 0x005f, 0x0006, 0x0003, 0x0001, + 0x17f7, 0x04d5, 0x0009, 0x0003, 0x0006, 0x0001, 0x0122, 0x0000, 0x0002, + 0x0000, 0x0003, 0x018b, 0x0056, 0x0016, 0x0000, 0x0000, 0x0000, 0x0009, + 0x0002, 0x002b, 0x0008, 0x0001, 0x0005, 0x0020, 0x0008, 0x0045, 0x0015, + 0x002a, 0x0004, 0x0010, 0x0000, 0x0046, 0x0000, 0x00ba, 0x003e, 0x0003, + 0x0017, 0x0000, 0x0001, 0x0000, 0x0054, 0x0045, 0x0000, 0x0002, 0x0002, + 0x0003, 0x0001, 0x0008, 0x000b, 0x0000, 0x002e, 0x0009, 0x00b8, 0x000c, + 0x0009, 0x0037, 0x000e, 0x000a, 0x0008, 0xa6df, 0x1039, 0x00dd, 0x1681, + 0x1d30, 0x026d, 0x021d, 0x134a, 0x105f}; #define WCW2_LEN 131 -static int wcrange(const uint32_t *lo, const uint16_t *cnt, int n, uint32_t ch) { +static int wcrange(const uint32_t *lo, const uint16_t *cnt, int n, + uint32_t ch) { int l = 0, h = n - 1; while (l <= h) { int m = (l + h) / 2; - if (ch < lo[m]) h = m - 1; - else if (ch > lo[m] + cnt[m]) l = m + 1; - else return 1; + if (ch < lo[m]) + h = m - 1; + else if (ch > lo[m] + cnt[m]) + l = m + 1; + else + return 1; } return 0; } @@ -168,8 +170,10 @@ int wcwidth(uint32_t ch) { return 1; if (ch < 0x20 || (ch > 0x7e && ch < 0xa0)) return ch == 0 ? 0 : -1; - if (wcrange(wcw0_lo, wcw0_cnt, WCW0_LEN, ch)) return 0; - if (wcrange(wcw2_lo, wcw2_cnt, WCW2_LEN, ch)) return 2; + if (wcrange(wcw0_lo, wcw0_cnt, WCW0_LEN, ch)) + return 0; + if (wcrange(wcw2_lo, wcw2_cnt, WCW2_LEN, ch)) + return 2; return 1; } diff --git a/tasks/build-npm.ts b/tasks/build-npm.ts index 7259863..1e81e67 100644 --- a/tasks/build-npm.ts +++ b/tasks/build-npm.ts @@ -20,8 +20,9 @@ await build({ typeCheck: false, compilerOptions: { lib: ["ESNext"], - target: "ES2020", - sourceMap: true, + target: "ES2022", + sourceMap: false, + declarationMap: false, }, package: { name: "clayterm", @@ -37,9 +38,10 @@ await build({ url: "https://github.com/thefrontside/clayterm/issues", }, engines: { - node: ">= 16", + node: ">= 22", }, sideEffects: false, + files: ["esm"], }, }); diff --git a/tasks/bundle-wasm.ts b/tasks/bundle-wasm.ts index ab69236..fce2f04 100644 --- a/tasks/bundle-wasm.ts +++ b/tasks/bundle-wasm.ts @@ -16,4 +16,8 @@ export const compiled = await WebAssembly.compile(await new Response(stream).arr `; await Deno.writeTextFile("wasm.ts", source); -console.log(`wrote wasm.ts (${wasm.length} → ${compressed.byteLength} bytes compressed, ${Math.round(compressed.byteLength / wasm.length * 100)}%)`); +console.log( + `wrote wasm.ts (${wasm.length} → ${compressed.byteLength} bytes compressed, ${ + Math.round(compressed.byteLength / wasm.length * 100) + }%)`, +); From 1ec215bc2b1152411e7a4606f8295af2f1556a1d Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Sat, 23 May 2026 01:15:28 -0400 Subject: [PATCH 10/47] =?UTF-8?q?=F0=9F=90=9B=20install=20wasm-opt=20in=20?= =?UTF-8?q?ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/preview.yml | 3 +++ .github/workflows/publish.yml | 9 +++++++++ .github/workflows/verify.yaml | 9 +++++++++ 3 files changed, 21 insertions(+) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index dee9fab..5f1647f 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -21,6 +21,9 @@ jobs: with: deno-version: v2.x + - name: install binaryen + run: sudo apt-get install -y binaryen + - name: build wasm run: make diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 800f1d4..0796120 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -23,6 +23,9 @@ jobs: with: deno-version: v2.x + - name: install binaryen + run: sudo apt-get install -y binaryen + - name: build wasm run: make @@ -49,6 +52,9 @@ jobs: with: deno-version: v2.x + - name: install binaryen + run: sudo apt-get install -y binaryen + - name: build wasm run: make @@ -109,6 +115,9 @@ jobs: with: deno-version: v2.x + - name: install binaryen + run: sudo apt-get install -y binaryen + - name: build wasm run: make diff --git a/.github/workflows/verify.yaml b/.github/workflows/verify.yaml index 3fd5b3f..5407de7 100644 --- a/.github/workflows/verify.yaml +++ b/.github/workflows/verify.yaml @@ -30,6 +30,9 @@ jobs: - name: lint run: deno lint + - name: install binaryen + run: sudo apt-get install -y binaryen + - name: build wasm run: make @@ -88,6 +91,9 @@ jobs: with: deno-version: v2.x + - name: install binaryen + run: sudo apt-get install -y binaryen + - name: build wasm run: make @@ -116,6 +122,9 @@ jobs: with: node-version: 24 + - name: install binaryen + run: sudo apt-get install -y binaryen + - name: build wasm run: make From c6527e225fc075e89004f6f89940a19adbebd33e Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Sat, 23 May 2026 16:34:05 -0400 Subject: [PATCH 11/47] =?UTF-8?q?=E2=9A=A1=20use=20brotli-11=20+=20z85=20w?= =?UTF-8?q?asm=20encoding?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deno.json | 3 +++ tasks/bundle-wasm.ts | 55 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/deno.json b/deno.json index fab9ce2..6f83602 100644 --- a/deno.json +++ b/deno.json @@ -25,6 +25,9 @@ "include": ["*.ts"], "exclude": ["!wasm.ts"] }, + "compilerOptions": { + "types": ["npm:@types/node"] + }, "fmt": { "exclude": ["clay", "build"] }, diff --git a/tasks/bundle-wasm.ts b/tasks/bundle-wasm.ts index fce2f04..6cd9981 100644 --- a/tasks/bundle-wasm.ts +++ b/tasks/bundle-wasm.ts @@ -1,23 +1,54 @@ -import { encodeBase64 } from "@std/encoding/base64"; +import { brotliCompressSync, constants } from "node:zlib"; + +const Z85 = + "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-:+=^!/*?&<>()[]{}@%$#"; + +function encodeZ85(data: Uint8Array): string { + let padLen = (4 - (data.length % 4)) % 4; + let src = data; + if (padLen > 0) { + src = new Uint8Array(data.length + padLen); + src.set(data); + } + let out: string[] = []; + for (let i = 0; i < src.length; i += 4) { + let v = src[i] * 16777216 + src[i + 1] * 65536 + src[i + 2] * 256 + + src[i + 3]; + out.push( + Z85[Math.floor(v / 52200625)], + Z85[Math.floor(v / 614125) % 85], + Z85[Math.floor(v / 7225) % 85], + Z85[Math.floor(v / 85) % 85], + Z85[v % 85], + ); + } + return out.join(""); +} const wasm = await Deno.readFile("clayterm.wasm"); -const cs = new CompressionStream("deflate-raw"); -const compressed = await new Response( - new Blob([wasm]).stream().pipeThrough(cs), -).arrayBuffer(); +const compressed = new Uint8Array(brotliCompressSync(wasm, { + params: { + [constants.BROTLI_PARAM_QUALITY]: 11, + [constants.BROTLI_PARAM_SIZE_HINT]: wasm.length, + [constants.BROTLI_PARAM_LGWIN]: 24, + }, +})); -const base64 = encodeBase64(new Uint8Array(compressed)); +const z85 = encodeZ85(compressed); -const source = `const bin = atob("${base64}"); -const compressed = Uint8Array.from(bin, c => c.charCodeAt(0)); -const stream = new Blob([compressed]).stream().pipeThrough(new DecompressionStream("deflate-raw")); -export const compiled = await WebAssembly.compile(await new Response(stream).arrayBuffer()); +// Decoder uses division instead of >>> to avoid 32-bit truncation on values near 0xFFFFFFFF. +const source = `import{brotliDecompressSync}from"node:zlib"; +const Z="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-:+=^!/*?&<>()[]{}@%$#"; +const T=new Uint8Array(128);for(let i=0;i<85;i++)T[Z.charCodeAt(i)]=i; +function d(s,n){const b=new Uint8Array(n);let o=0;for(let i=0;i Date: Sat, 23 May 2026 19:39:47 -0400 Subject: [PATCH 12/47] =?UTF-8?q?=F0=9F=93=8C=20pin=20@types/node=20to=20v?= =?UTF-8?q?22?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deno.json | 5 +++-- deno.lock | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/deno.json b/deno.json index 6f83602..3aff2ca 100644 --- a/deno.json +++ b/deno.json @@ -15,7 +15,8 @@ "@sinclair/typebox": "npm:@sinclair/typebox@^0.34", "dnt": "jsr:@deno/dnt@0.42.3", "effection": "npm:effection@^4.0.2", - "@std/encoding": "jsr:@std/encoding@1" + "@std/encoding": "jsr:@std/encoding@1", + "@types/node": "npm:@types/node@^22" }, "exports": { ".": "./mod.ts", @@ -26,7 +27,7 @@ "exclude": ["!wasm.ts"] }, "compilerOptions": { - "types": ["npm:@types/node"] + "types": ["@types/node"] }, "fmt": { "exclude": ["clay", "build"] diff --git a/deno.lock b/deno.lock index 7947a80..84bd87c 100644 --- a/deno.lock +++ b/deno.lock @@ -126,6 +126,7 @@ "jsr:@std/expect@1", "jsr:@std/testing@1", "npm:@sinclair/typebox@0.34", + "npm:@types/node@22", "npm:effection@^4.0.2" ] } From db907408cb48dab239d6a34e5c539cdf26673af5 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Sat, 23 May 2026 19:56:23 -0400 Subject: [PATCH 13/47] =?UTF-8?q?=F0=9F=A7=BC=20apply=20@ghostdevv=20revie?= =?UTF-8?q?w=20suggestions=20from=20PR=20#35?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: ghostdevv --- tasks/build-npm.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tasks/build-npm.ts b/tasks/build-npm.ts index 1e81e67..c31f754 100644 --- a/tasks/build-npm.ts +++ b/tasks/build-npm.ts @@ -20,10 +20,8 @@ await build({ typeCheck: false, compilerOptions: { lib: ["ESNext"], - target: "ES2022", - sourceMap: false, - declarationMap: false, }, + skipSourceOutput: true, package: { name: "clayterm", version, @@ -41,7 +39,7 @@ await build({ node: ">= 22", }, sideEffects: false, - files: ["esm"], + type: "module", }, }); From 1ea98a56823b0003671297ee8a9519f9fac0ef19 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Sat, 23 May 2026 20:34:21 -0400 Subject: [PATCH 14/47] =?UTF-8?q?=F0=9F=94=A8=20add=20type=20to=20bundle-w?= =?UTF-8?q?asm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tasks/bundle-wasm.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/bundle-wasm.ts b/tasks/bundle-wasm.ts index 6cd9981..d1918b2 100644 --- a/tasks/bundle-wasm.ts +++ b/tasks/bundle-wasm.ts @@ -41,7 +41,7 @@ const z85 = encodeZ85(compressed); const source = `import{brotliDecompressSync}from"node:zlib"; const Z="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-:+=^!/*?&<>()[]{}@%$#"; const T=new Uint8Array(128);for(let i=0;i<85;i++)T[Z.charCodeAt(i)]=i; -function d(s,n){const b=new Uint8Array(n);let o=0;for(let i=0;i Date: Sat, 23 May 2026 22:21:12 -0400 Subject: [PATCH 15/47] =?UTF-8?q?=F0=9F=92=8C=20signed,=20sealed,=20delive?= =?UTF-8?q?red?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From aa2ebb9405a113334f84c080633f6271914fb64f Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sat, 23 May 2026 22:17:41 +0100 Subject: [PATCH 16/47] chore: use hashes for versions --- .github/workflows/verify.yaml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/verify.yaml b/.github/workflows/verify.yaml index 3fd5b3f..380f6c3 100644 --- a/.github/workflows/verify.yaml +++ b/.github/workflows/verify.yaml @@ -15,12 +15,12 @@ jobs: steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: submodules: true - name: setup deno - uses: denoland/setup-deno@v2 + uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 with: deno-version: v2.x @@ -34,7 +34,7 @@ jobs: run: make - name: upload wasm artifact - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: clayterm-wasm path: | @@ -56,17 +56,17 @@ jobs: steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: submodules: true - name: setup deno - uses: denoland/setup-deno@v2 + uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 with: deno-version: v2.x - name: download wasm artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: clayterm-wasm path: . @@ -79,12 +79,12 @@ jobs: runs-on: ubuntu-latest steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: submodules: true - name: setup deno - uses: denoland/setup-deno@v2 + uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 with: deno-version: v2.x @@ -102,17 +102,17 @@ jobs: runs-on: ubuntu-latest steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: submodules: true - name: setup deno - uses: denoland/setup-deno@v2 + uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 with: deno-version: v2.x - name: Setup Node - uses: actions/setup-node@v4 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: 24 From f68b862f8ac7f2ad656022ab9c98b9b4243482d4 Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sat, 23 May 2026 22:18:29 +0100 Subject: [PATCH 17/47] chore: don't save git credentials --- .github/workflows/verify.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/verify.yaml b/.github/workflows/verify.yaml index 380f6c3..0f8d9dc 100644 --- a/.github/workflows/verify.yaml +++ b/.github/workflows/verify.yaml @@ -18,6 +18,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: submodules: true + persist-credentials: false - name: setup deno uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 @@ -59,6 +60,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: submodules: true + persist-credentials: false - name: setup deno uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 @@ -82,6 +84,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: submodules: true + persist-credentials: false - name: setup deno uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 @@ -105,6 +108,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: submodules: true + persist-credentials: false - name: setup deno uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 From ffcf0d84dea67d402bddae260f8531334895b6a8 Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sat, 23 May 2026 22:19:24 +0100 Subject: [PATCH 18/47] chore: use array syntax for some reason the schema for the actions wants it to be an array --- .github/workflows/verify.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/verify.yaml b/.github/workflows/verify.yaml index 0f8d9dc..3674d12 100644 --- a/.github/workflows/verify.yaml +++ b/.github/workflows/verify.yaml @@ -2,9 +2,11 @@ name: Verify on: push: - branches: main + branches: + - main pull_request: - branches: main + branches: + - main permissions: contents: read From e2894298bbc1da525164fd4c913bb3f565ebfe62 Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sat, 23 May 2026 22:20:26 +0100 Subject: [PATCH 19/47] perf: set concurrency limits to reduce cost and improve dx Without this it means that, for example, if I push a change to a PR then shortly push again this workflow will be running twice. This change will cancel the old run before starting the new one, which reduces the overall actions cost and DX as you don't have extra runs --- .github/workflows/verify.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/verify.yaml b/.github/workflows/verify.yaml index 3674d12..09bce38 100644 --- a/.github/workflows/verify.yaml +++ b/.github/workflows/verify.yaml @@ -11,6 +11,10 @@ on: permissions: contents: read +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: test: runs-on: ubuntu-latest From a07c5191b9faa9436dd47f4256764892ca67090d Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sat, 23 May 2026 22:07:35 +0100 Subject: [PATCH 20/47] chore: use hashes for versions --- .github/workflows/preview.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index dee9fab..0123050 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -11,13 +11,13 @@ jobs: timeout-minutes: 10 steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 submodules: true - name: setup deno - uses: denoland/setup-deno@v2 + uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 with: deno-version: v2.x @@ -29,7 +29,7 @@ jobs: run: echo ::set-output name=version::$(git describe --abbrev=0 --tags | sed 's/^v//')-pr+$(git rev-parse HEAD) - name: Setup Node - uses: actions/setup-node@v4 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: 20.x registry-url: https://registry.npmjs.com From ab8d05c10c04d39700eb8eee4a9d243617d61862 Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sat, 23 May 2026 22:08:59 +0100 Subject: [PATCH 21/47] chore: update node version --- .github/workflows/preview.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 0123050..b351a00 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -31,8 +31,7 @@ jobs: - name: Setup Node uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version: 20.x - registry-url: https://registry.npmjs.com + node-version: 24 - name: Build NPM run: deno task build:npm ${{steps.vars.outputs.version}} From 3f9039ed2fd3ec281abd322dad8c0003b21dfb67 Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sat, 23 May 2026 22:11:11 +0100 Subject: [PATCH 22/47] perf: set concurrency limits to reduce cost and improve dx Without this it means that, for example, if I push a change to a PR then shortly push again this workflow will be running twice. This change will cancel the old run before starting the new one, which reduces the overall actions cost and DX as you don't have extra runs --- .github/workflows/preview.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index b351a00..0594f9c 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -5,6 +5,10 @@ on: [pull_request] permissions: contents: read +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: preview: runs-on: ubuntu-latest From dd3dd92c2818473254226f8819d56a4be0f30c88 Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sat, 23 May 2026 22:11:35 +0100 Subject: [PATCH 23/47] chore: don't save git credentials --- .github/workflows/preview.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 0594f9c..58ecf58 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -19,6 +19,7 @@ jobs: with: fetch-depth: 0 submodules: true + persist-credentials: false - name: setup deno uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 From d35706fbe3ba70cfb9da97ca93fc042bede48616 Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sat, 23 May 2026 22:11:55 +0100 Subject: [PATCH 24/47] chore: mitigate potential template injection See https://docs.zizmor.sh/audits/#template-injection --- .github/workflows/preview.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 58ecf58..3d92846 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -39,7 +39,9 @@ jobs: node-version: 24 - name: Build NPM - run: deno task build:npm ${{steps.vars.outputs.version}} + run: deno task build:npm "${STEPS_VARS_OUTPUTS_VERSION}" + env: + STEPS_VARS_OUTPUTS_VERSION: ${{steps.vars.outputs.version}} - name: Publish Preview Versions run: npx pkg-pr-new publish './build/npm' From 6decb0e9137ffc3522861a3fc705f1a9277cf489 Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sat, 23 May 2026 23:35:48 +0100 Subject: [PATCH 25/47] chore: update ::set-output command to new syntax https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/ --- .github/workflows/preview.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 3d92846..5fc0b91 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -31,7 +31,7 @@ jobs: - name: Get Version id: vars - run: echo ::set-output name=version::$(git describe --abbrev=0 --tags | sed 's/^v//')-pr+$(git rev-parse HEAD) + run: echo "version=$(git describe --abbrev=0 --tags | sed 's/^v//')-pr+$(git rev-parse HEAD)" >> $GITHUB_OUTPUT - name: Setup Node uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 From 5ccbffd13888f2c6cfef558cb3e63ac515985216 Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sat, 23 May 2026 22:25:18 +0100 Subject: [PATCH 26/47] chore: use hashes for versions --- .github/workflows/publish.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 800f1d4..7a5a8c1 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -14,12 +14,12 @@ jobs: runs-on: ubuntu-latest steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: submodules: true - name: setup deno - uses: denoland/setup-deno@v2 + uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 with: deno-version: v2.x @@ -40,12 +40,12 @@ jobs: runs-on: ubuntu-latest steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: submodules: true - name: setup deno - uses: denoland/setup-deno@v2 + uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 with: deno-version: v2.x @@ -57,7 +57,7 @@ jobs: run: echo ::set-output name=version::$(echo ${{github.ref_name}} | sed 's/^v//') - name: Setup Node - uses: actions/setup-node@v6 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: 24 @@ -69,7 +69,7 @@ jobs: working-directory: ./build/npm - name: upload build - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: npm-build path: ./build/npm @@ -80,12 +80,12 @@ jobs: steps: - name: Setup Node - uses: actions/setup-node@v6 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: 24 - name: download build - uses: actions/download-artifact@v4 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: npm-build path: ./build/npm @@ -100,12 +100,12 @@ jobs: steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: submodules: true - name: setup deno - uses: denoland/setup-deno@v2 + uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 with: deno-version: v2.x From 822b00e62ae632c0169e472e2e3177cf96cc241f Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sat, 23 May 2026 22:26:27 +0100 Subject: [PATCH 27/47] chore: don't save git credentials --- .github/workflows/publish.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 7a5a8c1..d551581 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -17,6 +17,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: submodules: true + persist-credentials: false - name: setup deno uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 @@ -43,6 +44,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: submodules: true + persist-credentials: false - name: setup deno uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 @@ -103,6 +105,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: submodules: true + persist-credentials: false - name: setup deno uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 From 851de35021af0229a9497091c3931c357c52f204 Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sat, 23 May 2026 22:27:39 +0100 Subject: [PATCH 28/47] chore: limit id-token permission to the publishing steps --- .github/workflows/publish.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index d551581..d7d6da2 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -7,7 +7,6 @@ on: permissions: contents: read - id-token: write jobs: verify-jsr: @@ -79,6 +78,9 @@ jobs: publish-npm: needs: [verify-jsr, verify-npm] runs-on: ubuntu-latest + permissions: + contents: read + id-token: write steps: - name: Setup Node @@ -99,6 +101,9 @@ jobs: publish-jsr: needs: [verify-jsr, verify-npm] runs-on: ubuntu-latest + permissions: + contents: read + id-token: write steps: - name: checkout From e71f703914c1447fa60644b8808be84c460bae56 Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sat, 23 May 2026 22:29:36 +0100 Subject: [PATCH 29/47] chore: explicitly disable npm cache to mitigate cache poisoning attacks --- .github/workflows/publish.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index d7d6da2..78a7df6 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -61,6 +61,8 @@ jobs: uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: 24 + package-manager-cache: false + cache: "" - name: Build NPM run: deno task build:npm ${{steps.vars.outputs.version}} @@ -87,6 +89,8 @@ jobs: uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: 24 + package-manager-cache: false + cache: "" - name: download build uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 From a968d96e613aad7275a7742f322a4f4031bf4baf Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sat, 23 May 2026 22:38:09 +0100 Subject: [PATCH 30/47] chore: mitigate potential template injection See https://docs.zizmor.sh/audits/#template-injection --- .github/workflows/publish.yml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 78a7df6..acfd6a7 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -28,10 +28,12 @@ jobs: - name: Get Version id: vars - run: echo ::set-output name=version::$(echo ${{github.ref_name}} | sed 's/^v//') + run: echo ::set-output name=version::$(echo "${GITHUB_REF_NAME}" | sed 's/^v//') - name: Build JSR - run: deno task build:jsr ${{steps.vars.outputs.version}} + run: deno task build:jsr "${STEPS_VARS_OUTPUTS_VERSION}" + env: + STEPS_VARS_OUTPUTS_VERSION: ${{steps.vars.outputs.version}} - name: dry run publish run: deno publish --dry-run --allow-dirty @@ -55,7 +57,7 @@ jobs: - name: Get Version id: vars - run: echo ::set-output name=version::$(echo ${{github.ref_name}} | sed 's/^v//') + run: echo ::set-output name=version::$(echo "${GITHUB_REF_NAME}" | sed 's/^v//') - name: Setup Node uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 @@ -65,7 +67,9 @@ jobs: cache: "" - name: Build NPM - run: deno task build:npm ${{steps.vars.outputs.version}} + run: deno task build:npm "${STEPS_VARS_OUTPUTS_VERSION}" + env: + STEPS_VARS_OUTPUTS_VERSION: ${{steps.vars.outputs.version}} - name: dry run publish run: npm publish --dry-run --tag=verify @@ -126,10 +130,12 @@ jobs: - name: Get Version id: vars - run: echo ::set-output name=version::$(echo ${{github.ref_name}} | sed 's/^v//') + run: echo ::set-output name=version::$(echo "${GITHUB_REF_NAME}" | sed 's/^v//') - name: Build JSR - run: deno task build:jsr ${{steps.vars.outputs.version}} + run: deno task build:jsr "${STEPS_VARS_OUTPUTS_VERSION}" + env: + STEPS_VARS_OUTPUTS_VERSION: ${{steps.vars.outputs.version}} - name: Publish JSR run: deno publish --allow-dirty --token=${{ secrets.JSR_TOKEN }} From fa296c797471dc0eb33fab1c23d3f81fed036095 Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sat, 23 May 2026 22:38:57 +0100 Subject: [PATCH 31/47] chore: use oidc This should be using OIDC for publishing --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index acfd6a7..8f4a277 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -138,4 +138,4 @@ jobs: STEPS_VARS_OUTPUTS_VERSION: ${{steps.vars.outputs.version}} - name: Publish JSR - run: deno publish --allow-dirty --token=${{ secrets.JSR_TOKEN }} + run: deno publish --allow-dirty From f48f1035efd4a0e2679c054947cf627c8b5b150a Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sat, 23 May 2026 23:37:24 +0100 Subject: [PATCH 32/47] chore: update ::set-output command to new syntax https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/ --- .github/workflows/publish.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8f4a277..c130955 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -28,7 +28,7 @@ jobs: - name: Get Version id: vars - run: echo ::set-output name=version::$(echo "${GITHUB_REF_NAME}" | sed 's/^v//') + run: echo "version=$(echo "${GITHUB_REF_NAME}" | sed 's/^v//')" >> $GITHUB_OUTPUT - name: Build JSR run: deno task build:jsr "${STEPS_VARS_OUTPUTS_VERSION}" @@ -57,7 +57,7 @@ jobs: - name: Get Version id: vars - run: echo ::set-output name=version::$(echo "${GITHUB_REF_NAME}" | sed 's/^v//') + run: echo "version=$(echo "${GITHUB_REF_NAME}" | sed 's/^v//')" >> $GITHUB_OUTPUT - name: Setup Node uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 @@ -130,7 +130,7 @@ jobs: - name: Get Version id: vars - run: echo ::set-output name=version::$(echo "${GITHUB_REF_NAME}" | sed 's/^v//') + run: echo "version=$(echo "${GITHUB_REF_NAME}" | sed 's/^v//')" >> $GITHUB_OUTPUT - name: Build JSR run: deno task build:jsr "${STEPS_VARS_OUTPUTS_VERSION}" From 79052b0cb324349ae0bc30600b5dec4c9f7b7adc Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Sun, 24 May 2026 13:27:45 -0400 Subject: [PATCH 33/47] =?UTF-8?q?=F0=9F=99=85=20revert=20aggressive=20opti?= =?UTF-8?q?mization=20experiments=20pending=20benchmark?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reverts three changes that need benchmarks before landing: - -Oz / wasm-opt - brotli+Z85 wasm compression - wcwidth.c rewrite --- .github/workflows/preview.yml | 3 - .github/workflows/publish.yml | 9 - .github/workflows/verify.yaml | 9 - Makefile | 4 +- deno.json | 6 +- deno.lock | 1 - src/wcwidth.c | 1260 ++++++++++++++++++++++++++++----- tasks/bundle-wasm.ts | 55 +- 8 files changed, 1107 insertions(+), 240 deletions(-) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 5f1647f..dee9fab 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -21,9 +21,6 @@ jobs: with: deno-version: v2.x - - name: install binaryen - run: sudo apt-get install -y binaryen - - name: build wasm run: make diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 0796120..800f1d4 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -23,9 +23,6 @@ jobs: with: deno-version: v2.x - - name: install binaryen - run: sudo apt-get install -y binaryen - - name: build wasm run: make @@ -52,9 +49,6 @@ jobs: with: deno-version: v2.x - - name: install binaryen - run: sudo apt-get install -y binaryen - - name: build wasm run: make @@ -115,9 +109,6 @@ jobs: with: deno-version: v2.x - - name: install binaryen - run: sudo apt-get install -y binaryen - - name: build wasm run: make diff --git a/.github/workflows/verify.yaml b/.github/workflows/verify.yaml index 5407de7..3fd5b3f 100644 --- a/.github/workflows/verify.yaml +++ b/.github/workflows/verify.yaml @@ -30,9 +30,6 @@ jobs: - name: lint run: deno lint - - name: install binaryen - run: sudo apt-get install -y binaryen - - name: build wasm run: make @@ -91,9 +88,6 @@ jobs: with: deno-version: v2.x - - name: install binaryen - run: sudo apt-get install -y binaryen - - name: build wasm run: make @@ -122,9 +116,6 @@ jobs: with: node-version: 24 - - name: install binaryen - run: sudo apt-get install -y binaryen - - name: build wasm run: make diff --git a/Makefile b/Makefile index cb6e391..1103b8e 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,8 @@ CC = clang -WASM_OPT ?= wasm-opt TARGET = clayterm.wasm SRC = src/module.c -CFLAGS = --target=wasm32 -nostdlib -Oz \ +CFLAGS = --target=wasm32 -nostdlib -O2 \ -ffunction-sections -fdata-sections \ -mbulk-memory \ -DCLAY_IMPLEMENTATION -DCLAY_WASM \ @@ -49,7 +48,6 @@ DEPS = $(wildcard src/*.c src/*.h) $(TARGET): $(DEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(SRC) - $(WASM_OPT) -Oz --enable-bulk-memory -o $@ $@ wasm.ts: $(TARGET) deno run --allow-read --allow-write tasks/bundle-wasm.ts diff --git a/deno.json b/deno.json index 3aff2ca..fab9ce2 100644 --- a/deno.json +++ b/deno.json @@ -15,8 +15,7 @@ "@sinclair/typebox": "npm:@sinclair/typebox@^0.34", "dnt": "jsr:@deno/dnt@0.42.3", "effection": "npm:effection@^4.0.2", - "@std/encoding": "jsr:@std/encoding@1", - "@types/node": "npm:@types/node@^22" + "@std/encoding": "jsr:@std/encoding@1" }, "exports": { ".": "./mod.ts", @@ -26,9 +25,6 @@ "include": ["*.ts"], "exclude": ["!wasm.ts"] }, - "compilerOptions": { - "types": ["@types/node"] - }, "fmt": { "exclude": ["clay", "build"] }, diff --git a/deno.lock b/deno.lock index 84bd87c..7947a80 100644 --- a/deno.lock +++ b/deno.lock @@ -126,7 +126,6 @@ "jsr:@std/expect@1", "jsr:@std/testing@1", "npm:@sinclair/typebox@0.34", - "npm:@types/node@22", "npm:effection@^4.0.2" ] } diff --git a/src/wcwidth.c b/src/wcwidth.c index 11922f5..b821866 100644 --- a/src/wcwidth.c +++ b/src/wcwidth.c @@ -1,167 +1,1096 @@ /* wcwidth.c - Unicode character width lookup - * Derived from termbox2 (https://github.com/termbox/termbox2), Unicode 15.0 + * Extracted from termbox2 (https://github.com/termbox/termbox2) + * Table covers Unicode 15.0 * - * Minimal variant: only width-0 (combining) and width-2 (wide CJK) entries. - * All other assigned and unassigned codepoints default to width 1. - * Sources: EastAsianWidth.txt (W/F → 2), UnicodeData.txt Mn/Me (→ 0), - * DerivedCoreProperties.txt Default_Ignorable (→ 0) - * - * Encoding: two split tables (w=0 and w=2), each stored as parallel - * uint32_t lo[] + uint16_t count[] arrays where hi = lo + count. + * To verify or update, the canonical sources are: + * - https://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt + * Defines W (wide=2) and F (fullwidth=2) + * - https://www.unicode.org/Public/UNIDATA/UnicodeData.txt + * General_Category=Mn/Me for combining marks (width=0) + * - https://www.unicode.org/Public/UNIDATA/DerivedCoreProperties.txt + * Default_Ignorable_Code_Point for zero-width */ #include -static const uint32_t wcw0_lo[] = { - 0x000300, 0x000483, 0x000591, 0x0005bf, 0x0005c1, 0x0005c4, 0x0005c7, - 0x000610, 0x00061c, 0x00064b, 0x000670, 0x0006d6, 0x0006df, 0x0006e7, - 0x0006ea, 0x000711, 0x000730, 0x0007a6, 0x0007eb, 0x0007fd, 0x000816, - 0x00081b, 0x000825, 0x000829, 0x000859, 0x000897, 0x0008ca, 0x0008e3, - 0x00093a, 0x00093c, 0x000941, 0x00094d, 0x000951, 0x000962, 0x000981, - 0x0009bc, 0x0009c1, 0x0009cd, 0x0009e2, 0x0009fe, 0x000a01, 0x000a3c, - 0x000a41, 0x000a47, 0x000a4b, 0x000a51, 0x000a70, 0x000a75, 0x000a81, - 0x000abc, 0x000ac1, 0x000ac7, 0x000acd, 0x000ae2, 0x000afa, 0x000b01, - 0x000b3c, 0x000b3f, 0x000b41, 0x000b4d, 0x000b55, 0x000b62, 0x000b82, - 0x000bc0, 0x000bcd, 0x000c00, 0x000c04, 0x000c3c, 0x000c3e, 0x000c46, - 0x000c4a, 0x000c55, 0x000c62, 0x000c81, 0x000cbc, 0x000cbf, 0x000cc6, - 0x000ccc, 0x000ce2, 0x000d00, 0x000d3b, 0x000d41, 0x000d4d, 0x000d62, - 0x000d81, 0x000dca, 0x000dd2, 0x000dd6, 0x000e31, 0x000e34, 0x000e47, - 0x000eb1, 0x000eb4, 0x000ec8, 0x000f18, 0x000f35, 0x000f37, 0x000f39, - 0x000f71, 0x000f80, 0x000f86, 0x000f8d, 0x000f99, 0x000fc6, 0x00102d, - 0x001032, 0x001039, 0x00103d, 0x001058, 0x00105e, 0x001071, 0x001082, - 0x001085, 0x00108d, 0x00109d, 0x001160, 0x00135d, 0x001712, 0x001732, - 0x001752, 0x001772, 0x0017b4, 0x0017b7, 0x0017c6, 0x0017c9, 0x0017dd, - 0x00180b, 0x001885, 0x0018a9, 0x001920, 0x001927, 0x001932, 0x001939, - 0x001a17, 0x001a1b, 0x001a56, 0x001a58, 0x001a60, 0x001a62, 0x001a65, - 0x001a73, 0x001a7f, 0x001ab0, 0x001b00, 0x001b34, 0x001b36, 0x001b3c, - 0x001b42, 0x001b6b, 0x001b80, 0x001ba2, 0x001ba8, 0x001bab, 0x001be6, - 0x001be8, 0x001bed, 0x001bef, 0x001c2c, 0x001c36, 0x001cd0, 0x001cd4, - 0x001ce2, 0x001ced, 0x001cf4, 0x001cf8, 0x001dc0, 0x00200b, 0x00202a, - 0x002060, 0x002066, 0x0020d0, 0x002cef, 0x002d7f, 0x002de0, 0x00302a, - 0x003099, 0x003164, 0x00a66f, 0x00a674, 0x00a69e, 0x00a6f0, 0x00a802, - 0x00a806, 0x00a80b, 0x00a825, 0x00a82c, 0x00a8c4, 0x00a8e0, 0x00a8ff, - 0x00a926, 0x00a947, 0x00a980, 0x00a9b3, 0x00a9b6, 0x00a9bc, 0x00a9e5, - 0x00aa29, 0x00aa31, 0x00aa35, 0x00aa43, 0x00aa4c, 0x00aa7c, 0x00aab0, - 0x00aab2, 0x00aab7, 0x00aabe, 0x00aac1, 0x00aaec, 0x00aaf6, 0x00abe5, - 0x00abe8, 0x00abed, 0x00d7b0, 0x00d7cb, 0x00fb1e, 0x00fe00, 0x00fe20, - 0x00feff, 0x00ffa0, 0x0101fd, 0x0102e0, 0x010376, 0x010a01, 0x010a05, - 0x010a0c, 0x010a38, 0x010a3f, 0x010ae5, 0x010d24, 0x010d69, 0x010eab, - 0x010efc, 0x010f46, 0x010f82, 0x011001, 0x011038, 0x011070, 0x011073, - 0x01107f, 0x0110b3, 0x0110b9, 0x0110c2, 0x011100, 0x011127, 0x01112d, - 0x011173, 0x011180, 0x0111b6, 0x0111c9, 0x0111cf, 0x01122f, 0x011234, - 0x011236, 0x01123e, 0x011241, 0x0112df, 0x0112e3, 0x011300, 0x01133b, - 0x011340, 0x011366, 0x011370, 0x0113bb, 0x0113ce, 0x0113d0, 0x0113d2, - 0x0113e1, 0x011438, 0x011442, 0x011446, 0x01145e, 0x0114b3, 0x0114ba, - 0x0114bf, 0x0114c2, 0x0115b2, 0x0115bc, 0x0115bf, 0x0115dc, 0x011633, - 0x01163d, 0x01163f, 0x0116ab, 0x0116ad, 0x0116b0, 0x0116b7, 0x01171d, - 0x01171f, 0x011722, 0x011727, 0x01182f, 0x011839, 0x01193b, 0x01193e, - 0x011943, 0x0119d4, 0x0119da, 0x0119e0, 0x011a01, 0x011a33, 0x011a3b, - 0x011a47, 0x011a51, 0x011a59, 0x011a8a, 0x011a98, 0x011c30, 0x011c38, - 0x011c3f, 0x011c92, 0x011caa, 0x011cb2, 0x011cb5, 0x011d31, 0x011d3a, - 0x011d3c, 0x011d3f, 0x011d47, 0x011d90, 0x011d95, 0x011d97, 0x011ef3, - 0x011f00, 0x011f36, 0x011f40, 0x011f42, 0x011f5a, 0x013440, 0x013447, - 0x01611e, 0x01612d, 0x016af0, 0x016b30, 0x016f4f, 0x016f8f, 0x016fe4, - 0x01bc9d, 0x01bca0, 0x01cf00, 0x01cf30, 0x01d167, 0x01d173, 0x01d185, - 0x01d1aa, 0x01d242, 0x01da00, 0x01da3b, 0x01da75, 0x01da84, 0x01da9b, - 0x01daa1, 0x01e000, 0x01e008, 0x01e01b, 0x01e023, 0x01e026, 0x01e08f, - 0x01e130, 0x01e2ae, 0x01e2ec, 0x01e4ec, 0x01e5ee, 0x01e8d0, 0x01e944, - 0x0e0001, 0x0e0020, 0x0e0100}; -static const uint16_t wcw0_cnt[] = { - 0x006f, 0x0006, 0x002c, 0x0000, 0x0001, 0x0001, 0x0000, 0x000a, 0x0000, - 0x0014, 0x0000, 0x0006, 0x0005, 0x0001, 0x0003, 0x0000, 0x001a, 0x000a, - 0x0008, 0x0000, 0x0003, 0x0008, 0x0002, 0x0004, 0x0002, 0x0008, 0x0017, - 0x001f, 0x0000, 0x0000, 0x0007, 0x0000, 0x0006, 0x0001, 0x0000, 0x0000, - 0x0003, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0001, 0x0002, - 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0004, 0x0001, 0x0000, 0x0001, - 0x0005, 0x0000, 0x0000, 0x0000, 0x0003, 0x0000, 0x0001, 0x0001, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0002, 0x0003, 0x0001, - 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, - 0x0003, 0x0000, 0x0001, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0006, - 0x0007, 0x0000, 0x0008, 0x0006, 0x0001, 0x0000, 0x0000, 0x0000, 0x000d, - 0x0004, 0x0001, 0x000a, 0x0023, 0x0000, 0x0003, 0x0005, 0x0001, 0x0001, - 0x0001, 0x0002, 0x0003, 0x0000, 0x0001, 0x0000, 0x0000, 0x009f, 0x0002, - 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0000, 0x000a, 0x0000, - 0x0004, 0x0001, 0x0000, 0x0002, 0x0001, 0x0000, 0x0002, 0x0001, 0x0000, - 0x0000, 0x0006, 0x0000, 0x0000, 0x0007, 0x0009, 0x0000, 0x001e, 0x0003, - 0x0000, 0x0004, 0x0000, 0x0000, 0x0008, 0x0001, 0x0003, 0x0001, 0x0002, - 0x0000, 0x0001, 0x0000, 0x0002, 0x0007, 0x0001, 0x0002, 0x000c, 0x0006, - 0x0000, 0x0000, 0x0001, 0x003f, 0x0004, 0x0004, 0x0004, 0x0009, 0x0020, - 0x0002, 0x0000, 0x001f, 0x0003, 0x0001, 0x0000, 0x0003, 0x0009, 0x0001, - 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0001, 0x0011, 0x0000, - 0x0007, 0x000a, 0x0002, 0x0000, 0x0003, 0x0001, 0x0000, 0x0005, 0x0001, - 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0001, 0x0001, 0x0000, - 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0016, 0x0030, 0x0000, 0x000f, - 0x000f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0002, 0x0001, 0x0003, - 0x0002, 0x0000, 0x0001, 0x0003, 0x0004, 0x0001, 0x0003, 0x000a, 0x0003, - 0x0000, 0x000e, 0x0000, 0x0001, 0x0002, 0x0003, 0x0001, 0x0000, 0x0002, - 0x0004, 0x0007, 0x0000, 0x0001, 0x0008, 0x0003, 0x0000, 0x0002, 0x0000, - 0x0001, 0x0000, 0x0000, 0x0000, 0x0007, 0x0001, 0x0001, 0x0000, 0x0006, - 0x0004, 0x0005, 0x0000, 0x0000, 0x0000, 0x0001, 0x0007, 0x0002, 0x0000, - 0x0000, 0x0005, 0x0000, 0x0001, 0x0001, 0x0003, 0x0001, 0x0001, 0x0001, - 0x0007, 0x0000, 0x0001, 0x0000, 0x0000, 0x0005, 0x0000, 0x0000, 0x0000, - 0x0003, 0x0004, 0x0008, 0x0001, 0x0001, 0x0000, 0x0000, 0x0003, 0x0001, - 0x0000, 0x0009, 0x0005, 0x0003, 0x0000, 0x0005, 0x0002, 0x000c, 0x0001, - 0x0006, 0x0005, 0x0000, 0x0015, 0x0006, 0x0001, 0x0001, 0x0005, 0x0000, - 0x0001, 0x0006, 0x0000, 0x0001, 0x0000, 0x0000, 0x0001, 0x0001, 0x0004, - 0x0000, 0x0000, 0x0000, 0x0000, 0x000e, 0x000b, 0x0002, 0x0004, 0x0006, - 0x0000, 0x0003, 0x0000, 0x0001, 0x0003, 0x002d, 0x0016, 0x0002, 0x000f, - 0x0006, 0x0003, 0x0002, 0x0036, 0x0031, 0x0000, 0x0000, 0x0004, 0x000e, - 0x0006, 0x0010, 0x0006, 0x0001, 0x0004, 0x0000, 0x0006, 0x0000, 0x0003, - 0x0003, 0x0001, 0x0006, 0x0006, 0x0000, 0x005f, 0x00ef}; -#define WCW0_LEN 367 - -static const uint32_t wcw2_lo[] = { - 0x001100, 0x00231a, 0x002329, 0x0023e9, 0x0023f0, 0x0023f3, 0x0025fd, - 0x002614, 0x002630, 0x002648, 0x00267f, 0x00268a, 0x002693, 0x0026a1, - 0x0026aa, 0x0026bd, 0x0026c4, 0x0026ce, 0x0026d4, 0x0026ea, 0x0026f2, - 0x0026f5, 0x0026fa, 0x0026fd, 0x002705, 0x00270a, 0x002728, 0x00274c, - 0x00274e, 0x002753, 0x002757, 0x002795, 0x0027b0, 0x0027bf, 0x002b1b, - 0x002b50, 0x002b55, 0x002e80, 0x002e9b, 0x002f00, 0x002ff0, 0x00302e, - 0x003041, 0x00309b, 0x003105, 0x003131, 0x003165, 0x003190, 0x0031ef, - 0x003220, 0x00a490, 0x00a960, 0x00ac00, 0x00f900, 0x00fa70, 0x00fe10, - 0x00fe30, 0x00fe54, 0x00fe68, 0x00ff01, 0x00ffe0, 0x016fe0, 0x016ff0, - 0x017000, 0x018800, 0x018cff, 0x01aff0, 0x01aff5, 0x01affd, 0x01b000, - 0x01b132, 0x01b150, 0x01b155, 0x01b164, 0x01b170, 0x01d300, 0x01d360, - 0x01f004, 0x01f0cf, 0x01f18e, 0x01f191, 0x01f200, 0x01f210, 0x01f240, - 0x01f250, 0x01f260, 0x01f300, 0x01f32d, 0x01f337, 0x01f37e, 0x01f3a0, - 0x01f3cf, 0x01f3e0, 0x01f3f4, 0x01f3f8, 0x01f440, 0x01f442, 0x01f4ff, - 0x01f54b, 0x01f550, 0x01f57a, 0x01f595, 0x01f5a4, 0x01f5fb, 0x01f680, - 0x01f6cc, 0x01f6d0, 0x01f6d5, 0x01f6dc, 0x01f6eb, 0x01f6f4, 0x01f7e0, - 0x01f7f0, 0x01f90c, 0x01f93c, 0x01f947, 0x01fa70, 0x01fa80, 0x01fa8f, - 0x01face, 0x01fadf, 0x01faf0, 0x020000, 0x02a700, 0x02b740, 0x02b820, - 0x02ceb0, 0x02ebf0, 0x02f800, 0x030000, 0x031350}; -static const uint16_t wcw2_cnt[] = { - 0x005f, 0x0001, 0x0001, 0x0003, 0x0000, 0x0000, 0x0001, 0x0001, 0x0007, - 0x000b, 0x0000, 0x0005, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0000, - 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, - 0x0000, 0x0000, 0x0002, 0x0000, 0x0002, 0x0000, 0x0000, 0x0001, 0x0000, - 0x0000, 0x0019, 0x0058, 0x00d5, 0x0039, 0x0010, 0x0055, 0x0064, 0x002a, - 0x0032, 0x0029, 0x0055, 0x002f, 0x726c, 0x0036, 0x001c, 0x2ba3, 0x016d, - 0x0069, 0x0009, 0x0022, 0x0012, 0x0003, 0x005f, 0x0006, 0x0003, 0x0001, - 0x17f7, 0x04d5, 0x0009, 0x0003, 0x0006, 0x0001, 0x0122, 0x0000, 0x0002, - 0x0000, 0x0003, 0x018b, 0x0056, 0x0016, 0x0000, 0x0000, 0x0000, 0x0009, - 0x0002, 0x002b, 0x0008, 0x0001, 0x0005, 0x0020, 0x0008, 0x0045, 0x0015, - 0x002a, 0x0004, 0x0010, 0x0000, 0x0046, 0x0000, 0x00ba, 0x003e, 0x0003, - 0x0017, 0x0000, 0x0001, 0x0000, 0x0054, 0x0045, 0x0000, 0x0002, 0x0002, - 0x0003, 0x0001, 0x0008, 0x000b, 0x0000, 0x002e, 0x0009, 0x00b8, 0x000c, - 0x0009, 0x0037, 0x000e, 0x000a, 0x0008, 0xa6df, 0x1039, 0x00dd, 0x1681, - 0x1d30, 0x026d, 0x021d, 0x134a, 0x105f}; -#define WCW2_LEN 131 +static struct { + uint32_t lo; + uint32_t hi; + int w; +} wcwidth_table[] = {{0x000001, 0x00001f, -1}, {0x000020, 0x00007e, 1}, + {0x00007f, 0x00009f, -1}, {0x0000a0, 0x0002ff, 1}, + {0x000300, 0x00036f, 0}, {0x000370, 0x000377, 1}, + {0x000378, 0x000379, -1}, {0x00037a, 0x00037f, 1}, + {0x000380, 0x000383, -1}, {0x000384, 0x00038a, 1}, + {0x00038b, 0x00038b, -1}, {0x00038c, 0x00038c, 1}, + {0x00038d, 0x00038d, -1}, {0x00038e, 0x0003a1, 1}, + {0x0003a2, 0x0003a2, -1}, {0x0003a3, 0x000482, 1}, + {0x000483, 0x000489, 0}, {0x00048a, 0x00052f, 1}, + {0x000530, 0x000530, -1}, {0x000531, 0x000556, 1}, + {0x000557, 0x000558, -1}, {0x000559, 0x00058a, 1}, + {0x00058b, 0x00058c, -1}, {0x00058d, 0x00058f, 1}, + {0x000590, 0x000590, -1}, {0x000591, 0x0005bd, 0}, + {0x0005be, 0x0005be, 1}, {0x0005bf, 0x0005bf, 0}, + {0x0005c0, 0x0005c0, 1}, {0x0005c1, 0x0005c2, 0}, + {0x0005c3, 0x0005c3, 1}, {0x0005c4, 0x0005c5, 0}, + {0x0005c6, 0x0005c6, 1}, {0x0005c7, 0x0005c7, 0}, + {0x0005c8, 0x0005cf, -1}, {0x0005d0, 0x0005ea, 1}, + {0x0005eb, 0x0005ee, -1}, {0x0005ef, 0x0005f4, 1}, + {0x0005f5, 0x0005ff, -1}, {0x000600, 0x00060f, 1}, + {0x000610, 0x00061a, 0}, {0x00061b, 0x00061b, 1}, + {0x00061c, 0x00061c, 0}, {0x00061d, 0x00064a, 1}, + {0x00064b, 0x00065f, 0}, {0x000660, 0x00066f, 1}, + {0x000670, 0x000670, 0}, {0x000671, 0x0006d5, 1}, + {0x0006d6, 0x0006dc, 0}, {0x0006dd, 0x0006de, 1}, + {0x0006df, 0x0006e4, 0}, {0x0006e5, 0x0006e6, 1}, + {0x0006e7, 0x0006e8, 0}, {0x0006e9, 0x0006e9, 1}, + {0x0006ea, 0x0006ed, 0}, {0x0006ee, 0x00070d, 1}, + {0x00070e, 0x00070e, -1}, {0x00070f, 0x000710, 1}, + {0x000711, 0x000711, 0}, {0x000712, 0x00072f, 1}, + {0x000730, 0x00074a, 0}, {0x00074b, 0x00074c, -1}, + {0x00074d, 0x0007a5, 1}, {0x0007a6, 0x0007b0, 0}, + {0x0007b1, 0x0007b1, 1}, {0x0007b2, 0x0007bf, -1}, + {0x0007c0, 0x0007ea, 1}, {0x0007eb, 0x0007f3, 0}, + {0x0007f4, 0x0007fa, 1}, {0x0007fb, 0x0007fc, -1}, + {0x0007fd, 0x0007fd, 0}, {0x0007fe, 0x000815, 1}, + {0x000816, 0x000819, 0}, {0x00081a, 0x00081a, 1}, + {0x00081b, 0x000823, 0}, {0x000824, 0x000824, 1}, + {0x000825, 0x000827, 0}, {0x000828, 0x000828, 1}, + {0x000829, 0x00082d, 0}, {0x00082e, 0x00082f, -1}, + {0x000830, 0x00083e, 1}, {0x00083f, 0x00083f, -1}, + {0x000840, 0x000858, 1}, {0x000859, 0x00085b, 0}, + {0x00085c, 0x00085d, -1}, {0x00085e, 0x00085e, 1}, + {0x00085f, 0x00085f, -1}, {0x000860, 0x00086a, 1}, + {0x00086b, 0x00086f, -1}, {0x000870, 0x00088e, 1}, + {0x00088f, 0x00088f, -1}, {0x000890, 0x000891, 1}, + {0x000892, 0x000896, -1}, {0x000897, 0x00089f, 0}, + {0x0008a0, 0x0008c9, 1}, {0x0008ca, 0x0008e1, 0}, + {0x0008e2, 0x0008e2, 1}, {0x0008e3, 0x000902, 0}, + {0x000903, 0x000939, 1}, {0x00093a, 0x00093a, 0}, + {0x00093b, 0x00093b, 1}, {0x00093c, 0x00093c, 0}, + {0x00093d, 0x000940, 1}, {0x000941, 0x000948, 0}, + {0x000949, 0x00094c, 1}, {0x00094d, 0x00094d, 0}, + {0x00094e, 0x000950, 1}, {0x000951, 0x000957, 0}, + {0x000958, 0x000961, 1}, {0x000962, 0x000963, 0}, + {0x000964, 0x000980, 1}, {0x000981, 0x000981, 0}, + {0x000982, 0x000983, 1}, {0x000984, 0x000984, -1}, + {0x000985, 0x00098c, 1}, {0x00098d, 0x00098e, -1}, + {0x00098f, 0x000990, 1}, {0x000991, 0x000992, -1}, + {0x000993, 0x0009a8, 1}, {0x0009a9, 0x0009a9, -1}, + {0x0009aa, 0x0009b0, 1}, {0x0009b1, 0x0009b1, -1}, + {0x0009b2, 0x0009b2, 1}, {0x0009b3, 0x0009b5, -1}, + {0x0009b6, 0x0009b9, 1}, {0x0009ba, 0x0009bb, -1}, + {0x0009bc, 0x0009bc, 0}, {0x0009bd, 0x0009c0, 1}, + {0x0009c1, 0x0009c4, 0}, {0x0009c5, 0x0009c6, -1}, + {0x0009c7, 0x0009c8, 1}, {0x0009c9, 0x0009ca, -1}, + {0x0009cb, 0x0009cc, 1}, {0x0009cd, 0x0009cd, 0}, + {0x0009ce, 0x0009ce, 1}, {0x0009cf, 0x0009d6, -1}, + {0x0009d7, 0x0009d7, 1}, {0x0009d8, 0x0009db, -1}, + {0x0009dc, 0x0009dd, 1}, {0x0009de, 0x0009de, -1}, + {0x0009df, 0x0009e1, 1}, {0x0009e2, 0x0009e3, 0}, + {0x0009e4, 0x0009e5, -1}, {0x0009e6, 0x0009fd, 1}, + {0x0009fe, 0x0009fe, 0}, {0x0009ff, 0x000a00, -1}, + {0x000a01, 0x000a02, 0}, {0x000a03, 0x000a03, 1}, + {0x000a04, 0x000a04, -1}, {0x000a05, 0x000a0a, 1}, + {0x000a0b, 0x000a0e, -1}, {0x000a0f, 0x000a10, 1}, + {0x000a11, 0x000a12, -1}, {0x000a13, 0x000a28, 1}, + {0x000a29, 0x000a29, -1}, {0x000a2a, 0x000a30, 1}, + {0x000a31, 0x000a31, -1}, {0x000a32, 0x000a33, 1}, + {0x000a34, 0x000a34, -1}, {0x000a35, 0x000a36, 1}, + {0x000a37, 0x000a37, -1}, {0x000a38, 0x000a39, 1}, + {0x000a3a, 0x000a3b, -1}, {0x000a3c, 0x000a3c, 0}, + {0x000a3d, 0x000a3d, -1}, {0x000a3e, 0x000a40, 1}, + {0x000a41, 0x000a42, 0}, {0x000a43, 0x000a46, -1}, + {0x000a47, 0x000a48, 0}, {0x000a49, 0x000a4a, -1}, + {0x000a4b, 0x000a4d, 0}, {0x000a4e, 0x000a50, -1}, + {0x000a51, 0x000a51, 0}, {0x000a52, 0x000a58, -1}, + {0x000a59, 0x000a5c, 1}, {0x000a5d, 0x000a5d, -1}, + {0x000a5e, 0x000a5e, 1}, {0x000a5f, 0x000a65, -1}, + {0x000a66, 0x000a6f, 1}, {0x000a70, 0x000a71, 0}, + {0x000a72, 0x000a74, 1}, {0x000a75, 0x000a75, 0}, + {0x000a76, 0x000a76, 1}, {0x000a77, 0x000a80, -1}, + {0x000a81, 0x000a82, 0}, {0x000a83, 0x000a83, 1}, + {0x000a84, 0x000a84, -1}, {0x000a85, 0x000a8d, 1}, + {0x000a8e, 0x000a8e, -1}, {0x000a8f, 0x000a91, 1}, + {0x000a92, 0x000a92, -1}, {0x000a93, 0x000aa8, 1}, + {0x000aa9, 0x000aa9, -1}, {0x000aaa, 0x000ab0, 1}, + {0x000ab1, 0x000ab1, -1}, {0x000ab2, 0x000ab3, 1}, + {0x000ab4, 0x000ab4, -1}, {0x000ab5, 0x000ab9, 1}, + {0x000aba, 0x000abb, -1}, {0x000abc, 0x000abc, 0}, + {0x000abd, 0x000ac0, 1}, {0x000ac1, 0x000ac5, 0}, + {0x000ac6, 0x000ac6, -1}, {0x000ac7, 0x000ac8, 0}, + {0x000ac9, 0x000ac9, 1}, {0x000aca, 0x000aca, -1}, + {0x000acb, 0x000acc, 1}, {0x000acd, 0x000acd, 0}, + {0x000ace, 0x000acf, -1}, {0x000ad0, 0x000ad0, 1}, + {0x000ad1, 0x000adf, -1}, {0x000ae0, 0x000ae1, 1}, + {0x000ae2, 0x000ae3, 0}, {0x000ae4, 0x000ae5, -1}, + {0x000ae6, 0x000af1, 1}, {0x000af2, 0x000af8, -1}, + {0x000af9, 0x000af9, 1}, {0x000afa, 0x000aff, 0}, + {0x000b00, 0x000b00, -1}, {0x000b01, 0x000b01, 0}, + {0x000b02, 0x000b03, 1}, {0x000b04, 0x000b04, -1}, + {0x000b05, 0x000b0c, 1}, {0x000b0d, 0x000b0e, -1}, + {0x000b0f, 0x000b10, 1}, {0x000b11, 0x000b12, -1}, + {0x000b13, 0x000b28, 1}, {0x000b29, 0x000b29, -1}, + {0x000b2a, 0x000b30, 1}, {0x000b31, 0x000b31, -1}, + {0x000b32, 0x000b33, 1}, {0x000b34, 0x000b34, -1}, + {0x000b35, 0x000b39, 1}, {0x000b3a, 0x000b3b, -1}, + {0x000b3c, 0x000b3c, 0}, {0x000b3d, 0x000b3e, 1}, + {0x000b3f, 0x000b3f, 0}, {0x000b40, 0x000b40, 1}, + {0x000b41, 0x000b44, 0}, {0x000b45, 0x000b46, -1}, + {0x000b47, 0x000b48, 1}, {0x000b49, 0x000b4a, -1}, + {0x000b4b, 0x000b4c, 1}, {0x000b4d, 0x000b4d, 0}, + {0x000b4e, 0x000b54, -1}, {0x000b55, 0x000b56, 0}, + {0x000b57, 0x000b57, 1}, {0x000b58, 0x000b5b, -1}, + {0x000b5c, 0x000b5d, 1}, {0x000b5e, 0x000b5e, -1}, + {0x000b5f, 0x000b61, 1}, {0x000b62, 0x000b63, 0}, + {0x000b64, 0x000b65, -1}, {0x000b66, 0x000b77, 1}, + {0x000b78, 0x000b81, -1}, {0x000b82, 0x000b82, 0}, + {0x000b83, 0x000b83, 1}, {0x000b84, 0x000b84, -1}, + {0x000b85, 0x000b8a, 1}, {0x000b8b, 0x000b8d, -1}, + {0x000b8e, 0x000b90, 1}, {0x000b91, 0x000b91, -1}, + {0x000b92, 0x000b95, 1}, {0x000b96, 0x000b98, -1}, + {0x000b99, 0x000b9a, 1}, {0x000b9b, 0x000b9b, -1}, + {0x000b9c, 0x000b9c, 1}, {0x000b9d, 0x000b9d, -1}, + {0x000b9e, 0x000b9f, 1}, {0x000ba0, 0x000ba2, -1}, + {0x000ba3, 0x000ba4, 1}, {0x000ba5, 0x000ba7, -1}, + {0x000ba8, 0x000baa, 1}, {0x000bab, 0x000bad, -1}, + {0x000bae, 0x000bb9, 1}, {0x000bba, 0x000bbd, -1}, + {0x000bbe, 0x000bbf, 1}, {0x000bc0, 0x000bc0, 0}, + {0x000bc1, 0x000bc2, 1}, {0x000bc3, 0x000bc5, -1}, + {0x000bc6, 0x000bc8, 1}, {0x000bc9, 0x000bc9, -1}, + {0x000bca, 0x000bcc, 1}, {0x000bcd, 0x000bcd, 0}, + {0x000bce, 0x000bcf, -1}, {0x000bd0, 0x000bd0, 1}, + {0x000bd1, 0x000bd6, -1}, {0x000bd7, 0x000bd7, 1}, + {0x000bd8, 0x000be5, -1}, {0x000be6, 0x000bfa, 1}, + {0x000bfb, 0x000bff, -1}, {0x000c00, 0x000c00, 0}, + {0x000c01, 0x000c03, 1}, {0x000c04, 0x000c04, 0}, + {0x000c05, 0x000c0c, 1}, {0x000c0d, 0x000c0d, -1}, + {0x000c0e, 0x000c10, 1}, {0x000c11, 0x000c11, -1}, + {0x000c12, 0x000c28, 1}, {0x000c29, 0x000c29, -1}, + {0x000c2a, 0x000c39, 1}, {0x000c3a, 0x000c3b, -1}, + {0x000c3c, 0x000c3c, 0}, {0x000c3d, 0x000c3d, 1}, + {0x000c3e, 0x000c40, 0}, {0x000c41, 0x000c44, 1}, + {0x000c45, 0x000c45, -1}, {0x000c46, 0x000c48, 0}, + {0x000c49, 0x000c49, -1}, {0x000c4a, 0x000c4d, 0}, + {0x000c4e, 0x000c54, -1}, {0x000c55, 0x000c56, 0}, + {0x000c57, 0x000c57, -1}, {0x000c58, 0x000c5a, 1}, + {0x000c5b, 0x000c5c, -1}, {0x000c5d, 0x000c5d, 1}, + {0x000c5e, 0x000c5f, -1}, {0x000c60, 0x000c61, 1}, + {0x000c62, 0x000c63, 0}, {0x000c64, 0x000c65, -1}, + {0x000c66, 0x000c6f, 1}, {0x000c70, 0x000c76, -1}, + {0x000c77, 0x000c80, 1}, {0x000c81, 0x000c81, 0}, + {0x000c82, 0x000c8c, 1}, {0x000c8d, 0x000c8d, -1}, + {0x000c8e, 0x000c90, 1}, {0x000c91, 0x000c91, -1}, + {0x000c92, 0x000ca8, 1}, {0x000ca9, 0x000ca9, -1}, + {0x000caa, 0x000cb3, 1}, {0x000cb4, 0x000cb4, -1}, + {0x000cb5, 0x000cb9, 1}, {0x000cba, 0x000cbb, -1}, + {0x000cbc, 0x000cbc, 0}, {0x000cbd, 0x000cbe, 1}, + {0x000cbf, 0x000cbf, 0}, {0x000cc0, 0x000cc4, 1}, + {0x000cc5, 0x000cc5, -1}, {0x000cc6, 0x000cc6, 0}, + {0x000cc7, 0x000cc8, 1}, {0x000cc9, 0x000cc9, -1}, + {0x000cca, 0x000ccb, 1}, {0x000ccc, 0x000ccd, 0}, + {0x000cce, 0x000cd4, -1}, {0x000cd5, 0x000cd6, 1}, + {0x000cd7, 0x000cdc, -1}, {0x000cdd, 0x000cde, 1}, + {0x000cdf, 0x000cdf, -1}, {0x000ce0, 0x000ce1, 1}, + {0x000ce2, 0x000ce3, 0}, {0x000ce4, 0x000ce5, -1}, + {0x000ce6, 0x000cef, 1}, {0x000cf0, 0x000cf0, -1}, + {0x000cf1, 0x000cf3, 1}, {0x000cf4, 0x000cff, -1}, + {0x000d00, 0x000d01, 0}, {0x000d02, 0x000d0c, 1}, + {0x000d0d, 0x000d0d, -1}, {0x000d0e, 0x000d10, 1}, + {0x000d11, 0x000d11, -1}, {0x000d12, 0x000d3a, 1}, + {0x000d3b, 0x000d3c, 0}, {0x000d3d, 0x000d40, 1}, + {0x000d41, 0x000d44, 0}, {0x000d45, 0x000d45, -1}, + {0x000d46, 0x000d48, 1}, {0x000d49, 0x000d49, -1}, + {0x000d4a, 0x000d4c, 1}, {0x000d4d, 0x000d4d, 0}, + {0x000d4e, 0x000d4f, 1}, {0x000d50, 0x000d53, -1}, + {0x000d54, 0x000d61, 1}, {0x000d62, 0x000d63, 0}, + {0x000d64, 0x000d65, -1}, {0x000d66, 0x000d7f, 1}, + {0x000d80, 0x000d80, -1}, {0x000d81, 0x000d81, 0}, + {0x000d82, 0x000d83, 1}, {0x000d84, 0x000d84, -1}, + {0x000d85, 0x000d96, 1}, {0x000d97, 0x000d99, -1}, + {0x000d9a, 0x000db1, 1}, {0x000db2, 0x000db2, -1}, + {0x000db3, 0x000dbb, 1}, {0x000dbc, 0x000dbc, -1}, + {0x000dbd, 0x000dbd, 1}, {0x000dbe, 0x000dbf, -1}, + {0x000dc0, 0x000dc6, 1}, {0x000dc7, 0x000dc9, -1}, + {0x000dca, 0x000dca, 0}, {0x000dcb, 0x000dce, -1}, + {0x000dcf, 0x000dd1, 1}, {0x000dd2, 0x000dd4, 0}, + {0x000dd5, 0x000dd5, -1}, {0x000dd6, 0x000dd6, 0}, + {0x000dd7, 0x000dd7, -1}, {0x000dd8, 0x000ddf, 1}, + {0x000de0, 0x000de5, -1}, {0x000de6, 0x000def, 1}, + {0x000df0, 0x000df1, -1}, {0x000df2, 0x000df4, 1}, + {0x000df5, 0x000e00, -1}, {0x000e01, 0x000e30, 1}, + {0x000e31, 0x000e31, 0}, {0x000e32, 0x000e33, 1}, + {0x000e34, 0x000e3a, 0}, {0x000e3b, 0x000e3e, -1}, + {0x000e3f, 0x000e46, 1}, {0x000e47, 0x000e4e, 0}, + {0x000e4f, 0x000e5b, 1}, {0x000e5c, 0x000e80, -1}, + {0x000e81, 0x000e82, 1}, {0x000e83, 0x000e83, -1}, + {0x000e84, 0x000e84, 1}, {0x000e85, 0x000e85, -1}, + {0x000e86, 0x000e8a, 1}, {0x000e8b, 0x000e8b, -1}, + {0x000e8c, 0x000ea3, 1}, {0x000ea4, 0x000ea4, -1}, + {0x000ea5, 0x000ea5, 1}, {0x000ea6, 0x000ea6, -1}, + {0x000ea7, 0x000eb0, 1}, {0x000eb1, 0x000eb1, 0}, + {0x000eb2, 0x000eb3, 1}, {0x000eb4, 0x000ebc, 0}, + {0x000ebd, 0x000ebd, 1}, {0x000ebe, 0x000ebf, -1}, + {0x000ec0, 0x000ec4, 1}, {0x000ec5, 0x000ec5, -1}, + {0x000ec6, 0x000ec6, 1}, {0x000ec7, 0x000ec7, -1}, + {0x000ec8, 0x000ece, 0}, {0x000ecf, 0x000ecf, -1}, + {0x000ed0, 0x000ed9, 1}, {0x000eda, 0x000edb, -1}, + {0x000edc, 0x000edf, 1}, {0x000ee0, 0x000eff, -1}, + {0x000f00, 0x000f17, 1}, {0x000f18, 0x000f19, 0}, + {0x000f1a, 0x000f34, 1}, {0x000f35, 0x000f35, 0}, + {0x000f36, 0x000f36, 1}, {0x000f37, 0x000f37, 0}, + {0x000f38, 0x000f38, 1}, {0x000f39, 0x000f39, 0}, + {0x000f3a, 0x000f47, 1}, {0x000f48, 0x000f48, -1}, + {0x000f49, 0x000f6c, 1}, {0x000f6d, 0x000f70, -1}, + {0x000f71, 0x000f7e, 0}, {0x000f7f, 0x000f7f, 1}, + {0x000f80, 0x000f84, 0}, {0x000f85, 0x000f85, 1}, + {0x000f86, 0x000f87, 0}, {0x000f88, 0x000f8c, 1}, + {0x000f8d, 0x000f97, 0}, {0x000f98, 0x000f98, -1}, + {0x000f99, 0x000fbc, 0}, {0x000fbd, 0x000fbd, -1}, + {0x000fbe, 0x000fc5, 1}, {0x000fc6, 0x000fc6, 0}, + {0x000fc7, 0x000fcc, 1}, {0x000fcd, 0x000fcd, -1}, + {0x000fce, 0x000fda, 1}, {0x000fdb, 0x000fff, -1}, + {0x001000, 0x00102c, 1}, {0x00102d, 0x001030, 0}, + {0x001031, 0x001031, 1}, {0x001032, 0x001037, 0}, + {0x001038, 0x001038, 1}, {0x001039, 0x00103a, 0}, + {0x00103b, 0x00103c, 1}, {0x00103d, 0x00103e, 0}, + {0x00103f, 0x001057, 1}, {0x001058, 0x001059, 0}, + {0x00105a, 0x00105d, 1}, {0x00105e, 0x001060, 0}, + {0x001061, 0x001070, 1}, {0x001071, 0x001074, 0}, + {0x001075, 0x001081, 1}, {0x001082, 0x001082, 0}, + {0x001083, 0x001084, 1}, {0x001085, 0x001086, 0}, + {0x001087, 0x00108c, 1}, {0x00108d, 0x00108d, 0}, + {0x00108e, 0x00109c, 1}, {0x00109d, 0x00109d, 0}, + {0x00109e, 0x0010c5, 1}, {0x0010c6, 0x0010c6, -1}, + {0x0010c7, 0x0010c7, 1}, {0x0010c8, 0x0010cc, -1}, + {0x0010cd, 0x0010cd, 1}, {0x0010ce, 0x0010cf, -1}, + {0x0010d0, 0x0010ff, 1}, {0x001100, 0x00115f, 2}, + {0x001160, 0x0011ff, 0}, {0x001200, 0x001248, 1}, + {0x001249, 0x001249, -1}, {0x00124a, 0x00124d, 1}, + {0x00124e, 0x00124f, -1}, {0x001250, 0x001256, 1}, + {0x001257, 0x001257, -1}, {0x001258, 0x001258, 1}, + {0x001259, 0x001259, -1}, {0x00125a, 0x00125d, 1}, + {0x00125e, 0x00125f, -1}, {0x001260, 0x001288, 1}, + {0x001289, 0x001289, -1}, {0x00128a, 0x00128d, 1}, + {0x00128e, 0x00128f, -1}, {0x001290, 0x0012b0, 1}, + {0x0012b1, 0x0012b1, -1}, {0x0012b2, 0x0012b5, 1}, + {0x0012b6, 0x0012b7, -1}, {0x0012b8, 0x0012be, 1}, + {0x0012bf, 0x0012bf, -1}, {0x0012c0, 0x0012c0, 1}, + {0x0012c1, 0x0012c1, -1}, {0x0012c2, 0x0012c5, 1}, + {0x0012c6, 0x0012c7, -1}, {0x0012c8, 0x0012d6, 1}, + {0x0012d7, 0x0012d7, -1}, {0x0012d8, 0x001310, 1}, + {0x001311, 0x001311, -1}, {0x001312, 0x001315, 1}, + {0x001316, 0x001317, -1}, {0x001318, 0x00135a, 1}, + {0x00135b, 0x00135c, -1}, {0x00135d, 0x00135f, 0}, + {0x001360, 0x00137c, 1}, {0x00137d, 0x00137f, -1}, + {0x001380, 0x001399, 1}, {0x00139a, 0x00139f, -1}, + {0x0013a0, 0x0013f5, 1}, {0x0013f6, 0x0013f7, -1}, + {0x0013f8, 0x0013fd, 1}, {0x0013fe, 0x0013ff, -1}, + {0x001400, 0x00169c, 1}, {0x00169d, 0x00169f, -1}, + {0x0016a0, 0x0016f8, 1}, {0x0016f9, 0x0016ff, -1}, + {0x001700, 0x001711, 1}, {0x001712, 0x001714, 0}, + {0x001715, 0x001715, 1}, {0x001716, 0x00171e, -1}, + {0x00171f, 0x001731, 1}, {0x001732, 0x001733, 0}, + {0x001734, 0x001736, 1}, {0x001737, 0x00173f, -1}, + {0x001740, 0x001751, 1}, {0x001752, 0x001753, 0}, + {0x001754, 0x00175f, -1}, {0x001760, 0x00176c, 1}, + {0x00176d, 0x00176d, -1}, {0x00176e, 0x001770, 1}, + {0x001771, 0x001771, -1}, {0x001772, 0x001773, 0}, + {0x001774, 0x00177f, -1}, {0x001780, 0x0017b3, 1}, + {0x0017b4, 0x0017b5, 0}, {0x0017b6, 0x0017b6, 1}, + {0x0017b7, 0x0017bd, 0}, {0x0017be, 0x0017c5, 1}, + {0x0017c6, 0x0017c6, 0}, {0x0017c7, 0x0017c8, 1}, + {0x0017c9, 0x0017d3, 0}, {0x0017d4, 0x0017dc, 1}, + {0x0017dd, 0x0017dd, 0}, {0x0017de, 0x0017df, -1}, + {0x0017e0, 0x0017e9, 1}, {0x0017ea, 0x0017ef, -1}, + {0x0017f0, 0x0017f9, 1}, {0x0017fa, 0x0017ff, -1}, + {0x001800, 0x00180a, 1}, {0x00180b, 0x00180f, 0}, + {0x001810, 0x001819, 1}, {0x00181a, 0x00181f, -1}, + {0x001820, 0x001878, 1}, {0x001879, 0x00187f, -1}, + {0x001880, 0x001884, 1}, {0x001885, 0x001886, 0}, + {0x001887, 0x0018a8, 1}, {0x0018a9, 0x0018a9, 0}, + {0x0018aa, 0x0018aa, 1}, {0x0018ab, 0x0018af, -1}, + {0x0018b0, 0x0018f5, 1}, {0x0018f6, 0x0018ff, -1}, + {0x001900, 0x00191e, 1}, {0x00191f, 0x00191f, -1}, + {0x001920, 0x001922, 0}, {0x001923, 0x001926, 1}, + {0x001927, 0x001928, 0}, {0x001929, 0x00192b, 1}, + {0x00192c, 0x00192f, -1}, {0x001930, 0x001931, 1}, + {0x001932, 0x001932, 0}, {0x001933, 0x001938, 1}, + {0x001939, 0x00193b, 0}, {0x00193c, 0x00193f, -1}, + {0x001940, 0x001940, 1}, {0x001941, 0x001943, -1}, + {0x001944, 0x00196d, 1}, {0x00196e, 0x00196f, -1}, + {0x001970, 0x001974, 1}, {0x001975, 0x00197f, -1}, + {0x001980, 0x0019ab, 1}, {0x0019ac, 0x0019af, -1}, + {0x0019b0, 0x0019c9, 1}, {0x0019ca, 0x0019cf, -1}, + {0x0019d0, 0x0019da, 1}, {0x0019db, 0x0019dd, -1}, + {0x0019de, 0x001a16, 1}, {0x001a17, 0x001a18, 0}, + {0x001a19, 0x001a1a, 1}, {0x001a1b, 0x001a1b, 0}, + {0x001a1c, 0x001a1d, -1}, {0x001a1e, 0x001a55, 1}, + {0x001a56, 0x001a56, 0}, {0x001a57, 0x001a57, 1}, + {0x001a58, 0x001a5e, 0}, {0x001a5f, 0x001a5f, -1}, + {0x001a60, 0x001a60, 0}, {0x001a61, 0x001a61, 1}, + {0x001a62, 0x001a62, 0}, {0x001a63, 0x001a64, 1}, + {0x001a65, 0x001a6c, 0}, {0x001a6d, 0x001a72, 1}, + {0x001a73, 0x001a7c, 0}, {0x001a7d, 0x001a7e, -1}, + {0x001a7f, 0x001a7f, 0}, {0x001a80, 0x001a89, 1}, + {0x001a8a, 0x001a8f, -1}, {0x001a90, 0x001a99, 1}, + {0x001a9a, 0x001a9f, -1}, {0x001aa0, 0x001aad, 1}, + {0x001aae, 0x001aaf, -1}, {0x001ab0, 0x001ace, 0}, + {0x001acf, 0x001aff, -1}, {0x001b00, 0x001b03, 0}, + {0x001b04, 0x001b33, 1}, {0x001b34, 0x001b34, 0}, + {0x001b35, 0x001b35, 1}, {0x001b36, 0x001b3a, 0}, + {0x001b3b, 0x001b3b, 1}, {0x001b3c, 0x001b3c, 0}, + {0x001b3d, 0x001b41, 1}, {0x001b42, 0x001b42, 0}, + {0x001b43, 0x001b4c, 1}, {0x001b4d, 0x001b4d, -1}, + {0x001b4e, 0x001b6a, 1}, {0x001b6b, 0x001b73, 0}, + {0x001b74, 0x001b7f, 1}, {0x001b80, 0x001b81, 0}, + {0x001b82, 0x001ba1, 1}, {0x001ba2, 0x001ba5, 0}, + {0x001ba6, 0x001ba7, 1}, {0x001ba8, 0x001ba9, 0}, + {0x001baa, 0x001baa, 1}, {0x001bab, 0x001bad, 0}, + {0x001bae, 0x001be5, 1}, {0x001be6, 0x001be6, 0}, + {0x001be7, 0x001be7, 1}, {0x001be8, 0x001be9, 0}, + {0x001bea, 0x001bec, 1}, {0x001bed, 0x001bed, 0}, + {0x001bee, 0x001bee, 1}, {0x001bef, 0x001bf1, 0}, + {0x001bf2, 0x001bf3, 1}, {0x001bf4, 0x001bfb, -1}, + {0x001bfc, 0x001c2b, 1}, {0x001c2c, 0x001c33, 0}, + {0x001c34, 0x001c35, 1}, {0x001c36, 0x001c37, 0}, + {0x001c38, 0x001c3a, -1}, {0x001c3b, 0x001c49, 1}, + {0x001c4a, 0x001c4c, -1}, {0x001c4d, 0x001c8a, 1}, + {0x001c8b, 0x001c8f, -1}, {0x001c90, 0x001cba, 1}, + {0x001cbb, 0x001cbc, -1}, {0x001cbd, 0x001cc7, 1}, + {0x001cc8, 0x001ccf, -1}, {0x001cd0, 0x001cd2, 0}, + {0x001cd3, 0x001cd3, 1}, {0x001cd4, 0x001ce0, 0}, + {0x001ce1, 0x001ce1, 1}, {0x001ce2, 0x001ce8, 0}, + {0x001ce9, 0x001cec, 1}, {0x001ced, 0x001ced, 0}, + {0x001cee, 0x001cf3, 1}, {0x001cf4, 0x001cf4, 0}, + {0x001cf5, 0x001cf7, 1}, {0x001cf8, 0x001cf9, 0}, + {0x001cfa, 0x001cfa, 1}, {0x001cfb, 0x001cff, -1}, + {0x001d00, 0x001dbf, 1}, {0x001dc0, 0x001dff, 0}, + {0x001e00, 0x001f15, 1}, {0x001f16, 0x001f17, -1}, + {0x001f18, 0x001f1d, 1}, {0x001f1e, 0x001f1f, -1}, + {0x001f20, 0x001f45, 1}, {0x001f46, 0x001f47, -1}, + {0x001f48, 0x001f4d, 1}, {0x001f4e, 0x001f4f, -1}, + {0x001f50, 0x001f57, 1}, {0x001f58, 0x001f58, -1}, + {0x001f59, 0x001f59, 1}, {0x001f5a, 0x001f5a, -1}, + {0x001f5b, 0x001f5b, 1}, {0x001f5c, 0x001f5c, -1}, + {0x001f5d, 0x001f5d, 1}, {0x001f5e, 0x001f5e, -1}, + {0x001f5f, 0x001f7d, 1}, {0x001f7e, 0x001f7f, -1}, + {0x001f80, 0x001fb4, 1}, {0x001fb5, 0x001fb5, -1}, + {0x001fb6, 0x001fc4, 1}, {0x001fc5, 0x001fc5, -1}, + {0x001fc6, 0x001fd3, 1}, {0x001fd4, 0x001fd5, -1}, + {0x001fd6, 0x001fdb, 1}, {0x001fdc, 0x001fdc, -1}, + {0x001fdd, 0x001fef, 1}, {0x001ff0, 0x001ff1, -1}, + {0x001ff2, 0x001ff4, 1}, {0x001ff5, 0x001ff5, -1}, + {0x001ff6, 0x001ffe, 1}, {0x001fff, 0x001fff, -1}, + {0x002000, 0x00200a, 1}, {0x00200b, 0x00200f, 0}, + {0x002010, 0x002027, 1}, {0x002028, 0x002029, -1}, + {0x00202a, 0x00202e, 0}, {0x00202f, 0x00205f, 1}, + {0x002060, 0x002064, 0}, {0x002065, 0x002065, -1}, + {0x002066, 0x00206f, 0}, {0x002070, 0x002071, 1}, + {0x002072, 0x002073, -1}, {0x002074, 0x00208e, 1}, + {0x00208f, 0x00208f, -1}, {0x002090, 0x00209c, 1}, + {0x00209d, 0x00209f, -1}, {0x0020a0, 0x0020c0, 1}, + {0x0020c1, 0x0020cf, -1}, {0x0020d0, 0x0020f0, 0}, + {0x0020f1, 0x0020ff, -1}, {0x002100, 0x00218b, 1}, + {0x00218c, 0x00218f, -1}, {0x002190, 0x002319, 1}, + {0x00231a, 0x00231b, 2}, {0x00231c, 0x002328, 1}, + {0x002329, 0x00232a, 2}, {0x00232b, 0x0023e8, 1}, + {0x0023e9, 0x0023ec, 2}, {0x0023ed, 0x0023ef, 1}, + {0x0023f0, 0x0023f0, 2}, {0x0023f1, 0x0023f2, 1}, + {0x0023f3, 0x0023f3, 2}, {0x0023f4, 0x002429, 1}, + {0x00242a, 0x00243f, -1}, {0x002440, 0x00244a, 1}, + {0x00244b, 0x00245f, -1}, {0x002460, 0x0025fc, 1}, + {0x0025fd, 0x0025fe, 2}, {0x0025ff, 0x002613, 1}, + {0x002614, 0x002615, 2}, {0x002616, 0x00262f, 1}, + {0x002630, 0x002637, 2}, {0x002638, 0x002647, 1}, + {0x002648, 0x002653, 2}, {0x002654, 0x00267e, 1}, + {0x00267f, 0x00267f, 2}, {0x002680, 0x002689, 1}, + {0x00268a, 0x00268f, 2}, {0x002690, 0x002692, 1}, + {0x002693, 0x002693, 2}, {0x002694, 0x0026a0, 1}, + {0x0026a1, 0x0026a1, 2}, {0x0026a2, 0x0026a9, 1}, + {0x0026aa, 0x0026ab, 2}, {0x0026ac, 0x0026bc, 1}, + {0x0026bd, 0x0026be, 2}, {0x0026bf, 0x0026c3, 1}, + {0x0026c4, 0x0026c5, 2}, {0x0026c6, 0x0026cd, 1}, + {0x0026ce, 0x0026ce, 2}, {0x0026cf, 0x0026d3, 1}, + {0x0026d4, 0x0026d4, 2}, {0x0026d5, 0x0026e9, 1}, + {0x0026ea, 0x0026ea, 2}, {0x0026eb, 0x0026f1, 1}, + {0x0026f2, 0x0026f3, 2}, {0x0026f4, 0x0026f4, 1}, + {0x0026f5, 0x0026f5, 2}, {0x0026f6, 0x0026f9, 1}, + {0x0026fa, 0x0026fa, 2}, {0x0026fb, 0x0026fc, 1}, + {0x0026fd, 0x0026fd, 2}, {0x0026fe, 0x002704, 1}, + {0x002705, 0x002705, 2}, {0x002706, 0x002709, 1}, + {0x00270a, 0x00270b, 2}, {0x00270c, 0x002727, 1}, + {0x002728, 0x002728, 2}, {0x002729, 0x00274b, 1}, + {0x00274c, 0x00274c, 2}, {0x00274d, 0x00274d, 1}, + {0x00274e, 0x00274e, 2}, {0x00274f, 0x002752, 1}, + {0x002753, 0x002755, 2}, {0x002756, 0x002756, 1}, + {0x002757, 0x002757, 2}, {0x002758, 0x002794, 1}, + {0x002795, 0x002797, 2}, {0x002798, 0x0027af, 1}, + {0x0027b0, 0x0027b0, 2}, {0x0027b1, 0x0027be, 1}, + {0x0027bf, 0x0027bf, 2}, {0x0027c0, 0x002b1a, 1}, + {0x002b1b, 0x002b1c, 2}, {0x002b1d, 0x002b4f, 1}, + {0x002b50, 0x002b50, 2}, {0x002b51, 0x002b54, 1}, + {0x002b55, 0x002b55, 2}, {0x002b56, 0x002b73, 1}, + {0x002b74, 0x002b75, -1}, {0x002b76, 0x002b95, 1}, + {0x002b96, 0x002b96, -1}, {0x002b97, 0x002cee, 1}, + {0x002cef, 0x002cf1, 0}, {0x002cf2, 0x002cf3, 1}, + {0x002cf4, 0x002cf8, -1}, {0x002cf9, 0x002d25, 1}, + {0x002d26, 0x002d26, -1}, {0x002d27, 0x002d27, 1}, + {0x002d28, 0x002d2c, -1}, {0x002d2d, 0x002d2d, 1}, + {0x002d2e, 0x002d2f, -1}, {0x002d30, 0x002d67, 1}, + {0x002d68, 0x002d6e, -1}, {0x002d6f, 0x002d70, 1}, + {0x002d71, 0x002d7e, -1}, {0x002d7f, 0x002d7f, 0}, + {0x002d80, 0x002d96, 1}, {0x002d97, 0x002d9f, -1}, + {0x002da0, 0x002da6, 1}, {0x002da7, 0x002da7, -1}, + {0x002da8, 0x002dae, 1}, {0x002daf, 0x002daf, -1}, + {0x002db0, 0x002db6, 1}, {0x002db7, 0x002db7, -1}, + {0x002db8, 0x002dbe, 1}, {0x002dbf, 0x002dbf, -1}, + {0x002dc0, 0x002dc6, 1}, {0x002dc7, 0x002dc7, -1}, + {0x002dc8, 0x002dce, 1}, {0x002dcf, 0x002dcf, -1}, + {0x002dd0, 0x002dd6, 1}, {0x002dd7, 0x002dd7, -1}, + {0x002dd8, 0x002dde, 1}, {0x002ddf, 0x002ddf, -1}, + {0x002de0, 0x002dff, 0}, {0x002e00, 0x002e5d, 1}, + {0x002e5e, 0x002e7f, -1}, {0x002e80, 0x002e99, 2}, + {0x002e9a, 0x002e9a, -1}, {0x002e9b, 0x002ef3, 2}, + {0x002ef4, 0x002eff, -1}, {0x002f00, 0x002fd5, 2}, + {0x002fd6, 0x002fef, -1}, {0x002ff0, 0x003029, 2}, + {0x00302a, 0x00302d, 0}, {0x00302e, 0x00303e, 2}, + {0x00303f, 0x00303f, 1}, {0x003040, 0x003040, -1}, + {0x003041, 0x003096, 2}, {0x003097, 0x003098, -1}, + {0x003099, 0x00309a, 0}, {0x00309b, 0x0030ff, 2}, + {0x003100, 0x003104, -1}, {0x003105, 0x00312f, 2}, + {0x003130, 0x003130, -1}, {0x003131, 0x003163, 2}, + {0x003164, 0x003164, 0}, {0x003165, 0x00318e, 2}, + {0x00318f, 0x00318f, -1}, {0x003190, 0x0031e5, 2}, + {0x0031e6, 0x0031ee, -1}, {0x0031ef, 0x00321e, 2}, + {0x00321f, 0x00321f, -1}, {0x003220, 0x00a48c, 2}, + {0x00a48d, 0x00a48f, -1}, {0x00a490, 0x00a4c6, 2}, + {0x00a4c7, 0x00a4cf, -1}, {0x00a4d0, 0x00a62b, 1}, + {0x00a62c, 0x00a63f, -1}, {0x00a640, 0x00a66e, 1}, + {0x00a66f, 0x00a672, 0}, {0x00a673, 0x00a673, 1}, + {0x00a674, 0x00a67d, 0}, {0x00a67e, 0x00a69d, 1}, + {0x00a69e, 0x00a69f, 0}, {0x00a6a0, 0x00a6ef, 1}, + {0x00a6f0, 0x00a6f1, 0}, {0x00a6f2, 0x00a6f7, 1}, + {0x00a6f8, 0x00a6ff, -1}, {0x00a700, 0x00a7cd, 1}, + {0x00a7ce, 0x00a7cf, -1}, {0x00a7d0, 0x00a7d1, 1}, + {0x00a7d2, 0x00a7d2, -1}, {0x00a7d3, 0x00a7d3, 1}, + {0x00a7d4, 0x00a7d4, -1}, {0x00a7d5, 0x00a7dc, 1}, + {0x00a7dd, 0x00a7f1, -1}, {0x00a7f2, 0x00a801, 1}, + {0x00a802, 0x00a802, 0}, {0x00a803, 0x00a805, 1}, + {0x00a806, 0x00a806, 0}, {0x00a807, 0x00a80a, 1}, + {0x00a80b, 0x00a80b, 0}, {0x00a80c, 0x00a824, 1}, + {0x00a825, 0x00a826, 0}, {0x00a827, 0x00a82b, 1}, + {0x00a82c, 0x00a82c, 0}, {0x00a82d, 0x00a82f, -1}, + {0x00a830, 0x00a839, 1}, {0x00a83a, 0x00a83f, -1}, + {0x00a840, 0x00a877, 1}, {0x00a878, 0x00a87f, -1}, + {0x00a880, 0x00a8c3, 1}, {0x00a8c4, 0x00a8c5, 0}, + {0x00a8c6, 0x00a8cd, -1}, {0x00a8ce, 0x00a8d9, 1}, + {0x00a8da, 0x00a8df, -1}, {0x00a8e0, 0x00a8f1, 0}, + {0x00a8f2, 0x00a8fe, 1}, {0x00a8ff, 0x00a8ff, 0}, + {0x00a900, 0x00a925, 1}, {0x00a926, 0x00a92d, 0}, + {0x00a92e, 0x00a946, 1}, {0x00a947, 0x00a951, 0}, + {0x00a952, 0x00a953, 1}, {0x00a954, 0x00a95e, -1}, + {0x00a95f, 0x00a95f, 1}, {0x00a960, 0x00a97c, 2}, + {0x00a97d, 0x00a97f, -1}, {0x00a980, 0x00a982, 0}, + {0x00a983, 0x00a9b2, 1}, {0x00a9b3, 0x00a9b3, 0}, + {0x00a9b4, 0x00a9b5, 1}, {0x00a9b6, 0x00a9b9, 0}, + {0x00a9ba, 0x00a9bb, 1}, {0x00a9bc, 0x00a9bd, 0}, + {0x00a9be, 0x00a9cd, 1}, {0x00a9ce, 0x00a9ce, -1}, + {0x00a9cf, 0x00a9d9, 1}, {0x00a9da, 0x00a9dd, -1}, + {0x00a9de, 0x00a9e4, 1}, {0x00a9e5, 0x00a9e5, 0}, + {0x00a9e6, 0x00a9fe, 1}, {0x00a9ff, 0x00a9ff, -1}, + {0x00aa00, 0x00aa28, 1}, {0x00aa29, 0x00aa2e, 0}, + {0x00aa2f, 0x00aa30, 1}, {0x00aa31, 0x00aa32, 0}, + {0x00aa33, 0x00aa34, 1}, {0x00aa35, 0x00aa36, 0}, + {0x00aa37, 0x00aa3f, -1}, {0x00aa40, 0x00aa42, 1}, + {0x00aa43, 0x00aa43, 0}, {0x00aa44, 0x00aa4b, 1}, + {0x00aa4c, 0x00aa4c, 0}, {0x00aa4d, 0x00aa4d, 1}, + {0x00aa4e, 0x00aa4f, -1}, {0x00aa50, 0x00aa59, 1}, + {0x00aa5a, 0x00aa5b, -1}, {0x00aa5c, 0x00aa7b, 1}, + {0x00aa7c, 0x00aa7c, 0}, {0x00aa7d, 0x00aaaf, 1}, + {0x00aab0, 0x00aab0, 0}, {0x00aab1, 0x00aab1, 1}, + {0x00aab2, 0x00aab4, 0}, {0x00aab5, 0x00aab6, 1}, + {0x00aab7, 0x00aab8, 0}, {0x00aab9, 0x00aabd, 1}, + {0x00aabe, 0x00aabf, 0}, {0x00aac0, 0x00aac0, 1}, + {0x00aac1, 0x00aac1, 0}, {0x00aac2, 0x00aac2, 1}, + {0x00aac3, 0x00aada, -1}, {0x00aadb, 0x00aaeb, 1}, + {0x00aaec, 0x00aaed, 0}, {0x00aaee, 0x00aaf5, 1}, + {0x00aaf6, 0x00aaf6, 0}, {0x00aaf7, 0x00ab00, -1}, + {0x00ab01, 0x00ab06, 1}, {0x00ab07, 0x00ab08, -1}, + {0x00ab09, 0x00ab0e, 1}, {0x00ab0f, 0x00ab10, -1}, + {0x00ab11, 0x00ab16, 1}, {0x00ab17, 0x00ab1f, -1}, + {0x00ab20, 0x00ab26, 1}, {0x00ab27, 0x00ab27, -1}, + {0x00ab28, 0x00ab2e, 1}, {0x00ab2f, 0x00ab2f, -1}, + {0x00ab30, 0x00ab6b, 1}, {0x00ab6c, 0x00ab6f, -1}, + {0x00ab70, 0x00abe4, 1}, {0x00abe5, 0x00abe5, 0}, + {0x00abe6, 0x00abe7, 1}, {0x00abe8, 0x00abe8, 0}, + {0x00abe9, 0x00abec, 1}, {0x00abed, 0x00abed, 0}, + {0x00abee, 0x00abef, -1}, {0x00abf0, 0x00abf9, 1}, + {0x00abfa, 0x00abff, -1}, {0x00ac00, 0x00d7a3, 2}, + {0x00d7a4, 0x00d7af, -1}, {0x00d7b0, 0x00d7c6, 0}, + {0x00d7c7, 0x00d7ca, -1}, {0x00d7cb, 0x00d7fb, 0}, + {0x00d7fc, 0x00dfff, -1}, {0x00e000, 0x00f8ff, 1}, + {0x00f900, 0x00fa6d, 2}, {0x00fa6e, 0x00fa6f, -1}, + {0x00fa70, 0x00fad9, 2}, {0x00fada, 0x00faff, -1}, + {0x00fb00, 0x00fb06, 1}, {0x00fb07, 0x00fb12, -1}, + {0x00fb13, 0x00fb17, 1}, {0x00fb18, 0x00fb1c, -1}, + {0x00fb1d, 0x00fb1d, 1}, {0x00fb1e, 0x00fb1e, 0}, + {0x00fb1f, 0x00fb36, 1}, {0x00fb37, 0x00fb37, -1}, + {0x00fb38, 0x00fb3c, 1}, {0x00fb3d, 0x00fb3d, -1}, + {0x00fb3e, 0x00fb3e, 1}, {0x00fb3f, 0x00fb3f, -1}, + {0x00fb40, 0x00fb41, 1}, {0x00fb42, 0x00fb42, -1}, + {0x00fb43, 0x00fb44, 1}, {0x00fb45, 0x00fb45, -1}, + {0x00fb46, 0x00fbc2, 1}, {0x00fbc3, 0x00fbd2, -1}, + {0x00fbd3, 0x00fd8f, 1}, {0x00fd90, 0x00fd91, -1}, + {0x00fd92, 0x00fdc7, 1}, {0x00fdc8, 0x00fdce, -1}, + {0x00fdcf, 0x00fdcf, 1}, {0x00fdd0, 0x00fdef, -1}, + {0x00fdf0, 0x00fdff, 1}, {0x00fe00, 0x00fe0f, 0}, + {0x00fe10, 0x00fe19, 2}, {0x00fe1a, 0x00fe1f, -1}, + {0x00fe20, 0x00fe2f, 0}, {0x00fe30, 0x00fe52, 2}, + {0x00fe53, 0x00fe53, -1}, {0x00fe54, 0x00fe66, 2}, + {0x00fe67, 0x00fe67, -1}, {0x00fe68, 0x00fe6b, 2}, + {0x00fe6c, 0x00fe6f, -1}, {0x00fe70, 0x00fe74, 1}, + {0x00fe75, 0x00fe75, -1}, {0x00fe76, 0x00fefc, 1}, + {0x00fefd, 0x00fefe, -1}, {0x00feff, 0x00feff, 0}, + {0x00ff00, 0x00ff00, -1}, {0x00ff01, 0x00ff60, 2}, + {0x00ff61, 0x00ff9f, 1}, {0x00ffa0, 0x00ffa0, 0}, + {0x00ffa1, 0x00ffbe, 1}, {0x00ffbf, 0x00ffc1, -1}, + {0x00ffc2, 0x00ffc7, 1}, {0x00ffc8, 0x00ffc9, -1}, + {0x00ffca, 0x00ffcf, 1}, {0x00ffd0, 0x00ffd1, -1}, + {0x00ffd2, 0x00ffd7, 1}, {0x00ffd8, 0x00ffd9, -1}, + {0x00ffda, 0x00ffdc, 1}, {0x00ffdd, 0x00ffdf, -1}, + {0x00ffe0, 0x00ffe6, 2}, {0x00ffe7, 0x00ffe7, -1}, + {0x00ffe8, 0x00ffee, 1}, {0x00ffef, 0x00fff8, -1}, + {0x00fff9, 0x00fffd, 1}, {0x00fffe, 0x00ffff, -1}, + {0x010000, 0x01000b, 1}, {0x01000c, 0x01000c, -1}, + {0x01000d, 0x010026, 1}, {0x010027, 0x010027, -1}, + {0x010028, 0x01003a, 1}, {0x01003b, 0x01003b, -1}, + {0x01003c, 0x01003d, 1}, {0x01003e, 0x01003e, -1}, + {0x01003f, 0x01004d, 1}, {0x01004e, 0x01004f, -1}, + {0x010050, 0x01005d, 1}, {0x01005e, 0x01007f, -1}, + {0x010080, 0x0100fa, 1}, {0x0100fb, 0x0100ff, -1}, + {0x010100, 0x010102, 1}, {0x010103, 0x010106, -1}, + {0x010107, 0x010133, 1}, {0x010134, 0x010136, -1}, + {0x010137, 0x01018e, 1}, {0x01018f, 0x01018f, -1}, + {0x010190, 0x01019c, 1}, {0x01019d, 0x01019f, -1}, + {0x0101a0, 0x0101a0, 1}, {0x0101a1, 0x0101cf, -1}, + {0x0101d0, 0x0101fc, 1}, {0x0101fd, 0x0101fd, 0}, + {0x0101fe, 0x01027f, -1}, {0x010280, 0x01029c, 1}, + {0x01029d, 0x01029f, -1}, {0x0102a0, 0x0102d0, 1}, + {0x0102d1, 0x0102df, -1}, {0x0102e0, 0x0102e0, 0}, + {0x0102e1, 0x0102fb, 1}, {0x0102fc, 0x0102ff, -1}, + {0x010300, 0x010323, 1}, {0x010324, 0x01032c, -1}, + {0x01032d, 0x01034a, 1}, {0x01034b, 0x01034f, -1}, + {0x010350, 0x010375, 1}, {0x010376, 0x01037a, 0}, + {0x01037b, 0x01037f, -1}, {0x010380, 0x01039d, 1}, + {0x01039e, 0x01039e, -1}, {0x01039f, 0x0103c3, 1}, + {0x0103c4, 0x0103c7, -1}, {0x0103c8, 0x0103d5, 1}, + {0x0103d6, 0x0103ff, -1}, {0x010400, 0x01049d, 1}, + {0x01049e, 0x01049f, -1}, {0x0104a0, 0x0104a9, 1}, + {0x0104aa, 0x0104af, -1}, {0x0104b0, 0x0104d3, 1}, + {0x0104d4, 0x0104d7, -1}, {0x0104d8, 0x0104fb, 1}, + {0x0104fc, 0x0104ff, -1}, {0x010500, 0x010527, 1}, + {0x010528, 0x01052f, -1}, {0x010530, 0x010563, 1}, + {0x010564, 0x01056e, -1}, {0x01056f, 0x01057a, 1}, + {0x01057b, 0x01057b, -1}, {0x01057c, 0x01058a, 1}, + {0x01058b, 0x01058b, -1}, {0x01058c, 0x010592, 1}, + {0x010593, 0x010593, -1}, {0x010594, 0x010595, 1}, + {0x010596, 0x010596, -1}, {0x010597, 0x0105a1, 1}, + {0x0105a2, 0x0105a2, -1}, {0x0105a3, 0x0105b1, 1}, + {0x0105b2, 0x0105b2, -1}, {0x0105b3, 0x0105b9, 1}, + {0x0105ba, 0x0105ba, -1}, {0x0105bb, 0x0105bc, 1}, + {0x0105bd, 0x0105bf, -1}, {0x0105c0, 0x0105f3, 1}, + {0x0105f4, 0x0105ff, -1}, {0x010600, 0x010736, 1}, + {0x010737, 0x01073f, -1}, {0x010740, 0x010755, 1}, + {0x010756, 0x01075f, -1}, {0x010760, 0x010767, 1}, + {0x010768, 0x01077f, -1}, {0x010780, 0x010785, 1}, + {0x010786, 0x010786, -1}, {0x010787, 0x0107b0, 1}, + {0x0107b1, 0x0107b1, -1}, {0x0107b2, 0x0107ba, 1}, + {0x0107bb, 0x0107ff, -1}, {0x010800, 0x010805, 1}, + {0x010806, 0x010807, -1}, {0x010808, 0x010808, 1}, + {0x010809, 0x010809, -1}, {0x01080a, 0x010835, 1}, + {0x010836, 0x010836, -1}, {0x010837, 0x010838, 1}, + {0x010839, 0x01083b, -1}, {0x01083c, 0x01083c, 1}, + {0x01083d, 0x01083e, -1}, {0x01083f, 0x010855, 1}, + {0x010856, 0x010856, -1}, {0x010857, 0x01089e, 1}, + {0x01089f, 0x0108a6, -1}, {0x0108a7, 0x0108af, 1}, + {0x0108b0, 0x0108df, -1}, {0x0108e0, 0x0108f2, 1}, + {0x0108f3, 0x0108f3, -1}, {0x0108f4, 0x0108f5, 1}, + {0x0108f6, 0x0108fa, -1}, {0x0108fb, 0x01091b, 1}, + {0x01091c, 0x01091e, -1}, {0x01091f, 0x010939, 1}, + {0x01093a, 0x01093e, -1}, {0x01093f, 0x01093f, 1}, + {0x010940, 0x01097f, -1}, {0x010980, 0x0109b7, 1}, + {0x0109b8, 0x0109bb, -1}, {0x0109bc, 0x0109cf, 1}, + {0x0109d0, 0x0109d1, -1}, {0x0109d2, 0x010a00, 1}, + {0x010a01, 0x010a03, 0}, {0x010a04, 0x010a04, -1}, + {0x010a05, 0x010a06, 0}, {0x010a07, 0x010a0b, -1}, + {0x010a0c, 0x010a0f, 0}, {0x010a10, 0x010a13, 1}, + {0x010a14, 0x010a14, -1}, {0x010a15, 0x010a17, 1}, + {0x010a18, 0x010a18, -1}, {0x010a19, 0x010a35, 1}, + {0x010a36, 0x010a37, -1}, {0x010a38, 0x010a3a, 0}, + {0x010a3b, 0x010a3e, -1}, {0x010a3f, 0x010a3f, 0}, + {0x010a40, 0x010a48, 1}, {0x010a49, 0x010a4f, -1}, + {0x010a50, 0x010a58, 1}, {0x010a59, 0x010a5f, -1}, + {0x010a60, 0x010a9f, 1}, {0x010aa0, 0x010abf, -1}, + {0x010ac0, 0x010ae4, 1}, {0x010ae5, 0x010ae6, 0}, + {0x010ae7, 0x010aea, -1}, {0x010aeb, 0x010af6, 1}, + {0x010af7, 0x010aff, -1}, {0x010b00, 0x010b35, 1}, + {0x010b36, 0x010b38, -1}, {0x010b39, 0x010b55, 1}, + {0x010b56, 0x010b57, -1}, {0x010b58, 0x010b72, 1}, + {0x010b73, 0x010b77, -1}, {0x010b78, 0x010b91, 1}, + {0x010b92, 0x010b98, -1}, {0x010b99, 0x010b9c, 1}, + {0x010b9d, 0x010ba8, -1}, {0x010ba9, 0x010baf, 1}, + {0x010bb0, 0x010bff, -1}, {0x010c00, 0x010c48, 1}, + {0x010c49, 0x010c7f, -1}, {0x010c80, 0x010cb2, 1}, + {0x010cb3, 0x010cbf, -1}, {0x010cc0, 0x010cf2, 1}, + {0x010cf3, 0x010cf9, -1}, {0x010cfa, 0x010d23, 1}, + {0x010d24, 0x010d27, 0}, {0x010d28, 0x010d2f, -1}, + {0x010d30, 0x010d39, 1}, {0x010d3a, 0x010d3f, -1}, + {0x010d40, 0x010d65, 1}, {0x010d66, 0x010d68, -1}, + {0x010d69, 0x010d6d, 0}, {0x010d6e, 0x010d85, 1}, + {0x010d86, 0x010d8d, -1}, {0x010d8e, 0x010d8f, 1}, + {0x010d90, 0x010e5f, -1}, {0x010e60, 0x010e7e, 1}, + {0x010e7f, 0x010e7f, -1}, {0x010e80, 0x010ea9, 1}, + {0x010eaa, 0x010eaa, -1}, {0x010eab, 0x010eac, 0}, + {0x010ead, 0x010ead, 1}, {0x010eae, 0x010eaf, -1}, + {0x010eb0, 0x010eb1, 1}, {0x010eb2, 0x010ec1, -1}, + {0x010ec2, 0x010ec4, 1}, {0x010ec5, 0x010efb, -1}, + {0x010efc, 0x010eff, 0}, {0x010f00, 0x010f27, 1}, + {0x010f28, 0x010f2f, -1}, {0x010f30, 0x010f45, 1}, + {0x010f46, 0x010f50, 0}, {0x010f51, 0x010f59, 1}, + {0x010f5a, 0x010f6f, -1}, {0x010f70, 0x010f81, 1}, + {0x010f82, 0x010f85, 0}, {0x010f86, 0x010f89, 1}, + {0x010f8a, 0x010faf, -1}, {0x010fb0, 0x010fcb, 1}, + {0x010fcc, 0x010fdf, -1}, {0x010fe0, 0x010ff6, 1}, + {0x010ff7, 0x010fff, -1}, {0x011000, 0x011000, 1}, + {0x011001, 0x011001, 0}, {0x011002, 0x011037, 1}, + {0x011038, 0x011046, 0}, {0x011047, 0x01104d, 1}, + {0x01104e, 0x011051, -1}, {0x011052, 0x01106f, 1}, + {0x011070, 0x011070, 0}, {0x011071, 0x011072, 1}, + {0x011073, 0x011074, 0}, {0x011075, 0x011075, 1}, + {0x011076, 0x01107e, -1}, {0x01107f, 0x011081, 0}, + {0x011082, 0x0110b2, 1}, {0x0110b3, 0x0110b6, 0}, + {0x0110b7, 0x0110b8, 1}, {0x0110b9, 0x0110ba, 0}, + {0x0110bb, 0x0110c1, 1}, {0x0110c2, 0x0110c2, 0}, + {0x0110c3, 0x0110cc, -1}, {0x0110cd, 0x0110cd, 1}, + {0x0110ce, 0x0110cf, -1}, {0x0110d0, 0x0110e8, 1}, + {0x0110e9, 0x0110ef, -1}, {0x0110f0, 0x0110f9, 1}, + {0x0110fa, 0x0110ff, -1}, {0x011100, 0x011102, 0}, + {0x011103, 0x011126, 1}, {0x011127, 0x01112b, 0}, + {0x01112c, 0x01112c, 1}, {0x01112d, 0x011134, 0}, + {0x011135, 0x011135, -1}, {0x011136, 0x011147, 1}, + {0x011148, 0x01114f, -1}, {0x011150, 0x011172, 1}, + {0x011173, 0x011173, 0}, {0x011174, 0x011176, 1}, + {0x011177, 0x01117f, -1}, {0x011180, 0x011181, 0}, + {0x011182, 0x0111b5, 1}, {0x0111b6, 0x0111be, 0}, + {0x0111bf, 0x0111c8, 1}, {0x0111c9, 0x0111cc, 0}, + {0x0111cd, 0x0111ce, 1}, {0x0111cf, 0x0111cf, 0}, + {0x0111d0, 0x0111df, 1}, {0x0111e0, 0x0111e0, -1}, + {0x0111e1, 0x0111f4, 1}, {0x0111f5, 0x0111ff, -1}, + {0x011200, 0x011211, 1}, {0x011212, 0x011212, -1}, + {0x011213, 0x01122e, 1}, {0x01122f, 0x011231, 0}, + {0x011232, 0x011233, 1}, {0x011234, 0x011234, 0}, + {0x011235, 0x011235, 1}, {0x011236, 0x011237, 0}, + {0x011238, 0x01123d, 1}, {0x01123e, 0x01123e, 0}, + {0x01123f, 0x011240, 1}, {0x011241, 0x011241, 0}, + {0x011242, 0x01127f, -1}, {0x011280, 0x011286, 1}, + {0x011287, 0x011287, -1}, {0x011288, 0x011288, 1}, + {0x011289, 0x011289, -1}, {0x01128a, 0x01128d, 1}, + {0x01128e, 0x01128e, -1}, {0x01128f, 0x01129d, 1}, + {0x01129e, 0x01129e, -1}, {0x01129f, 0x0112a9, 1}, + {0x0112aa, 0x0112af, -1}, {0x0112b0, 0x0112de, 1}, + {0x0112df, 0x0112df, 0}, {0x0112e0, 0x0112e2, 1}, + {0x0112e3, 0x0112ea, 0}, {0x0112eb, 0x0112ef, -1}, + {0x0112f0, 0x0112f9, 1}, {0x0112fa, 0x0112ff, -1}, + {0x011300, 0x011301, 0}, {0x011302, 0x011303, 1}, + {0x011304, 0x011304, -1}, {0x011305, 0x01130c, 1}, + {0x01130d, 0x01130e, -1}, {0x01130f, 0x011310, 1}, + {0x011311, 0x011312, -1}, {0x011313, 0x011328, 1}, + {0x011329, 0x011329, -1}, {0x01132a, 0x011330, 1}, + {0x011331, 0x011331, -1}, {0x011332, 0x011333, 1}, + {0x011334, 0x011334, -1}, {0x011335, 0x011339, 1}, + {0x01133a, 0x01133a, -1}, {0x01133b, 0x01133c, 0}, + {0x01133d, 0x01133f, 1}, {0x011340, 0x011340, 0}, + {0x011341, 0x011344, 1}, {0x011345, 0x011346, -1}, + {0x011347, 0x011348, 1}, {0x011349, 0x01134a, -1}, + {0x01134b, 0x01134d, 1}, {0x01134e, 0x01134f, -1}, + {0x011350, 0x011350, 1}, {0x011351, 0x011356, -1}, + {0x011357, 0x011357, 1}, {0x011358, 0x01135c, -1}, + {0x01135d, 0x011363, 1}, {0x011364, 0x011365, -1}, + {0x011366, 0x01136c, 0}, {0x01136d, 0x01136f, -1}, + {0x011370, 0x011374, 0}, {0x011375, 0x01137f, -1}, + {0x011380, 0x011389, 1}, {0x01138a, 0x01138a, -1}, + {0x01138b, 0x01138b, 1}, {0x01138c, 0x01138d, -1}, + {0x01138e, 0x01138e, 1}, {0x01138f, 0x01138f, -1}, + {0x011390, 0x0113b5, 1}, {0x0113b6, 0x0113b6, -1}, + {0x0113b7, 0x0113ba, 1}, {0x0113bb, 0x0113c0, 0}, + {0x0113c1, 0x0113c1, -1}, {0x0113c2, 0x0113c2, 1}, + {0x0113c3, 0x0113c4, -1}, {0x0113c5, 0x0113c5, 1}, + {0x0113c6, 0x0113c6, -1}, {0x0113c7, 0x0113ca, 1}, + {0x0113cb, 0x0113cb, -1}, {0x0113cc, 0x0113cd, 1}, + {0x0113ce, 0x0113ce, 0}, {0x0113cf, 0x0113cf, 1}, + {0x0113d0, 0x0113d0, 0}, {0x0113d1, 0x0113d1, 1}, + {0x0113d2, 0x0113d2, 0}, {0x0113d3, 0x0113d5, 1}, + {0x0113d6, 0x0113d6, -1}, {0x0113d7, 0x0113d8, 1}, + {0x0113d9, 0x0113e0, -1}, {0x0113e1, 0x0113e2, 0}, + {0x0113e3, 0x0113ff, -1}, {0x011400, 0x011437, 1}, + {0x011438, 0x01143f, 0}, {0x011440, 0x011441, 1}, + {0x011442, 0x011444, 0}, {0x011445, 0x011445, 1}, + {0x011446, 0x011446, 0}, {0x011447, 0x01145b, 1}, + {0x01145c, 0x01145c, -1}, {0x01145d, 0x01145d, 1}, + {0x01145e, 0x01145e, 0}, {0x01145f, 0x011461, 1}, + {0x011462, 0x01147f, -1}, {0x011480, 0x0114b2, 1}, + {0x0114b3, 0x0114b8, 0}, {0x0114b9, 0x0114b9, 1}, + {0x0114ba, 0x0114ba, 0}, {0x0114bb, 0x0114be, 1}, + {0x0114bf, 0x0114c0, 0}, {0x0114c1, 0x0114c1, 1}, + {0x0114c2, 0x0114c3, 0}, {0x0114c4, 0x0114c7, 1}, + {0x0114c8, 0x0114cf, -1}, {0x0114d0, 0x0114d9, 1}, + {0x0114da, 0x01157f, -1}, {0x011580, 0x0115b1, 1}, + {0x0115b2, 0x0115b5, 0}, {0x0115b6, 0x0115b7, -1}, + {0x0115b8, 0x0115bb, 1}, {0x0115bc, 0x0115bd, 0}, + {0x0115be, 0x0115be, 1}, {0x0115bf, 0x0115c0, 0}, + {0x0115c1, 0x0115db, 1}, {0x0115dc, 0x0115dd, 0}, + {0x0115de, 0x0115ff, -1}, {0x011600, 0x011632, 1}, + {0x011633, 0x01163a, 0}, {0x01163b, 0x01163c, 1}, + {0x01163d, 0x01163d, 0}, {0x01163e, 0x01163e, 1}, + {0x01163f, 0x011640, 0}, {0x011641, 0x011644, 1}, + {0x011645, 0x01164f, -1}, {0x011650, 0x011659, 1}, + {0x01165a, 0x01165f, -1}, {0x011660, 0x01166c, 1}, + {0x01166d, 0x01167f, -1}, {0x011680, 0x0116aa, 1}, + {0x0116ab, 0x0116ab, 0}, {0x0116ac, 0x0116ac, 1}, + {0x0116ad, 0x0116ad, 0}, {0x0116ae, 0x0116af, 1}, + {0x0116b0, 0x0116b5, 0}, {0x0116b6, 0x0116b6, 1}, + {0x0116b7, 0x0116b7, 0}, {0x0116b8, 0x0116b9, 1}, + {0x0116ba, 0x0116bf, -1}, {0x0116c0, 0x0116c9, 1}, + {0x0116ca, 0x0116cf, -1}, {0x0116d0, 0x0116e3, 1}, + {0x0116e4, 0x0116ff, -1}, {0x011700, 0x01171a, 1}, + {0x01171b, 0x01171c, -1}, {0x01171d, 0x01171d, 0}, + {0x01171e, 0x01171e, 1}, {0x01171f, 0x01171f, 0}, + {0x011720, 0x011721, 1}, {0x011722, 0x011725, 0}, + {0x011726, 0x011726, 1}, {0x011727, 0x01172b, 0}, + {0x01172c, 0x01172f, -1}, {0x011730, 0x011746, 1}, + {0x011747, 0x0117ff, -1}, {0x011800, 0x01182e, 1}, + {0x01182f, 0x011837, 0}, {0x011838, 0x011838, 1}, + {0x011839, 0x01183a, 0}, {0x01183b, 0x01183b, 1}, + {0x01183c, 0x01189f, -1}, {0x0118a0, 0x0118f2, 1}, + {0x0118f3, 0x0118fe, -1}, {0x0118ff, 0x011906, 1}, + {0x011907, 0x011908, -1}, {0x011909, 0x011909, 1}, + {0x01190a, 0x01190b, -1}, {0x01190c, 0x011913, 1}, + {0x011914, 0x011914, -1}, {0x011915, 0x011916, 1}, + {0x011917, 0x011917, -1}, {0x011918, 0x011935, 1}, + {0x011936, 0x011936, -1}, {0x011937, 0x011938, 1}, + {0x011939, 0x01193a, -1}, {0x01193b, 0x01193c, 0}, + {0x01193d, 0x01193d, 1}, {0x01193e, 0x01193e, 0}, + {0x01193f, 0x011942, 1}, {0x011943, 0x011943, 0}, + {0x011944, 0x011946, 1}, {0x011947, 0x01194f, -1}, + {0x011950, 0x011959, 1}, {0x01195a, 0x01199f, -1}, + {0x0119a0, 0x0119a7, 1}, {0x0119a8, 0x0119a9, -1}, + {0x0119aa, 0x0119d3, 1}, {0x0119d4, 0x0119d7, 0}, + {0x0119d8, 0x0119d9, -1}, {0x0119da, 0x0119db, 0}, + {0x0119dc, 0x0119df, 1}, {0x0119e0, 0x0119e0, 0}, + {0x0119e1, 0x0119e4, 1}, {0x0119e5, 0x0119ff, -1}, + {0x011a00, 0x011a00, 1}, {0x011a01, 0x011a0a, 0}, + {0x011a0b, 0x011a32, 1}, {0x011a33, 0x011a38, 0}, + {0x011a39, 0x011a3a, 1}, {0x011a3b, 0x011a3e, 0}, + {0x011a3f, 0x011a46, 1}, {0x011a47, 0x011a47, 0}, + {0x011a48, 0x011a4f, -1}, {0x011a50, 0x011a50, 1}, + {0x011a51, 0x011a56, 0}, {0x011a57, 0x011a58, 1}, + {0x011a59, 0x011a5b, 0}, {0x011a5c, 0x011a89, 1}, + {0x011a8a, 0x011a96, 0}, {0x011a97, 0x011a97, 1}, + {0x011a98, 0x011a99, 0}, {0x011a9a, 0x011aa2, 1}, + {0x011aa3, 0x011aaf, -1}, {0x011ab0, 0x011af8, 1}, + {0x011af9, 0x011aff, -1}, {0x011b00, 0x011b09, 1}, + {0x011b0a, 0x011bbf, -1}, {0x011bc0, 0x011be1, 1}, + {0x011be2, 0x011bef, -1}, {0x011bf0, 0x011bf9, 1}, + {0x011bfa, 0x011bff, -1}, {0x011c00, 0x011c08, 1}, + {0x011c09, 0x011c09, -1}, {0x011c0a, 0x011c2f, 1}, + {0x011c30, 0x011c36, 0}, {0x011c37, 0x011c37, -1}, + {0x011c38, 0x011c3d, 0}, {0x011c3e, 0x011c3e, 1}, + {0x011c3f, 0x011c3f, 0}, {0x011c40, 0x011c45, 1}, + {0x011c46, 0x011c4f, -1}, {0x011c50, 0x011c6c, 1}, + {0x011c6d, 0x011c6f, -1}, {0x011c70, 0x011c8f, 1}, + {0x011c90, 0x011c91, -1}, {0x011c92, 0x011ca7, 0}, + {0x011ca8, 0x011ca8, -1}, {0x011ca9, 0x011ca9, 1}, + {0x011caa, 0x011cb0, 0}, {0x011cb1, 0x011cb1, 1}, + {0x011cb2, 0x011cb3, 0}, {0x011cb4, 0x011cb4, 1}, + {0x011cb5, 0x011cb6, 0}, {0x011cb7, 0x011cff, -1}, + {0x011d00, 0x011d06, 1}, {0x011d07, 0x011d07, -1}, + {0x011d08, 0x011d09, 1}, {0x011d0a, 0x011d0a, -1}, + {0x011d0b, 0x011d30, 1}, {0x011d31, 0x011d36, 0}, + {0x011d37, 0x011d39, -1}, {0x011d3a, 0x011d3a, 0}, + {0x011d3b, 0x011d3b, -1}, {0x011d3c, 0x011d3d, 0}, + {0x011d3e, 0x011d3e, -1}, {0x011d3f, 0x011d45, 0}, + {0x011d46, 0x011d46, 1}, {0x011d47, 0x011d47, 0}, + {0x011d48, 0x011d4f, -1}, {0x011d50, 0x011d59, 1}, + {0x011d5a, 0x011d5f, -1}, {0x011d60, 0x011d65, 1}, + {0x011d66, 0x011d66, -1}, {0x011d67, 0x011d68, 1}, + {0x011d69, 0x011d69, -1}, {0x011d6a, 0x011d8e, 1}, + {0x011d8f, 0x011d8f, -1}, {0x011d90, 0x011d91, 0}, + {0x011d92, 0x011d92, -1}, {0x011d93, 0x011d94, 1}, + {0x011d95, 0x011d95, 0}, {0x011d96, 0x011d96, 1}, + {0x011d97, 0x011d97, 0}, {0x011d98, 0x011d98, 1}, + {0x011d99, 0x011d9f, -1}, {0x011da0, 0x011da9, 1}, + {0x011daa, 0x011edf, -1}, {0x011ee0, 0x011ef2, 1}, + {0x011ef3, 0x011ef4, 0}, {0x011ef5, 0x011ef8, 1}, + {0x011ef9, 0x011eff, -1}, {0x011f00, 0x011f01, 0}, + {0x011f02, 0x011f10, 1}, {0x011f11, 0x011f11, -1}, + {0x011f12, 0x011f35, 1}, {0x011f36, 0x011f3a, 0}, + {0x011f3b, 0x011f3d, -1}, {0x011f3e, 0x011f3f, 1}, + {0x011f40, 0x011f40, 0}, {0x011f41, 0x011f41, 1}, + {0x011f42, 0x011f42, 0}, {0x011f43, 0x011f59, 1}, + {0x011f5a, 0x011f5a, 0}, {0x011f5b, 0x011faf, -1}, + {0x011fb0, 0x011fb0, 1}, {0x011fb1, 0x011fbf, -1}, + {0x011fc0, 0x011ff1, 1}, {0x011ff2, 0x011ffe, -1}, + {0x011fff, 0x012399, 1}, {0x01239a, 0x0123ff, -1}, + {0x012400, 0x01246e, 1}, {0x01246f, 0x01246f, -1}, + {0x012470, 0x012474, 1}, {0x012475, 0x01247f, -1}, + {0x012480, 0x012543, 1}, {0x012544, 0x012f8f, -1}, + {0x012f90, 0x012ff2, 1}, {0x012ff3, 0x012fff, -1}, + {0x013000, 0x01343f, 1}, {0x013440, 0x013440, 0}, + {0x013441, 0x013446, 1}, {0x013447, 0x013455, 0}, + {0x013456, 0x01345f, -1}, {0x013460, 0x0143fa, 1}, + {0x0143fb, 0x0143ff, -1}, {0x014400, 0x014646, 1}, + {0x014647, 0x0160ff, -1}, {0x016100, 0x01611d, 1}, + {0x01611e, 0x016129, 0}, {0x01612a, 0x01612c, 1}, + {0x01612d, 0x01612f, 0}, {0x016130, 0x016139, 1}, + {0x01613a, 0x0167ff, -1}, {0x016800, 0x016a38, 1}, + {0x016a39, 0x016a3f, -1}, {0x016a40, 0x016a5e, 1}, + {0x016a5f, 0x016a5f, -1}, {0x016a60, 0x016a69, 1}, + {0x016a6a, 0x016a6d, -1}, {0x016a6e, 0x016abe, 1}, + {0x016abf, 0x016abf, -1}, {0x016ac0, 0x016ac9, 1}, + {0x016aca, 0x016acf, -1}, {0x016ad0, 0x016aed, 1}, + {0x016aee, 0x016aef, -1}, {0x016af0, 0x016af4, 0}, + {0x016af5, 0x016af5, 1}, {0x016af6, 0x016aff, -1}, + {0x016b00, 0x016b2f, 1}, {0x016b30, 0x016b36, 0}, + {0x016b37, 0x016b45, 1}, {0x016b46, 0x016b4f, -1}, + {0x016b50, 0x016b59, 1}, {0x016b5a, 0x016b5a, -1}, + {0x016b5b, 0x016b61, 1}, {0x016b62, 0x016b62, -1}, + {0x016b63, 0x016b77, 1}, {0x016b78, 0x016b7c, -1}, + {0x016b7d, 0x016b8f, 1}, {0x016b90, 0x016d3f, -1}, + {0x016d40, 0x016d79, 1}, {0x016d7a, 0x016e3f, -1}, + {0x016e40, 0x016e9a, 1}, {0x016e9b, 0x016eff, -1}, + {0x016f00, 0x016f4a, 1}, {0x016f4b, 0x016f4e, -1}, + {0x016f4f, 0x016f4f, 0}, {0x016f50, 0x016f87, 1}, + {0x016f88, 0x016f8e, -1}, {0x016f8f, 0x016f92, 0}, + {0x016f93, 0x016f9f, 1}, {0x016fa0, 0x016fdf, -1}, + {0x016fe0, 0x016fe3, 2}, {0x016fe4, 0x016fe4, 0}, + {0x016fe5, 0x016fef, -1}, {0x016ff0, 0x016ff1, 2}, + {0x016ff2, 0x016fff, -1}, {0x017000, 0x0187f7, 2}, + {0x0187f8, 0x0187ff, -1}, {0x018800, 0x018cd5, 2}, + {0x018cd6, 0x018cfe, -1}, {0x018cff, 0x018d08, 2}, + {0x018d09, 0x01afef, -1}, {0x01aff0, 0x01aff3, 2}, + {0x01aff4, 0x01aff4, -1}, {0x01aff5, 0x01affb, 2}, + {0x01affc, 0x01affc, -1}, {0x01affd, 0x01affe, 2}, + {0x01afff, 0x01afff, -1}, {0x01b000, 0x01b122, 2}, + {0x01b123, 0x01b131, -1}, {0x01b132, 0x01b132, 2}, + {0x01b133, 0x01b14f, -1}, {0x01b150, 0x01b152, 2}, + {0x01b153, 0x01b154, -1}, {0x01b155, 0x01b155, 2}, + {0x01b156, 0x01b163, -1}, {0x01b164, 0x01b167, 2}, + {0x01b168, 0x01b16f, -1}, {0x01b170, 0x01b2fb, 2}, + {0x01b2fc, 0x01bbff, -1}, {0x01bc00, 0x01bc6a, 1}, + {0x01bc6b, 0x01bc6f, -1}, {0x01bc70, 0x01bc7c, 1}, + {0x01bc7d, 0x01bc7f, -1}, {0x01bc80, 0x01bc88, 1}, + {0x01bc89, 0x01bc8f, -1}, {0x01bc90, 0x01bc99, 1}, + {0x01bc9a, 0x01bc9b, -1}, {0x01bc9c, 0x01bc9c, 1}, + {0x01bc9d, 0x01bc9e, 0}, {0x01bc9f, 0x01bc9f, 1}, + {0x01bca0, 0x01bca3, 0}, {0x01bca4, 0x01cbff, -1}, + {0x01cc00, 0x01ccf9, 1}, {0x01ccfa, 0x01ccff, -1}, + {0x01cd00, 0x01ceb3, 1}, {0x01ceb4, 0x01ceff, -1}, + {0x01cf00, 0x01cf2d, 0}, {0x01cf2e, 0x01cf2f, -1}, + {0x01cf30, 0x01cf46, 0}, {0x01cf47, 0x01cf4f, -1}, + {0x01cf50, 0x01cfc3, 1}, {0x01cfc4, 0x01cfff, -1}, + {0x01d000, 0x01d0f5, 1}, {0x01d0f6, 0x01d0ff, -1}, + {0x01d100, 0x01d126, 1}, {0x01d127, 0x01d128, -1}, + {0x01d129, 0x01d166, 1}, {0x01d167, 0x01d169, 0}, + {0x01d16a, 0x01d172, 1}, {0x01d173, 0x01d182, 0}, + {0x01d183, 0x01d184, 1}, {0x01d185, 0x01d18b, 0}, + {0x01d18c, 0x01d1a9, 1}, {0x01d1aa, 0x01d1ad, 0}, + {0x01d1ae, 0x01d1ea, 1}, {0x01d1eb, 0x01d1ff, -1}, + {0x01d200, 0x01d241, 1}, {0x01d242, 0x01d244, 0}, + {0x01d245, 0x01d245, 1}, {0x01d246, 0x01d2bf, -1}, + {0x01d2c0, 0x01d2d3, 1}, {0x01d2d4, 0x01d2df, -1}, + {0x01d2e0, 0x01d2f3, 1}, {0x01d2f4, 0x01d2ff, -1}, + {0x01d300, 0x01d356, 2}, {0x01d357, 0x01d35f, -1}, + {0x01d360, 0x01d376, 2}, {0x01d377, 0x01d378, 1}, + {0x01d379, 0x01d3ff, -1}, {0x01d400, 0x01d454, 1}, + {0x01d455, 0x01d455, -1}, {0x01d456, 0x01d49c, 1}, + {0x01d49d, 0x01d49d, -1}, {0x01d49e, 0x01d49f, 1}, + {0x01d4a0, 0x01d4a1, -1}, {0x01d4a2, 0x01d4a2, 1}, + {0x01d4a3, 0x01d4a4, -1}, {0x01d4a5, 0x01d4a6, 1}, + {0x01d4a7, 0x01d4a8, -1}, {0x01d4a9, 0x01d4ac, 1}, + {0x01d4ad, 0x01d4ad, -1}, {0x01d4ae, 0x01d4b9, 1}, + {0x01d4ba, 0x01d4ba, -1}, {0x01d4bb, 0x01d4bb, 1}, + {0x01d4bc, 0x01d4bc, -1}, {0x01d4bd, 0x01d4c3, 1}, + {0x01d4c4, 0x01d4c4, -1}, {0x01d4c5, 0x01d505, 1}, + {0x01d506, 0x01d506, -1}, {0x01d507, 0x01d50a, 1}, + {0x01d50b, 0x01d50c, -1}, {0x01d50d, 0x01d514, 1}, + {0x01d515, 0x01d515, -1}, {0x01d516, 0x01d51c, 1}, + {0x01d51d, 0x01d51d, -1}, {0x01d51e, 0x01d539, 1}, + {0x01d53a, 0x01d53a, -1}, {0x01d53b, 0x01d53e, 1}, + {0x01d53f, 0x01d53f, -1}, {0x01d540, 0x01d544, 1}, + {0x01d545, 0x01d545, -1}, {0x01d546, 0x01d546, 1}, + {0x01d547, 0x01d549, -1}, {0x01d54a, 0x01d550, 1}, + {0x01d551, 0x01d551, -1}, {0x01d552, 0x01d6a5, 1}, + {0x01d6a6, 0x01d6a7, -1}, {0x01d6a8, 0x01d7cb, 1}, + {0x01d7cc, 0x01d7cd, -1}, {0x01d7ce, 0x01d9ff, 1}, + {0x01da00, 0x01da36, 0}, {0x01da37, 0x01da3a, 1}, + {0x01da3b, 0x01da6c, 0}, {0x01da6d, 0x01da74, 1}, + {0x01da75, 0x01da75, 0}, {0x01da76, 0x01da83, 1}, + {0x01da84, 0x01da84, 0}, {0x01da85, 0x01da8b, 1}, + {0x01da8c, 0x01da9a, -1}, {0x01da9b, 0x01da9f, 0}, + {0x01daa0, 0x01daa0, -1}, {0x01daa1, 0x01daaf, 0}, + {0x01dab0, 0x01deff, -1}, {0x01df00, 0x01df1e, 1}, + {0x01df1f, 0x01df24, -1}, {0x01df25, 0x01df2a, 1}, + {0x01df2b, 0x01dfff, -1}, {0x01e000, 0x01e006, 0}, + {0x01e007, 0x01e007, -1}, {0x01e008, 0x01e018, 0}, + {0x01e019, 0x01e01a, -1}, {0x01e01b, 0x01e021, 0}, + {0x01e022, 0x01e022, -1}, {0x01e023, 0x01e024, 0}, + {0x01e025, 0x01e025, -1}, {0x01e026, 0x01e02a, 0}, + {0x01e02b, 0x01e02f, -1}, {0x01e030, 0x01e06d, 1}, + {0x01e06e, 0x01e08e, -1}, {0x01e08f, 0x01e08f, 0}, + {0x01e090, 0x01e0ff, -1}, {0x01e100, 0x01e12c, 1}, + {0x01e12d, 0x01e12f, -1}, {0x01e130, 0x01e136, 0}, + {0x01e137, 0x01e13d, 1}, {0x01e13e, 0x01e13f, -1}, + {0x01e140, 0x01e149, 1}, {0x01e14a, 0x01e14d, -1}, + {0x01e14e, 0x01e14f, 1}, {0x01e150, 0x01e28f, -1}, + {0x01e290, 0x01e2ad, 1}, {0x01e2ae, 0x01e2ae, 0}, + {0x01e2af, 0x01e2bf, -1}, {0x01e2c0, 0x01e2eb, 1}, + {0x01e2ec, 0x01e2ef, 0}, {0x01e2f0, 0x01e2f9, 1}, + {0x01e2fa, 0x01e2fe, -1}, {0x01e2ff, 0x01e2ff, 1}, + {0x01e300, 0x01e4cf, -1}, {0x01e4d0, 0x01e4eb, 1}, + {0x01e4ec, 0x01e4ef, 0}, {0x01e4f0, 0x01e4f9, 1}, + {0x01e4fa, 0x01e5cf, -1}, {0x01e5d0, 0x01e5ed, 1}, + {0x01e5ee, 0x01e5ef, 0}, {0x01e5f0, 0x01e5fa, 1}, + {0x01e5fb, 0x01e5fe, -1}, {0x01e5ff, 0x01e5ff, 1}, + {0x01e600, 0x01e7df, -1}, {0x01e7e0, 0x01e7e6, 1}, + {0x01e7e7, 0x01e7e7, -1}, {0x01e7e8, 0x01e7eb, 1}, + {0x01e7ec, 0x01e7ec, -1}, {0x01e7ed, 0x01e7ee, 1}, + {0x01e7ef, 0x01e7ef, -1}, {0x01e7f0, 0x01e7fe, 1}, + {0x01e7ff, 0x01e7ff, -1}, {0x01e800, 0x01e8c4, 1}, + {0x01e8c5, 0x01e8c6, -1}, {0x01e8c7, 0x01e8cf, 1}, + {0x01e8d0, 0x01e8d6, 0}, {0x01e8d7, 0x01e8ff, -1}, + {0x01e900, 0x01e943, 1}, {0x01e944, 0x01e94a, 0}, + {0x01e94b, 0x01e94b, 1}, {0x01e94c, 0x01e94f, -1}, + {0x01e950, 0x01e959, 1}, {0x01e95a, 0x01e95d, -1}, + {0x01e95e, 0x01e95f, 1}, {0x01e960, 0x01ec70, -1}, + {0x01ec71, 0x01ecb4, 1}, {0x01ecb5, 0x01ed00, -1}, + {0x01ed01, 0x01ed3d, 1}, {0x01ed3e, 0x01edff, -1}, + {0x01ee00, 0x01ee03, 1}, {0x01ee04, 0x01ee04, -1}, + {0x01ee05, 0x01ee1f, 1}, {0x01ee20, 0x01ee20, -1}, + {0x01ee21, 0x01ee22, 1}, {0x01ee23, 0x01ee23, -1}, + {0x01ee24, 0x01ee24, 1}, {0x01ee25, 0x01ee26, -1}, + {0x01ee27, 0x01ee27, 1}, {0x01ee28, 0x01ee28, -1}, + {0x01ee29, 0x01ee32, 1}, {0x01ee33, 0x01ee33, -1}, + {0x01ee34, 0x01ee37, 1}, {0x01ee38, 0x01ee38, -1}, + {0x01ee39, 0x01ee39, 1}, {0x01ee3a, 0x01ee3a, -1}, + {0x01ee3b, 0x01ee3b, 1}, {0x01ee3c, 0x01ee41, -1}, + {0x01ee42, 0x01ee42, 1}, {0x01ee43, 0x01ee46, -1}, + {0x01ee47, 0x01ee47, 1}, {0x01ee48, 0x01ee48, -1}, + {0x01ee49, 0x01ee49, 1}, {0x01ee4a, 0x01ee4a, -1}, + {0x01ee4b, 0x01ee4b, 1}, {0x01ee4c, 0x01ee4c, -1}, + {0x01ee4d, 0x01ee4f, 1}, {0x01ee50, 0x01ee50, -1}, + {0x01ee51, 0x01ee52, 1}, {0x01ee53, 0x01ee53, -1}, + {0x01ee54, 0x01ee54, 1}, {0x01ee55, 0x01ee56, -1}, + {0x01ee57, 0x01ee57, 1}, {0x01ee58, 0x01ee58, -1}, + {0x01ee59, 0x01ee59, 1}, {0x01ee5a, 0x01ee5a, -1}, + {0x01ee5b, 0x01ee5b, 1}, {0x01ee5c, 0x01ee5c, -1}, + {0x01ee5d, 0x01ee5d, 1}, {0x01ee5e, 0x01ee5e, -1}, + {0x01ee5f, 0x01ee5f, 1}, {0x01ee60, 0x01ee60, -1}, + {0x01ee61, 0x01ee62, 1}, {0x01ee63, 0x01ee63, -1}, + {0x01ee64, 0x01ee64, 1}, {0x01ee65, 0x01ee66, -1}, + {0x01ee67, 0x01ee6a, 1}, {0x01ee6b, 0x01ee6b, -1}, + {0x01ee6c, 0x01ee72, 1}, {0x01ee73, 0x01ee73, -1}, + {0x01ee74, 0x01ee77, 1}, {0x01ee78, 0x01ee78, -1}, + {0x01ee79, 0x01ee7c, 1}, {0x01ee7d, 0x01ee7d, -1}, + {0x01ee7e, 0x01ee7e, 1}, {0x01ee7f, 0x01ee7f, -1}, + {0x01ee80, 0x01ee89, 1}, {0x01ee8a, 0x01ee8a, -1}, + {0x01ee8b, 0x01ee9b, 1}, {0x01ee9c, 0x01eea0, -1}, + {0x01eea1, 0x01eea3, 1}, {0x01eea4, 0x01eea4, -1}, + {0x01eea5, 0x01eea9, 1}, {0x01eeaa, 0x01eeaa, -1}, + {0x01eeab, 0x01eebb, 1}, {0x01eebc, 0x01eeef, -1}, + {0x01eef0, 0x01eef1, 1}, {0x01eef2, 0x01efff, -1}, + {0x01f000, 0x01f003, 1}, {0x01f004, 0x01f004, 2}, + {0x01f005, 0x01f02b, 1}, {0x01f02c, 0x01f02f, -1}, + {0x01f030, 0x01f093, 1}, {0x01f094, 0x01f09f, -1}, + {0x01f0a0, 0x01f0ae, 1}, {0x01f0af, 0x01f0b0, -1}, + {0x01f0b1, 0x01f0bf, 1}, {0x01f0c0, 0x01f0c0, -1}, + {0x01f0c1, 0x01f0ce, 1}, {0x01f0cf, 0x01f0cf, 2}, + {0x01f0d0, 0x01f0d0, -1}, {0x01f0d1, 0x01f0f5, 1}, + {0x01f0f6, 0x01f0ff, -1}, {0x01f100, 0x01f18d, 1}, + {0x01f18e, 0x01f18e, 2}, {0x01f18f, 0x01f190, 1}, + {0x01f191, 0x01f19a, 2}, {0x01f19b, 0x01f1ad, 1}, + {0x01f1ae, 0x01f1e5, -1}, {0x01f1e6, 0x01f1ff, 1}, + {0x01f200, 0x01f202, 2}, {0x01f203, 0x01f20f, -1}, + {0x01f210, 0x01f23b, 2}, {0x01f23c, 0x01f23f, -1}, + {0x01f240, 0x01f248, 2}, {0x01f249, 0x01f24f, -1}, + {0x01f250, 0x01f251, 2}, {0x01f252, 0x01f25f, -1}, + {0x01f260, 0x01f265, 2}, {0x01f266, 0x01f2ff, -1}, + {0x01f300, 0x01f320, 2}, {0x01f321, 0x01f32c, 1}, + {0x01f32d, 0x01f335, 2}, {0x01f336, 0x01f336, 1}, + {0x01f337, 0x01f37c, 2}, {0x01f37d, 0x01f37d, 1}, + {0x01f37e, 0x01f393, 2}, {0x01f394, 0x01f39f, 1}, + {0x01f3a0, 0x01f3ca, 2}, {0x01f3cb, 0x01f3ce, 1}, + {0x01f3cf, 0x01f3d3, 2}, {0x01f3d4, 0x01f3df, 1}, + {0x01f3e0, 0x01f3f0, 2}, {0x01f3f1, 0x01f3f3, 1}, + {0x01f3f4, 0x01f3f4, 2}, {0x01f3f5, 0x01f3f7, 1}, + {0x01f3f8, 0x01f43e, 2}, {0x01f43f, 0x01f43f, 1}, + {0x01f440, 0x01f440, 2}, {0x01f441, 0x01f441, 1}, + {0x01f442, 0x01f4fc, 2}, {0x01f4fd, 0x01f4fe, 1}, + {0x01f4ff, 0x01f53d, 2}, {0x01f53e, 0x01f54a, 1}, + {0x01f54b, 0x01f54e, 2}, {0x01f54f, 0x01f54f, 1}, + {0x01f550, 0x01f567, 2}, {0x01f568, 0x01f579, 1}, + {0x01f57a, 0x01f57a, 2}, {0x01f57b, 0x01f594, 1}, + {0x01f595, 0x01f596, 2}, {0x01f597, 0x01f5a3, 1}, + {0x01f5a4, 0x01f5a4, 2}, {0x01f5a5, 0x01f5fa, 1}, + {0x01f5fb, 0x01f64f, 2}, {0x01f650, 0x01f67f, 1}, + {0x01f680, 0x01f6c5, 2}, {0x01f6c6, 0x01f6cb, 1}, + {0x01f6cc, 0x01f6cc, 2}, {0x01f6cd, 0x01f6cf, 1}, + {0x01f6d0, 0x01f6d2, 2}, {0x01f6d3, 0x01f6d4, 1}, + {0x01f6d5, 0x01f6d7, 2}, {0x01f6d8, 0x01f6db, -1}, + {0x01f6dc, 0x01f6df, 2}, {0x01f6e0, 0x01f6ea, 1}, + {0x01f6eb, 0x01f6ec, 2}, {0x01f6ed, 0x01f6ef, -1}, + {0x01f6f0, 0x01f6f3, 1}, {0x01f6f4, 0x01f6fc, 2}, + {0x01f6fd, 0x01f6ff, -1}, {0x01f700, 0x01f776, 1}, + {0x01f777, 0x01f77a, -1}, {0x01f77b, 0x01f7d9, 1}, + {0x01f7da, 0x01f7df, -1}, {0x01f7e0, 0x01f7eb, 2}, + {0x01f7ec, 0x01f7ef, -1}, {0x01f7f0, 0x01f7f0, 2}, + {0x01f7f1, 0x01f7ff, -1}, {0x01f800, 0x01f80b, 1}, + {0x01f80c, 0x01f80f, -1}, {0x01f810, 0x01f847, 1}, + {0x01f848, 0x01f84f, -1}, {0x01f850, 0x01f859, 1}, + {0x01f85a, 0x01f85f, -1}, {0x01f860, 0x01f887, 1}, + {0x01f888, 0x01f88f, -1}, {0x01f890, 0x01f8ad, 1}, + {0x01f8ae, 0x01f8af, -1}, {0x01f8b0, 0x01f8bb, 1}, + {0x01f8bc, 0x01f8bf, -1}, {0x01f8c0, 0x01f8c1, 1}, + {0x01f8c2, 0x01f8ff, -1}, {0x01f900, 0x01f90b, 1}, + {0x01f90c, 0x01f93a, 2}, {0x01f93b, 0x01f93b, 1}, + {0x01f93c, 0x01f945, 2}, {0x01f946, 0x01f946, 1}, + {0x01f947, 0x01f9ff, 2}, {0x01fa00, 0x01fa53, 1}, + {0x01fa54, 0x01fa5f, -1}, {0x01fa60, 0x01fa6d, 1}, + {0x01fa6e, 0x01fa6f, -1}, {0x01fa70, 0x01fa7c, 2}, + {0x01fa7d, 0x01fa7f, -1}, {0x01fa80, 0x01fa89, 2}, + {0x01fa8a, 0x01fa8e, -1}, {0x01fa8f, 0x01fac6, 2}, + {0x01fac7, 0x01facd, -1}, {0x01face, 0x01fadc, 2}, + {0x01fadd, 0x01fade, -1}, {0x01fadf, 0x01fae9, 2}, + {0x01faea, 0x01faef, -1}, {0x01faf0, 0x01faf8, 2}, + {0x01faf9, 0x01faff, -1}, {0x01fb00, 0x01fb92, 1}, + {0x01fb93, 0x01fb93, -1}, {0x01fb94, 0x01fbf9, 1}, + {0x01fbfa, 0x01ffff, -1}, {0x020000, 0x02a6df, 2}, + {0x02a6e0, 0x02a6ff, -1}, {0x02a700, 0x02b739, 2}, + {0x02b73a, 0x02b73f, -1}, {0x02b740, 0x02b81d, 2}, + {0x02b81e, 0x02b81f, -1}, {0x02b820, 0x02cea1, 2}, + {0x02cea2, 0x02ceaf, -1}, {0x02ceb0, 0x02ebe0, 2}, + {0x02ebe1, 0x02ebef, -1}, {0x02ebf0, 0x02ee5d, 2}, + {0x02ee5e, 0x02f7ff, -1}, {0x02f800, 0x02fa1d, 2}, + {0x02fa1e, 0x02ffff, -1}, {0x030000, 0x03134a, 2}, + {0x03134b, 0x03134f, -1}, {0x031350, 0x0323af, 2}, + {0x0323b0, 0x0e0000, -1}, {0x0e0001, 0x0e0001, 0}, + {0x0e0002, 0x0e001f, -1}, {0x0e0020, 0x0e007f, 0}, + {0x0e0080, 0x0e00ff, -1}, {0x0e0100, 0x0e01ef, 0}, + {0x0e01f0, 0x0effff, -1}, {0x0f0000, 0x0ffffd, 1}, + {0x0ffffe, 0x0fffff, -1}, {0x100000, 0x10fffd, 1}, + {0x10fffe, 0x10ffff, -1}}; -static int wcrange(const uint32_t *lo, const uint16_t *cnt, int n, - uint32_t ch) { - int l = 0, h = n - 1; - while (l <= h) { - int m = (l + h) / 2; - if (ch < lo[m]) - h = m - 1; - else if (ch > lo[m] + cnt[m]) - l = m + 1; - else - return 1; - } - return 0; -} +#define WCWIDTH_TABLE_LEN 2143 int wcwidth(uint32_t ch) { if (ch >= 0x20 && ch <= 0x7e) @@ -170,11 +1099,18 @@ int wcwidth(uint32_t ch) { return 1; if (ch < 0x20 || (ch > 0x7e && ch < 0xa0)) return ch == 0 ? 0 : -1; - if (wcrange(wcw0_lo, wcw0_cnt, WCW0_LEN, ch)) - return 0; - if (wcrange(wcw2_lo, wcw2_cnt, WCW2_LEN, ch)) - return 2; - return 1; + + int lo = 0, hi = WCWIDTH_TABLE_LEN - 1; + while (lo <= hi) { + int mid = (lo + hi) / 2; + if (ch < wcwidth_table[mid].lo) + hi = mid - 1; + else if (ch > wcwidth_table[mid].hi) + lo = mid + 1; + else + return wcwidth_table[mid].w; + } + return -1; } int iswprint(uint32_t ch) { return wcwidth(ch) >= 0; } diff --git a/tasks/bundle-wasm.ts b/tasks/bundle-wasm.ts index d1918b2..b6b033d 100644 --- a/tasks/bundle-wasm.ts +++ b/tasks/bundle-wasm.ts @@ -1,54 +1,13 @@ -import { brotliCompressSync, constants } from "node:zlib"; - -const Z85 = - "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-:+=^!/*?&<>()[]{}@%$#"; - -function encodeZ85(data: Uint8Array): string { - let padLen = (4 - (data.length % 4)) % 4; - let src = data; - if (padLen > 0) { - src = new Uint8Array(data.length + padLen); - src.set(data); - } - let out: string[] = []; - for (let i = 0; i < src.length; i += 4) { - let v = src[i] * 16777216 + src[i + 1] * 65536 + src[i + 2] * 256 + - src[i + 3]; - out.push( - Z85[Math.floor(v / 52200625)], - Z85[Math.floor(v / 614125) % 85], - Z85[Math.floor(v / 7225) % 85], - Z85[Math.floor(v / 85) % 85], - Z85[v % 85], - ); - } - return out.join(""); -} +import { encodeBase64 } from "@std/encoding/base64"; const wasm = await Deno.readFile("clayterm.wasm"); +const base64 = encodeBase64(wasm); -const compressed = new Uint8Array(brotliCompressSync(wasm, { - params: { - [constants.BROTLI_PARAM_QUALITY]: 11, - [constants.BROTLI_PARAM_SIZE_HINT]: wasm.length, - [constants.BROTLI_PARAM_LGWIN]: 24, - }, -})); - -const z85 = encodeZ85(compressed); - -// Decoder uses division instead of >>> to avoid 32-bit truncation on values near 0xFFFFFFFF. -const source = `import{brotliDecompressSync}from"node:zlib"; -const Z="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-:+=^!/*?&<>()[]{}@%$#"; -const T=new Uint8Array(128);for(let i=0;i<85;i++)T[Z.charCodeAt(i)]=i; -function d(s:string,n:number){const b=new Uint8Array(n);let o=0;for(let i=0;i Date: Sun, 24 May 2026 17:34:08 +0000 Subject: [PATCH 34/47] Add CodSpeed performance benchmarks --- .github/workflows/codspeed.yml | 47 + README.md | 2 + bench/input.bench.ts | 65 ++ bench/ops.bench.ts | 121 ++ bench/render.bench.ts | 170 +++ deno.json | 4 +- deno.lock | 758 +++++++++++- package-lock.json | 1981 ++++++++++++++++++++++++++++++++ package.json | 8 + vitest.config.ts | 11 + 10 files changed, 3163 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/codspeed.yml create mode 100644 bench/input.bench.ts create mode 100644 bench/ops.bench.ts create mode 100644 bench/render.bench.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 vitest.config.ts diff --git a/.github/workflows/codspeed.yml b/.github/workflows/codspeed.yml new file mode 100644 index 0000000..4cc2b40 --- /dev/null +++ b/.github/workflows/codspeed.yml @@ -0,0 +1,47 @@ +name: CodSpeed + +on: + push: + branches: main + pull_request: + branches: main + # `workflow_dispatch` allows CodSpeed to trigger backtest + # performance analysis in order to generate initial data. + workflow_dispatch: + +permissions: + contents: read + id-token: write + +jobs: + benchmarks: + name: Run benchmarks + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: true + + - name: Setup Deno + uses: denoland/setup-deno@v2 + with: + deno-version: v2.x + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Build WASM + run: make + + - name: Install dependencies + run: npm install + + - name: Run benchmarks + uses: CodSpeedHQ/action@v4 + with: + mode: simulation + run: npx vitest bench --run diff --git a/README.md b/README.md index e6b853b..1299a89 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # clayterm +[![CodSpeed](https://img.shields.io/endpoint?url=https://codspeed.io/badge.json)](https://codspeed.io/bombshell-dev/clayterm?utm_source=badge) + A low-level, platform-independent terminal renderer and event parser for JavaScript. You can use clayterm directly, or as the foundation for your own framework. diff --git a/bench/input.bench.ts b/bench/input.bench.ts new file mode 100644 index 0000000..eba4c6a --- /dev/null +++ b/bench/input.bench.ts @@ -0,0 +1,65 @@ +import { describe, bench, beforeAll } from "vitest"; +import { createInput, type Input } from "../input.ts"; + +function bytes(...values: number[]): Uint8Array { + return new Uint8Array(values); +} + +function str(s: string): Uint8Array { + return new TextEncoder().encode(s); +} + +describe("input parsing", () => { + let input: Input; + + beforeAll(async () => { + input = await createInput({ escLatency: 25 }); + }); + + bench("printable ASCII (single char)", () => { + input.scan(bytes(0x61)); + }); + + bench("printable ASCII (short string)", () => { + input.scan(str("hello world")); + }); + + bench("arrow key (CSI sequence)", () => { + input.scan(bytes(0x1b, 0x5b, 0x41)); + }); + + bench("modifier combo (Ctrl+Shift+Arrow)", () => { + input.scan(bytes(0x1b, 0x5b, 0x31, 0x3b, 0x38, 0x41)); + }); + + bench("SGR mouse press", () => { + input.scan(str("\x1b[<0;35;12M")); + }); + + bench("multi-event burst (arrows + text)", () => { + input.scan( + bytes(0x1b, 0x5b, 0x41, 0x1b, 0x5b, 0x42, 0x68, 0x69), + ); + }); + + bench("UTF-8 3-byte character", () => { + input.scan(bytes(0xe4, 0xb8, 0xad)); + }); + + bench("UTF-8 4-byte emoji", () => { + input.scan(bytes(0xf0, 0x9f, 0x8e, 0x89)); + }); + + bench("Kitty protocol (CSI u with modifiers)", () => { + input.scan(str("\x1b[97;3u")); + }); + + let longBurst = new Uint8Array(200); + for (let i = 0; i < 200; i++) { + longBurst[i] = 0x61 + (i % 26); + } + + bench("long input burst (200 bytes)", () => { + input.scan(longBurst); + }); +}); diff --git a/bench/ops.bench.ts b/bench/ops.bench.ts new file mode 100644 index 0000000..22949e6 --- /dev/null +++ b/bench/ops.bench.ts @@ -0,0 +1,121 @@ +import { describe, bench } from "vitest"; +import { close, fixed, grow, open, pack, rgba, text } from "../ops.ts"; +import type { Op } from "../ops.ts"; + +function makeBuf(size: number): ArrayBuffer { + return new ArrayBuffer(size); +} + +describe("pack", () => { + let simpleOps: Op[] = [ + open("root", { + layout: { width: grow(), height: grow(), direction: "ttb" }, + }), + text("Hello, World!"), + close(), + ]; + + bench("simple tree (root + text)", () => { + let buf = makeBuf(4096); + pack(simpleOps, buf, 0); + }); + + let complexOps: Op[] = [ + open("root", { + layout: { width: grow(), height: grow(), direction: "ttb" }, + }), + open("header", { + layout: { + width: grow(), + height: fixed(3), + padding: { left: 1, right: 1 }, + direction: "ltr", + }, + bg: rgba(30, 30, 40), + border: { + color: rgba(100, 100, 120), + bottom: 1, + }, + }), + text("Title", { color: rgba(255, 255, 255), fontSize: 1 }), + close(), + open("body", { + layout: { + width: grow(), + height: grow(), + direction: "ltr", + gap: 1, + }, + }), + open("sidebar", { + layout: { + width: fixed(20), + height: grow(), + direction: "ttb", + padding: { left: 1, right: 1, top: 1 }, + }, + bg: rgba(25, 25, 35), + border: { + color: rgba(60, 60, 80), + right: 1, + }, + }), + text("Menu Item 1"), + text("Menu Item 2"), + text("Menu Item 3"), + close(), + open("main", { + layout: { + width: grow(), + height: grow(), + direction: "ttb", + padding: { left: 2, top: 1 }, + }, + }), + text("Main content area with longer text to exercise the encoder"), + close(), + close(), + open("footer", { + layout: { + width: grow(), + height: fixed(1), + padding: { left: 1 }, + direction: "ltr", + }, + bg: rgba(30, 30, 40), + }), + text("Status: OK"), + close(), + close(), + ]; + + bench("complex layout (header + sidebar + main + footer)", () => { + let buf = makeBuf(8192); + pack(complexOps, buf, 0); + }); + + let listOps: Op[] = [ + open("root", { + layout: { width: grow(), height: grow(), direction: "ttb" }, + }), + ...Array.from({ length: 50 }, (_, i) => [ + open(`item-${i}`, { + layout: { + width: grow(), + height: fixed(1), + padding: { left: 2 }, + direction: "ltr", + }, + bg: i % 2 === 0 ? rgba(30, 30, 40) : rgba(35, 35, 45), + }), + text(`List item ${i}: some description text`), + close(), + ]).flat(), + close(), + ]; + + bench("large list (50 items)", () => { + let buf = makeBuf(32768); + pack(listOps, buf, 0); + }); +}); diff --git a/bench/render.bench.ts b/bench/render.bench.ts new file mode 100644 index 0000000..c075ba0 --- /dev/null +++ b/bench/render.bench.ts @@ -0,0 +1,170 @@ +import { describe, bench, beforeAll } from "vitest"; +import { createTerm, type Term } from "../term.ts"; +import { close, fixed, grow, open, rgba, text } from "../ops.ts"; +import type { Op } from "../ops.ts"; + +describe("render", () => { + let term: Term; + + beforeAll(async () => { + term = await createTerm({ width: 80, height: 24 }); + }); + + let helloOps: Op[] = [ + open("root", { + layout: { width: grow(), height: grow(), direction: "ttb" }, + }), + text("Hello, World!"), + close(), + ]; + + bench("simple text", () => { + term.render(helloOps); + }); + + let borderedOps: Op[] = [ + open("root", { + layout: { width: grow(), height: grow(), direction: "ttb" }, + }), + open("box", { + layout: { + width: grow(), + height: grow(), + padding: { left: 1, right: 1, top: 1, bottom: 1 }, + direction: "ttb", + }, + border: { + color: rgba(0, 255, 0), + left: 1, + right: 1, + top: 1, + bottom: 1, + }, + cornerRadius: { tl: 1, tr: 1, bl: 1, br: 1 }, + }), + text("Bordered content"), + close(), + close(), + ]; + + bench("bordered box with corner radius", () => { + term.render(borderedOps); + }); + + let dashboardOps: Op[] = [ + open("root", { + layout: { width: grow(), height: grow(), direction: "ttb" }, + }), + open("header", { + layout: { + width: grow(), + height: fixed(3), + padding: { left: 1 }, + direction: "ltr", + }, + bg: rgba(30, 30, 40), + border: { color: rgba(80, 80, 100), bottom: 1 }, + }), + text("Dashboard", { color: rgba(255, 255, 255) }), + close(), + open("body", { + layout: { width: grow(), height: grow(), direction: "ltr" }, + }), + open("sidebar", { + layout: { + width: fixed(20), + height: grow(), + direction: "ttb", + padding: { left: 1, top: 1 }, + }, + bg: rgba(25, 25, 35), + border: { color: rgba(60, 60, 80), right: 1 }, + }), + text("Nav 1"), + text("Nav 2"), + text("Nav 3"), + text("Nav 4"), + close(), + open("main", { + layout: { + width: grow(), + height: grow(), + direction: "ttb", + padding: { left: 2, top: 1 }, + }, + }), + ...Array.from({ length: 10 }, (_, i) => [ + open(`row-${i}`, { + layout: { + width: grow(), + height: fixed(1), + direction: "ltr", + }, + bg: i % 2 === 0 ? rgba(35, 35, 45) : undefined, + }), + text(`Row ${i}: data value ${i * 42}`), + close(), + ]).flat(), + close(), + close(), + open("footer", { + layout: { + width: grow(), + height: fixed(1), + padding: { left: 1 }, + }, + bg: rgba(30, 30, 40), + }), + text("Ready"), + close(), + close(), + ]; + + bench("dashboard layout", () => { + term.render(dashboardOps); + }); + + bench("diff render (second frame)", () => { + // First render populates the front buffer + term.render(dashboardOps); + // Second render exercises the diff path + term.render(dashboardOps); + }); +}); + +describe("render with pointer", () => { + let term: Term; + + beforeAll(async () => { + term = await createTerm({ width: 80, height: 24 }); + }); + + let uiOps: Op[] = [ + open("root", { + layout: { width: grow(), height: grow(), direction: "ttb" }, + }), + open("button", { + layout: { + width: fixed(20), + height: fixed(3), + padding: { left: 1, right: 1 }, + }, + bg: rgba(50, 50, 200), + border: { + color: rgba(100, 100, 255), + left: 1, + right: 1, + top: 1, + bottom: 1, + }, + cornerRadius: { tl: 1, tr: 1, bl: 1, br: 1 }, + }), + text("Click me"), + close(), + close(), + ]; + + bench("render with pointer hit testing", () => { + term.render(uiOps, { pointer: { x: 10, y: 1, down: false } }); + }); +}); diff --git a/deno.json b/deno.json index fab9ce2..ab92df2 100644 --- a/deno.json +++ b/deno.json @@ -26,11 +26,11 @@ "exclude": ["!wasm.ts"] }, "fmt": { - "exclude": ["clay", "build"] + "exclude": ["clay", "build", "bench", "node_modules"] }, "lint": { "rules": { "exclude": ["prefer-const"] }, - "exclude": ["clay", "build"], + "exclude": ["clay", "build", "bench", "node_modules"], "plugins": ["lint/prefer-let.ts"] } } diff --git a/deno.lock b/deno.lock index 7947a80..bfd82c0 100644 --- a/deno.lock +++ b/deno.lock @@ -20,10 +20,12 @@ "jsr:@std/testing@1": "1.0.17", "jsr:@ts-morph/bootstrap@0.27": "0.27.0", "jsr:@ts-morph/common@0.27": "0.27.0", + "npm:@codspeed/vitest-plugin@^5.4.0": "5.4.0_tinybench@2.9.0_vite@7.3.3_vitest@4.1.7__vite@7.3.3", "npm:@sinclair/typebox@*": "0.34.48", "npm:@sinclair/typebox@0.34": "0.34.48", "npm:effection@^4.0.2": "4.0.2", - "npm:valrs@*": "0.1.0" + "npm:valrs@*": "0.1.0", + "npm:vitest@^4.1.7": "4.1.7_vite@7.3.3" }, "jsr": { "@david/code-block-writer@13.0.3": { @@ -109,14 +111,760 @@ } }, "npm": { + "@codspeed/core@5.4.0": { + "integrity": "sha512-SwGjXDixN/zX1awBR95LzS0KxIs931qwf7Hbk7BRWv1jAdlMYf9o9GlSnWER4zGBHz941BvzFQJ1O2RIofW3cg==", + "dependencies": [ + "axios", + "find-up", + "form-data", + "node-gyp-build" + ] + }, + "@codspeed/vitest-plugin@5.4.0_tinybench@2.9.0_vite@7.3.3_vitest@4.1.7__vite@7.3.3": { + "integrity": "sha512-Xa9HaZHUjYXn1T39bTipV5hmguk1vIuDZs3Gc5OYA8X4ohftYbKfyoFtBqVFfB/ii/p1ihuwt+tltraKMcRDsA==", + "dependencies": [ + "@codspeed/core", + "tinybench", + "vite", + "vitest" + ] + }, + "@esbuild/aix-ppc64@0.27.7": { + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "os": ["aix"], + "cpu": ["ppc64"] + }, + "@esbuild/android-arm64@0.27.7": { + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "os": ["android"], + "cpu": ["arm64"] + }, + "@esbuild/android-arm@0.27.7": { + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "os": ["android"], + "cpu": ["arm"] + }, + "@esbuild/android-x64@0.27.7": { + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "os": ["android"], + "cpu": ["x64"] + }, + "@esbuild/darwin-arm64@0.27.7": { + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@esbuild/darwin-x64@0.27.7": { + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "@esbuild/freebsd-arm64@0.27.7": { + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "os": ["freebsd"], + "cpu": ["arm64"] + }, + "@esbuild/freebsd-x64@0.27.7": { + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "os": ["freebsd"], + "cpu": ["x64"] + }, + "@esbuild/linux-arm64@0.27.7": { + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@esbuild/linux-arm@0.27.7": { + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@esbuild/linux-ia32@0.27.7": { + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "os": ["linux"], + "cpu": ["ia32"] + }, + "@esbuild/linux-loong64@0.27.7": { + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "os": ["linux"], + "cpu": ["loong64"] + }, + "@esbuild/linux-mips64el@0.27.7": { + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "os": ["linux"], + "cpu": ["mips64el"] + }, + "@esbuild/linux-ppc64@0.27.7": { + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@esbuild/linux-riscv64@0.27.7": { + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "os": ["linux"], + "cpu": ["riscv64"] + }, + "@esbuild/linux-s390x@0.27.7": { + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "os": ["linux"], + "cpu": ["s390x"] + }, + "@esbuild/linux-x64@0.27.7": { + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@esbuild/netbsd-arm64@0.27.7": { + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "os": ["netbsd"], + "cpu": ["arm64"] + }, + "@esbuild/netbsd-x64@0.27.7": { + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "os": ["netbsd"], + "cpu": ["x64"] + }, + "@esbuild/openbsd-arm64@0.27.7": { + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "os": ["openbsd"], + "cpu": ["arm64"] + }, + "@esbuild/openbsd-x64@0.27.7": { + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "os": ["openbsd"], + "cpu": ["x64"] + }, + "@esbuild/openharmony-arm64@0.27.7": { + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "os": ["openharmony"], + "cpu": ["arm64"] + }, + "@esbuild/sunos-x64@0.27.7": { + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "os": ["sunos"], + "cpu": ["x64"] + }, + "@esbuild/win32-arm64@0.27.7": { + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "@esbuild/win32-ia32@0.27.7": { + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "os": ["win32"], + "cpu": ["ia32"] + }, + "@esbuild/win32-x64@0.27.7": { + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@jridgewell/sourcemap-codec@1.5.5": { + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" + }, + "@rollup/rollup-android-arm-eabi@4.60.4": { + "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", + "os": ["android"], + "cpu": ["arm"] + }, + "@rollup/rollup-android-arm64@4.60.4": { + "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", + "os": ["android"], + "cpu": ["arm64"] + }, + "@rollup/rollup-darwin-arm64@4.60.4": { + "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@rollup/rollup-darwin-x64@4.60.4": { + "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "@rollup/rollup-freebsd-arm64@4.60.4": { + "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", + "os": ["freebsd"], + "cpu": ["arm64"] + }, + "@rollup/rollup-freebsd-x64@4.60.4": { + "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", + "os": ["freebsd"], + "cpu": ["x64"] + }, + "@rollup/rollup-linux-arm-gnueabihf@4.60.4": { + "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@rollup/rollup-linux-arm-musleabihf@4.60.4": { + "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@rollup/rollup-linux-arm64-gnu@4.60.4": { + "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@rollup/rollup-linux-arm64-musl@4.60.4": { + "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@rollup/rollup-linux-loong64-gnu@4.60.4": { + "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", + "os": ["linux"], + "cpu": ["loong64"] + }, + "@rollup/rollup-linux-loong64-musl@4.60.4": { + "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", + "os": ["linux"], + "cpu": ["loong64"] + }, + "@rollup/rollup-linux-ppc64-gnu@4.60.4": { + "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@rollup/rollup-linux-ppc64-musl@4.60.4": { + "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@rollup/rollup-linux-riscv64-gnu@4.60.4": { + "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", + "os": ["linux"], + "cpu": ["riscv64"] + }, + "@rollup/rollup-linux-riscv64-musl@4.60.4": { + "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", + "os": ["linux"], + "cpu": ["riscv64"] + }, + "@rollup/rollup-linux-s390x-gnu@4.60.4": { + "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", + "os": ["linux"], + "cpu": ["s390x"] + }, + "@rollup/rollup-linux-x64-gnu@4.60.4": { + "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@rollup/rollup-linux-x64-musl@4.60.4": { + "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@rollup/rollup-openbsd-x64@4.60.4": { + "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", + "os": ["openbsd"], + "cpu": ["x64"] + }, + "@rollup/rollup-openharmony-arm64@4.60.4": { + "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", + "os": ["openharmony"], + "cpu": ["arm64"] + }, + "@rollup/rollup-win32-arm64-msvc@4.60.4": { + "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "@rollup/rollup-win32-ia32-msvc@4.60.4": { + "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", + "os": ["win32"], + "cpu": ["ia32"] + }, + "@rollup/rollup-win32-x64-gnu@4.60.4": { + "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@rollup/rollup-win32-x64-msvc@4.60.4": { + "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", + "os": ["win32"], + "cpu": ["x64"] + }, "@sinclair/typebox@0.34.48": { "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==" }, + "@standard-schema/spec@1.1.0": { + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==" + }, + "@types/chai@5.2.3": { + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dependencies": [ + "@types/deep-eql", + "assertion-error" + ] + }, + "@types/deep-eql@4.0.2": { + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==" + }, + "@types/estree@1.0.8": { + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" + }, + "@types/estree@1.0.9": { + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==" + }, + "@vitest/expect@4.1.7": { + "integrity": "sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w==", + "dependencies": [ + "@standard-schema/spec", + "@types/chai", + "@vitest/spy", + "@vitest/utils", + "chai", + "tinyrainbow" + ] + }, + "@vitest/mocker@4.1.7_vite@7.3.3": { + "integrity": "sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA==", + "dependencies": [ + "@vitest/spy", + "estree-walker", + "magic-string", + "vite" + ], + "optionalPeers": [ + "vite" + ] + }, + "@vitest/pretty-format@4.1.7": { + "integrity": "sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw==", + "dependencies": [ + "tinyrainbow" + ] + }, + "@vitest/runner@4.1.7": { + "integrity": "sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw==", + "dependencies": [ + "@vitest/utils", + "pathe" + ] + }, + "@vitest/snapshot@4.1.7": { + "integrity": "sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw==", + "dependencies": [ + "@vitest/pretty-format", + "@vitest/utils", + "magic-string", + "pathe" + ] + }, + "@vitest/spy@4.1.7": { + "integrity": "sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q==" + }, + "@vitest/utils@4.1.7": { + "integrity": "sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw==", + "dependencies": [ + "@vitest/pretty-format", + "convert-source-map", + "tinyrainbow" + ] + }, + "agent-base@6.0.2": { + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": [ + "debug" + ] + }, + "assertion-error@2.0.1": { + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==" + }, + "asynckit@0.4.0": { + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "axios@1.16.1": { + "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", + "dependencies": [ + "follow-redirects", + "form-data", + "https-proxy-agent", + "proxy-from-env" + ] + }, + "call-bind-apply-helpers@1.0.2": { + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": [ + "es-errors", + "function-bind" + ] + }, + "chai@6.2.2": { + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==" + }, + "combined-stream@1.0.8": { + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": [ + "delayed-stream" + ] + }, + "convert-source-map@2.0.0": { + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "debug@4.4.3": { + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dependencies": [ + "ms" + ] + }, + "delayed-stream@1.0.0": { + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "dunder-proto@1.0.1": { + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": [ + "call-bind-apply-helpers", + "es-errors", + "gopd" + ] + }, "effection@4.0.2": { "integrity": "sha512-O8WMGP10nPuJDwbNGILcaCNWS+CvDYjcdsUSD79nWZ+WtUQ8h1MEV7JJwCSZCSeKx8+TdEaZ/8r6qPTR2o/o8w==" }, + "es-define-property@1.0.1": { + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + }, + "es-errors@1.3.0": { + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-module-lexer@2.1.0": { + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==" + }, + "es-object-atoms@1.1.2": { + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dependencies": [ + "es-errors" + ] + }, + "es-set-tostringtag@2.1.0": { + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": [ + "es-errors", + "get-intrinsic", + "has-tostringtag", + "hasown" + ] + }, + "esbuild@0.27.7": { + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "optionalDependencies": [ + "@esbuild/aix-ppc64", + "@esbuild/android-arm", + "@esbuild/android-arm64", + "@esbuild/android-x64", + "@esbuild/darwin-arm64", + "@esbuild/darwin-x64", + "@esbuild/freebsd-arm64", + "@esbuild/freebsd-x64", + "@esbuild/linux-arm", + "@esbuild/linux-arm64", + "@esbuild/linux-ia32", + "@esbuild/linux-loong64", + "@esbuild/linux-mips64el", + "@esbuild/linux-ppc64", + "@esbuild/linux-riscv64", + "@esbuild/linux-s390x", + "@esbuild/linux-x64", + "@esbuild/netbsd-arm64", + "@esbuild/netbsd-x64", + "@esbuild/openbsd-arm64", + "@esbuild/openbsd-x64", + "@esbuild/openharmony-arm64", + "@esbuild/sunos-x64", + "@esbuild/win32-arm64", + "@esbuild/win32-ia32", + "@esbuild/win32-x64" + ], + "scripts": true, + "bin": true + }, + "estree-walker@3.0.3": { + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": [ + "@types/estree@1.0.9" + ] + }, + "expect-type@1.3.0": { + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==" + }, + "fdir@6.5.0_picomatch@4.0.4": { + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dependencies": [ + "picomatch" + ], + "optionalPeers": [ + "picomatch" + ] + }, + "find-up@6.3.0": { + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dependencies": [ + "locate-path", + "path-exists" + ] + }, + "follow-redirects@1.16.0": { + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==" + }, + "form-data@4.0.5": { + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dependencies": [ + "asynckit", + "combined-stream", + "es-set-tostringtag", + "hasown", + "mime-types" + ] + }, + "fsevents@2.3.3": { + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "os": ["darwin"], + "scripts": true + }, + "function-bind@1.1.2": { + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "get-intrinsic@1.3.0": { + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": [ + "call-bind-apply-helpers", + "es-define-property", + "es-errors", + "es-object-atoms", + "function-bind", + "get-proto", + "gopd", + "has-symbols", + "hasown", + "math-intrinsics" + ] + }, + "get-proto@1.0.1": { + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": [ + "dunder-proto", + "es-object-atoms" + ] + }, + "gopd@1.2.0": { + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + }, + "has-symbols@1.1.0": { + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + }, + "has-tostringtag@1.0.2": { + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": [ + "has-symbols" + ] + }, + "hasown@2.0.3": { + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dependencies": [ + "function-bind" + ] + }, + "https-proxy-agent@5.0.1": { + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": [ + "agent-base", + "debug" + ] + }, + "locate-path@7.2.0": { + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dependencies": [ + "p-locate" + ] + }, + "magic-string@0.30.21": { + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dependencies": [ + "@jridgewell/sourcemap-codec" + ] + }, + "math-intrinsics@1.1.0": { + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, + "mime-db@1.52.0": { + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types@2.1.35": { + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": [ + "mime-db" + ] + }, + "ms@2.1.3": { + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "nanoid@3.3.12": { + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "bin": true + }, + "node-gyp-build@4.8.4": { + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "bin": true + }, + "obug@2.1.1": { + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==" + }, + "p-limit@4.0.0": { + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dependencies": [ + "yocto-queue" + ] + }, + "p-locate@6.0.0": { + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dependencies": [ + "p-limit" + ] + }, + "path-exists@5.0.0": { + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==" + }, + "pathe@2.0.3": { + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "picocolors@1.1.1": { + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "picomatch@4.0.4": { + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==" + }, + "postcss@8.5.15": { + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dependencies": [ + "nanoid", + "picocolors", + "source-map-js" + ] + }, + "proxy-from-env@2.1.0": { + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==" + }, + "rollup@4.60.4": { + "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", + "dependencies": [ + "@types/estree@1.0.8" + ], + "optionalDependencies": [ + "@rollup/rollup-android-arm-eabi", + "@rollup/rollup-android-arm64", + "@rollup/rollup-darwin-arm64", + "@rollup/rollup-darwin-x64", + "@rollup/rollup-freebsd-arm64", + "@rollup/rollup-freebsd-x64", + "@rollup/rollup-linux-arm-gnueabihf", + "@rollup/rollup-linux-arm-musleabihf", + "@rollup/rollup-linux-arm64-gnu", + "@rollup/rollup-linux-arm64-musl", + "@rollup/rollup-linux-loong64-gnu", + "@rollup/rollup-linux-loong64-musl", + "@rollup/rollup-linux-ppc64-gnu", + "@rollup/rollup-linux-ppc64-musl", + "@rollup/rollup-linux-riscv64-gnu", + "@rollup/rollup-linux-riscv64-musl", + "@rollup/rollup-linux-s390x-gnu", + "@rollup/rollup-linux-x64-gnu", + "@rollup/rollup-linux-x64-musl", + "@rollup/rollup-openbsd-x64", + "@rollup/rollup-openharmony-arm64", + "@rollup/rollup-win32-arm64-msvc", + "@rollup/rollup-win32-ia32-msvc", + "@rollup/rollup-win32-x64-gnu", + "@rollup/rollup-win32-x64-msvc", + "fsevents" + ], + "bin": true + }, + "siginfo@2.0.0": { + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" + }, + "source-map-js@1.2.1": { + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" + }, + "stackback@0.0.2": { + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" + }, + "std-env@4.1.0": { + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==" + }, + "tinybench@2.9.0": { + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==" + }, + "tinyexec@1.2.2": { + "integrity": "sha512-M/Q0B2cp4K7kynaT/vnED1j8TlLY+Pp7C6Wl2bl/7u/F0mUVwdyOpwomQb8JpYLitHUssAJRmLZdMCGsrx7i+g==" + }, + "tinyglobby@0.2.16": { + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": [ + "fdir", + "picomatch" + ] + }, + "tinyrainbow@3.1.0": { + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==" + }, "valrs@0.1.0": { "integrity": "sha512-BqVkjx3qhsRLHerblLDoqEx0OEx7ms0DB6LPv40oWkMfFKUVKrqVuklaGdrPrHyubC5hSHYfEtUiQXrCkC6xHQ==" + }, + "vite@7.3.3": { + "integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==", + "dependencies": [ + "esbuild", + "fdir", + "picomatch", + "postcss", + "rollup", + "tinyglobby" + ], + "optionalDependencies": [ + "fsevents" + ], + "bin": true + }, + "vitest@4.1.7_vite@7.3.3": { + "integrity": "sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA==", + "dependencies": [ + "@vitest/expect", + "@vitest/mocker", + "@vitest/pretty-format", + "@vitest/runner", + "@vitest/snapshot", + "@vitest/spy", + "@vitest/utils", + "es-module-lexer", + "expect-type", + "magic-string", + "obug", + "pathe", + "picomatch", + "std-env", + "tinybench", + "tinyexec", + "tinyglobby", + "tinyrainbow", + "vite", + "why-is-node-running" + ], + "bin": true + }, + "why-is-node-running@2.3.0": { + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dependencies": [ + "siginfo", + "stackback" + ], + "bin": true + }, + "yocto-queue@1.2.2": { + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==" } }, "workspace": { @@ -127,6 +875,12 @@ "jsr:@std/testing@1", "npm:@sinclair/typebox@0.34", "npm:effection@^4.0.2" - ] + ], + "packageJson": { + "dependencies": [ + "npm:@codspeed/vitest-plugin@^5.4.0", + "npm:vitest@^4.1.7" + ] + } } } diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8f2d902 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1981 @@ +{ + "name": "clayterm", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@codspeed/vitest-plugin": "^5.4.0", + "vitest": "^4.1.7" + } + }, + "node_modules/@codspeed/core": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@codspeed/core/-/core-5.4.0.tgz", + "integrity": "sha512-SwGjXDixN/zX1awBR95LzS0KxIs931qwf7Hbk7BRWv1jAdlMYf9o9GlSnWER4zGBHz941BvzFQJ1O2RIofW3cg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "axios": "^1.4.0", + "find-up": "^6.3.0", + "form-data": "^4.0.4", + "node-gyp-build": "^4.6.0" + } + }, + "node_modules/@codspeed/vitest-plugin": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@codspeed/vitest-plugin/-/vitest-plugin-5.4.0.tgz", + "integrity": "sha512-Xa9HaZHUjYXn1T39bTipV5hmguk1vIuDZs3Gc5OYA8X4ohftYbKfyoFtBqVFfB/ii/p1ihuwt+tltraKMcRDsA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@codspeed/core": "^5.4.0" + }, + "peerDependencies": { + "tinybench": ">=2.9.0", + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "vitest": "^3.2 || ^4" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", + "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", + "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", + "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", + "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", + "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", + "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", + "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", + "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", + "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", + "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", + "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", + "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", + "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", + "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", + "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", + "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", + "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", + "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", + "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", + "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", + "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", + "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", + "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", + "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", + "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/expect": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.7.tgz", + "integrity": "sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.7", + "@vitest/utils": "4.1.7", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.7.tgz", + "integrity": "sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.7", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.7.tgz", + "integrity": "sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.7.tgz", + "integrity": "sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.7", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.7.tgz", + "integrity": "sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.7", + "@vitest/utils": "4.1.7", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.7.tgz", + "integrity": "sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.7.tgz", + "integrity": "sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.7", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", + "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "dev": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/rollup": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", + "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.4", + "@rollup/rollup-android-arm64": "4.60.4", + "@rollup/rollup-darwin-arm64": "4.60.4", + "@rollup/rollup-darwin-x64": "4.60.4", + "@rollup/rollup-freebsd-arm64": "4.60.4", + "@rollup/rollup-freebsd-x64": "4.60.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", + "@rollup/rollup-linux-arm-musleabihf": "4.60.4", + "@rollup/rollup-linux-arm64-gnu": "4.60.4", + "@rollup/rollup-linux-arm64-musl": "4.60.4", + "@rollup/rollup-linux-loong64-gnu": "4.60.4", + "@rollup/rollup-linux-loong64-musl": "4.60.4", + "@rollup/rollup-linux-ppc64-gnu": "4.60.4", + "@rollup/rollup-linux-ppc64-musl": "4.60.4", + "@rollup/rollup-linux-riscv64-gnu": "4.60.4", + "@rollup/rollup-linux-riscv64-musl": "4.60.4", + "@rollup/rollup-linux-s390x-gnu": "4.60.4", + "@rollup/rollup-linux-x64-gnu": "4.60.4", + "@rollup/rollup-linux-x64-musl": "4.60.4", + "@rollup/rollup-openbsd-x64": "4.60.4", + "@rollup/rollup-openharmony-arm64": "4.60.4", + "@rollup/rollup-win32-arm64-msvc": "4.60.4", + "@rollup/rollup-win32-ia32-msvc": "4.60.4", + "@rollup/rollup-win32-x64-gnu": "4.60.4", + "@rollup/rollup-win32-x64-msvc": "4.60.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.0.2.tgz", + "integrity": "sha512-FlHoQpcFvCzeXK5kVPvV7IVgW/hs/B36QWTz876iSdeJguBDfdTSRQmYmaHX+fQNt4hp+gEFB2XXw+8hT4/y8A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/tinyexec": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.2.tgz", + "integrity": "sha512-M/Q0B2cp4K7kynaT/vnED1j8TlLY+Pp7C6Wl2bl/7u/F0mUVwdyOpwomQb8JpYLitHUssAJRmLZdMCGsrx7i+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vite": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.3.tgz", + "integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.7.tgz", + "integrity": "sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.7", + "@vitest/mocker": "4.1.7", + "@vitest/pretty-format": "4.1.7", + "@vitest/runner": "4.1.7", + "@vitest/snapshot": "4.1.7", + "@vitest/spy": "4.1.7", + "@vitest/utils": "4.1.7", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.7", + "@vitest/browser-preview": "4.1.7", + "@vitest/browser-webdriverio": "4.1.7", + "@vitest/coverage-istanbul": "4.1.7", + "@vitest/coverage-v8": "4.1.7", + "@vitest/ui": "4.1.7", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/vitest/node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..4feb5fd --- /dev/null +++ b/package.json @@ -0,0 +1,8 @@ +{ + "private": true, + "type": "module", + "devDependencies": { + "@codspeed/vitest-plugin": "^5.4.0", + "vitest": "^4.1.7" + } +} diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..c7fe4c3 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "vitest/config"; +import codspeed from "@codspeed/vitest-plugin"; + +export default defineConfig({ + plugins: [codspeed()], + test: { + benchmark: { + include: ["bench/**/*.bench.ts"], + }, + }, +}); From 4596610c064c5195216d2f47e07d5b9e0b7506b0 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Sun, 24 May 2026 14:13:58 -0400 Subject: [PATCH 35/47] =?UTF-8?q?=F0=9F=94=A8=20use=20deno?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflows/{codspeed.yml => benchmark.yml} | 10 +- deno.json | 11 +- deno.lock | 19 +- package-lock.json | 1981 ----------------- package.json | 8 - 5 files changed, 18 insertions(+), 2011 deletions(-) rename .github/workflows/{codspeed.yml => benchmark.yml} (87%) delete mode 100644 package-lock.json delete mode 100644 package.json diff --git a/.github/workflows/codspeed.yml b/.github/workflows/benchmark.yml similarity index 87% rename from .github/workflows/codspeed.yml rename to .github/workflows/benchmark.yml index 4cc2b40..af545bc 100644 --- a/.github/workflows/codspeed.yml +++ b/.github/workflows/benchmark.yml @@ -1,10 +1,10 @@ -name: CodSpeed +name: Benchmark on: push: - branches: main + branches: [main] pull_request: - branches: main + branches: [main] # `workflow_dispatch` allows CodSpeed to trigger backtest # performance analysis in order to generate initial data. workflow_dispatch: @@ -38,10 +38,10 @@ jobs: run: make - name: Install dependencies - run: npm install + run: deno install - name: Run benchmarks uses: CodSpeedHQ/action@v4 with: mode: simulation - run: npx vitest bench --run + run: deno task bench diff --git a/deno.json b/deno.json index ab92df2..67afee6 100644 --- a/deno.json +++ b/deno.json @@ -7,7 +7,8 @@ "fmt:check": "deno fmt --check && clang-format --dry-run --Werror src/*.c src/*.h", "build:npm": "deno run -A tasks/build-npm.ts", "build:jsr": "deno run -A tasks/build-jsr.ts", - "demo": "deno run demo/keyboard.ts" + "demo": "deno run demo/keyboard.ts", + "bench": "deno run -A npm:vitest bench --run" }, "imports": { "@std/testing": "jsr:@std/testing@1", @@ -15,7 +16,9 @@ "@sinclair/typebox": "npm:@sinclair/typebox@^0.34", "dnt": "jsr:@deno/dnt@0.42.3", "effection": "npm:effection@^4.0.2", - "@std/encoding": "jsr:@std/encoding@1" + "@std/encoding": "jsr:@std/encoding@1", + "@codspeed/vitest-plugin": "npm:@codspeed/vitest-plugin@^5.4.0", + "vitest": "npm:vitest@^4.1.7" }, "exports": { ".": "./mod.ts", @@ -26,11 +29,11 @@ "exclude": ["!wasm.ts"] }, "fmt": { - "exclude": ["clay", "build", "bench", "node_modules"] + "exclude": ["clay", "build"] }, "lint": { "rules": { "exclude": ["prefer-const"] }, - "exclude": ["clay", "build", "bench", "node_modules"], + "exclude": ["clay", "build"], "plugins": ["lint/prefer-let.ts"] } } diff --git a/deno.lock b/deno.lock index bfd82c0..2b1fa4b 100644 --- a/deno.lock +++ b/deno.lock @@ -406,9 +406,6 @@ "@types/estree@1.0.8": { "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" }, - "@types/estree@1.0.9": { - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==" - }, "@vitest/expect@4.1.7": { "integrity": "sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w==", "dependencies": [ @@ -585,7 +582,7 @@ "estree-walker@3.0.3": { "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dependencies": [ - "@types/estree@1.0.9" + "@types/estree" ] }, "expect-type@1.3.0": { @@ -751,7 +748,7 @@ "rollup@4.60.4": { "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", "dependencies": [ - "@types/estree@1.0.8" + "@types/estree" ], "optionalDependencies": [ "@rollup/rollup-android-arm-eabi", @@ -873,14 +870,10 @@ "jsr:@std/encoding@1", "jsr:@std/expect@1", "jsr:@std/testing@1", + "npm:@codspeed/vitest-plugin@^5.4.0", "npm:@sinclair/typebox@0.34", - "npm:effection@^4.0.2" - ], - "packageJson": { - "dependencies": [ - "npm:@codspeed/vitest-plugin@^5.4.0", - "npm:vitest@^4.1.7" - ] - } + "npm:effection@^4.0.2", + "npm:vitest@^4.1.7" + ] } } diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 8f2d902..0000000 --- a/package-lock.json +++ /dev/null @@ -1,1981 +0,0 @@ -{ - "name": "clayterm", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "devDependencies": { - "@codspeed/vitest-plugin": "^5.4.0", - "vitest": "^4.1.7" - } - }, - "node_modules/@codspeed/core": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@codspeed/core/-/core-5.4.0.tgz", - "integrity": "sha512-SwGjXDixN/zX1awBR95LzS0KxIs931qwf7Hbk7BRWv1jAdlMYf9o9GlSnWER4zGBHz941BvzFQJ1O2RIofW3cg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "axios": "^1.4.0", - "find-up": "^6.3.0", - "form-data": "^4.0.4", - "node-gyp-build": "^4.6.0" - } - }, - "node_modules/@codspeed/vitest-plugin": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@codspeed/vitest-plugin/-/vitest-plugin-5.4.0.tgz", - "integrity": "sha512-Xa9HaZHUjYXn1T39bTipV5hmguk1vIuDZs3Gc5OYA8X4ohftYbKfyoFtBqVFfB/ii/p1ihuwt+tltraKMcRDsA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@codspeed/core": "^5.4.0" - }, - "peerDependencies": { - "tinybench": ">=2.9.0", - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "vitest": "^3.2 || ^4" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", - "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", - "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", - "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", - "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", - "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", - "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", - "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", - "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", - "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", - "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", - "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", - "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", - "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", - "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", - "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", - "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", - "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", - "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", - "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", - "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", - "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", - "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", - "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", - "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", - "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitest/expect": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.7.tgz", - "integrity": "sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.7", - "@vitest/utils": "4.1.7", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.7.tgz", - "integrity": "sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.1.7", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.7.tgz", - "integrity": "sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.7.tgz", - "integrity": "sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.1.7", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.7.tgz", - "integrity": "sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.7", - "@vitest/utils": "4.1.7", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.7.tgz", - "integrity": "sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.7.tgz", - "integrity": "sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.7", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", - "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", - "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "dev": true, - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT" - }, - "node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/rollup": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", - "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.4", - "@rollup/rollup-android-arm64": "4.60.4", - "@rollup/rollup-darwin-arm64": "4.60.4", - "@rollup/rollup-darwin-x64": "4.60.4", - "@rollup/rollup-freebsd-arm64": "4.60.4", - "@rollup/rollup-freebsd-x64": "4.60.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", - "@rollup/rollup-linux-arm-musleabihf": "4.60.4", - "@rollup/rollup-linux-arm64-gnu": "4.60.4", - "@rollup/rollup-linux-arm64-musl": "4.60.4", - "@rollup/rollup-linux-loong64-gnu": "4.60.4", - "@rollup/rollup-linux-loong64-musl": "4.60.4", - "@rollup/rollup-linux-ppc64-gnu": "4.60.4", - "@rollup/rollup-linux-ppc64-musl": "4.60.4", - "@rollup/rollup-linux-riscv64-gnu": "4.60.4", - "@rollup/rollup-linux-riscv64-musl": "4.60.4", - "@rollup/rollup-linux-s390x-gnu": "4.60.4", - "@rollup/rollup-linux-x64-gnu": "4.60.4", - "@rollup/rollup-linux-x64-musl": "4.60.4", - "@rollup/rollup-openbsd-x64": "4.60.4", - "@rollup/rollup-openharmony-arm64": "4.60.4", - "@rollup/rollup-win32-arm64-msvc": "4.60.4", - "@rollup/rollup-win32-ia32-msvc": "4.60.4", - "@rollup/rollup-win32-x64-gnu": "4.60.4", - "@rollup/rollup-win32-x64-msvc": "4.60.4", - "fsevents": "~2.3.2" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/std-env": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", - "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.0.2.tgz", - "integrity": "sha512-FlHoQpcFvCzeXK5kVPvV7IVgW/hs/B36QWTz876iSdeJguBDfdTSRQmYmaHX+fQNt4hp+gEFB2XXw+8hT4/y8A==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/tinyexec": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.2.tgz", - "integrity": "sha512-M/Q0B2cp4K7kynaT/vnED1j8TlLY+Pp7C6Wl2bl/7u/F0mUVwdyOpwomQb8JpYLitHUssAJRmLZdMCGsrx7i+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vite": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.3.tgz", - "integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.7.tgz", - "integrity": "sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.1.7", - "@vitest/mocker": "4.1.7", - "@vitest/pretty-format": "4.1.7", - "@vitest/runner": "4.1.7", - "@vitest/snapshot": "4.1.7", - "@vitest/spy": "4.1.7", - "@vitest/utils": "4.1.7", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.7", - "@vitest/browser-preview": "4.1.7", - "@vitest/browser-webdriverio": "4.1.7", - "@vitest/coverage-istanbul": "4.1.7", - "@vitest/coverage-v8": "4.1.7", - "@vitest/ui": "4.1.7", - "happy-dom": "*", - "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/coverage-istanbul": { - "optional": true - }, - "@vitest/coverage-v8": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "vite": { - "optional": false - } - } - }, - "node_modules/vitest/node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 4feb5fd..0000000 --- a/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "private": true, - "type": "module", - "devDependencies": { - "@codspeed/vitest-plugin": "^5.4.0", - "vitest": "^4.1.7" - } -} From 64170a50d39c704de51321cff2bac3d8386077df Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Sun, 24 May 2026 14:15:34 -0400 Subject: [PATCH 36/47] =?UTF-8?q?=F0=9F=A7=BC=20deno=20fmt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bench/input.bench.ts | 2 +- bench/ops.bench.ts | 2 +- bench/render.bench.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bench/input.bench.ts b/bench/input.bench.ts index eba4c6a..122bdce 100644 --- a/bench/input.bench.ts +++ b/bench/input.bench.ts @@ -1,4 +1,4 @@ -import { describe, bench, beforeAll } from "vitest"; +import { beforeAll, bench, describe } from "vitest"; import { createInput, type Input } from "../input.ts"; function bytes(...values: number[]): Uint8Array { diff --git a/bench/ops.bench.ts b/bench/ops.bench.ts index 22949e6..1278950 100644 --- a/bench/ops.bench.ts +++ b/bench/ops.bench.ts @@ -1,4 +1,4 @@ -import { describe, bench } from "vitest"; +import { bench, describe } from "vitest"; import { close, fixed, grow, open, pack, rgba, text } from "../ops.ts"; import type { Op } from "../ops.ts"; diff --git a/bench/render.bench.ts b/bench/render.bench.ts index c075ba0..2ec4dfc 100644 --- a/bench/render.bench.ts +++ b/bench/render.bench.ts @@ -1,4 +1,4 @@ -import { describe, bench, beforeAll } from "vitest"; +import { beforeAll, bench, describe } from "vitest"; import { createTerm, type Term } from "../term.ts"; import { close, fixed, grow, open, rgba, text } from "../ops.ts"; import type { Op } from "../ops.ts"; From 7badc6ce03285b53d4e6a31dd8e880bd6e1c6c9a Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Sun, 24 May 2026 14:26:14 -0400 Subject: [PATCH 37/47] =?UTF-8?q?=E2=9A=99=EF=B8=8F=20vitest=20->=20tinybe?= =?UTF-8?q?nch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bench/input.bench.ts | 78 +++--- bench/mod.ts | 3 + bench/ops.bench.ts | 201 +++++++-------- bench/render.bench.ts | 290 +++++++++++----------- deno.json | 6 +- deno.lock | 561 +----------------------------------------- 6 files changed, 294 insertions(+), 845 deletions(-) create mode 100644 bench/mod.ts diff --git a/bench/input.bench.ts b/bench/input.bench.ts index 122bdce..8e2c96b 100644 --- a/bench/input.bench.ts +++ b/bench/input.bench.ts @@ -1,5 +1,6 @@ -import { beforeAll, bench, describe } from "vitest"; -import { createInput, type Input } from "../input.ts"; +import { Bench } from "tinybench"; +import { withCodSpeed } from "@codspeed/tinybench-plugin"; +import { createInput } from "../input.ts"; function bytes(...values: number[]): Uint8Array { return new Uint8Array(values); @@ -9,57 +10,46 @@ function str(s: string): Uint8Array { return new TextEncoder().encode(s); } -describe("input parsing", () => { - let input: Input; +let input = await createInput({ escLatency: 25 }); - beforeAll(async () => { - input = await createInput({ escLatency: 25 }); - }); +let longBurst = new Uint8Array(200); +for (let i = 0; i < 200; i++) { + longBurst[i] = 0x61 + (i % 26); +} - bench("printable ASCII (single char)", () => { - input.scan(bytes(0x61)); - }); +let bench = withCodSpeed(new Bench()); - bench("printable ASCII (short string)", () => { +bench + .add("printable ASCII (single char)", () => { + input.scan(bytes(0x61)); + }) + .add("printable ASCII (short string)", () => { input.scan(str("hello world")); - }); - - bench("arrow key (CSI sequence)", () => { + }) + .add("arrow key (CSI sequence)", () => { input.scan(bytes(0x1b, 0x5b, 0x41)); - }); - - bench("modifier combo (Ctrl+Shift+Arrow)", () => { + }) + .add("modifier combo (Ctrl+Shift+Arrow)", () => { input.scan(bytes(0x1b, 0x5b, 0x31, 0x3b, 0x38, 0x41)); - }); - - bench("SGR mouse press", () => { + }) + .add("SGR mouse press", () => { input.scan(str("\x1b[<0;35;12M")); - }); - - bench("multi-event burst (arrows + text)", () => { - input.scan( - bytes(0x1b, 0x5b, 0x41, 0x1b, 0x5b, 0x42, 0x68, 0x69), - ); - }); - - bench("UTF-8 3-byte character", () => { + }) + .add("multi-event burst (arrows + text)", () => { + input.scan(bytes(0x1b, 0x5b, 0x41, 0x1b, 0x5b, 0x42, 0x68, 0x69)); + }) + .add("UTF-8 3-byte character", () => { input.scan(bytes(0xe4, 0xb8, 0xad)); - }); - - bench("UTF-8 4-byte emoji", () => { + }) + .add("UTF-8 4-byte emoji", () => { input.scan(bytes(0xf0, 0x9f, 0x8e, 0x89)); - }); - - bench("Kitty protocol (CSI u with modifiers)", () => { + }) + .add("Kitty protocol (CSI u with modifiers)", () => { input.scan(str("\x1b[97;3u")); - }); - - let longBurst = new Uint8Array(200); - for (let i = 0; i < 200; i++) { - longBurst[i] = 0x61 + (i % 26); - } - - bench("long input burst (200 bytes)", () => { + }) + .add("long input burst (200 bytes)", () => { input.scan(longBurst); }); -}); + +await bench.run(); +console.table(bench.table()); diff --git a/bench/mod.ts b/bench/mod.ts new file mode 100644 index 0000000..ca9de34 --- /dev/null +++ b/bench/mod.ts @@ -0,0 +1,3 @@ +import "./input.bench.ts"; +import "./render.bench.ts"; +import "./ops.bench.ts"; diff --git a/bench/ops.bench.ts b/bench/ops.bench.ts index 1278950..3019792 100644 --- a/bench/ops.bench.ts +++ b/bench/ops.bench.ts @@ -1,4 +1,5 @@ -import { bench, describe } from "vitest"; +import { Bench } from "tinybench"; +import { withCodSpeed } from "@codspeed/tinybench-plugin"; import { close, fixed, grow, open, pack, rgba, text } from "../ops.ts"; import type { Op } from "../ops.ts"; @@ -6,116 +7,118 @@ function makeBuf(size: number): ArrayBuffer { return new ArrayBuffer(size); } -describe("pack", () => { - let simpleOps: Op[] = [ - open("root", { - layout: { width: grow(), height: grow(), direction: "ttb" }, - }), - text("Hello, World!"), - close(), - ]; +let simpleOps: Op[] = [ + open("root", { + layout: { width: grow(), height: grow(), direction: "ttb" }, + }), + text("Hello, World!"), + close(), +]; - bench("simple tree (root + text)", () => { - let buf = makeBuf(4096); - pack(simpleOps, buf, 0); - }); +let complexOps: Op[] = [ + open("root", { + layout: { width: grow(), height: grow(), direction: "ttb" }, + }), + open("header", { + layout: { + width: grow(), + height: fixed(3), + padding: { left: 1, right: 1 }, + direction: "ltr", + }, + bg: rgba(30, 30, 40), + border: { + color: rgba(100, 100, 120), + bottom: 1, + }, + }), + text("Title", { color: rgba(255, 255, 255), fontSize: 1 }), + close(), + open("body", { + layout: { + width: grow(), + height: grow(), + direction: "ltr", + gap: 1, + }, + }), + open("sidebar", { + layout: { + width: fixed(20), + height: grow(), + direction: "ttb", + padding: { left: 1, right: 1, top: 1 }, + }, + bg: rgba(25, 25, 35), + border: { + color: rgba(60, 60, 80), + right: 1, + }, + }), + text("Menu Item 1"), + text("Menu Item 2"), + text("Menu Item 3"), + close(), + open("main", { + layout: { + width: grow(), + height: grow(), + direction: "ttb", + padding: { left: 2, top: 1 }, + }, + }), + text("Main content area with longer text to exercise the encoder"), + close(), + close(), + open("footer", { + layout: { + width: grow(), + height: fixed(1), + padding: { left: 1 }, + direction: "ltr", + }, + bg: rgba(30, 30, 40), + }), + text("Status: OK"), + close(), + close(), +]; - let complexOps: Op[] = [ - open("root", { - layout: { width: grow(), height: grow(), direction: "ttb" }, - }), - open("header", { - layout: { - width: grow(), - height: fixed(3), - padding: { left: 1, right: 1 }, - direction: "ltr", - }, - bg: rgba(30, 30, 40), - border: { - color: rgba(100, 100, 120), - bottom: 1, - }, - }), - text("Title", { color: rgba(255, 255, 255), fontSize: 1 }), - close(), - open("body", { - layout: { - width: grow(), - height: grow(), - direction: "ltr", - gap: 1, - }, - }), - open("sidebar", { - layout: { - width: fixed(20), - height: grow(), - direction: "ttb", - padding: { left: 1, right: 1, top: 1 }, - }, - bg: rgba(25, 25, 35), - border: { - color: rgba(60, 60, 80), - right: 1, - }, - }), - text("Menu Item 1"), - text("Menu Item 2"), - text("Menu Item 3"), - close(), - open("main", { - layout: { - width: grow(), - height: grow(), - direction: "ttb", - padding: { left: 2, top: 1 }, - }, - }), - text("Main content area with longer text to exercise the encoder"), - close(), - close(), - open("footer", { +let listOps: Op[] = [ + open("root", { + layout: { width: grow(), height: grow(), direction: "ttb" }, + }), + ...Array.from({ length: 50 }, (_, i) => [ + open(`item-${i}`, { layout: { width: grow(), height: fixed(1), - padding: { left: 1 }, + padding: { left: 2 }, direction: "ltr", }, - bg: rgba(30, 30, 40), + bg: i % 2 === 0 ? rgba(30, 30, 40) : rgba(35, 35, 45), }), - text("Status: OK"), - close(), + text(`List item ${i}: some description text`), close(), - ]; + ]).flat(), + close(), +]; - bench("complex layout (header + sidebar + main + footer)", () => { +let bench = withCodSpeed(new Bench()); + +bench + .add("simple tree (root + text)", () => { + let buf = makeBuf(4096); + pack(simpleOps, buf, 0); + }) + .add("complex layout (header + sidebar + main + footer)", () => { let buf = makeBuf(8192); pack(complexOps, buf, 0); - }); - - let listOps: Op[] = [ - open("root", { - layout: { width: grow(), height: grow(), direction: "ttb" }, - }), - ...Array.from({ length: 50 }, (_, i) => [ - open(`item-${i}`, { - layout: { - width: grow(), - height: fixed(1), - padding: { left: 2 }, - direction: "ltr", - }, - bg: i % 2 === 0 ? rgba(30, 30, 40) : rgba(35, 35, 45), - }), - text(`List item ${i}: some description text`), - close(), - ]).flat(), - close(), - ]; - - bench("large list (50 items)", () => { + }) + .add("large list (50 items)", () => { let buf = makeBuf(32768); pack(listOps, buf, 0); }); -}); + +await bench.run(); +console.table(bench.table()); diff --git a/bench/render.bench.ts b/bench/render.bench.ts index 2ec4dfc..1c3b8c3 100644 --- a/bench/render.bench.ts +++ b/bench/render.bench.ts @@ -1,170 +1,158 @@ -import { beforeAll, bench, describe } from "vitest"; -import { createTerm, type Term } from "../term.ts"; +import { Bench } from "tinybench"; +import { withCodSpeed } from "@codspeed/tinybench-plugin"; +import { createTerm } from "../term.ts"; import { close, fixed, grow, open, rgba, text } from "../ops.ts"; import type { Op } from "../ops.ts"; -describe("render", () => { - let term: Term; +let term = await createTerm({ width: 80, height: 24 }); +let termPtr = await createTerm({ width: 80, height: 24 }); - beforeAll(async () => { - term = await createTerm({ width: 80, height: 24 }); - }); +let helloOps: Op[] = [ + open("root", { + layout: { width: grow(), height: grow(), direction: "ttb" }, + }), + text("Hello, World!"), + close(), +]; - let helloOps: Op[] = [ - open("root", { - layout: { width: grow(), height: grow(), direction: "ttb" }, - }), - text("Hello, World!"), - close(), - ]; +let borderedOps: Op[] = [ + open("root", { + layout: { width: grow(), height: grow(), direction: "ttb" }, + }), + open("box", { + layout: { + width: grow(), + height: grow(), + padding: { left: 1, right: 1, top: 1, bottom: 1 }, + direction: "ttb", + }, + border: { + color: rgba(0, 255, 0), + left: 1, + right: 1, + top: 1, + bottom: 1, + }, + cornerRadius: { tl: 1, tr: 1, bl: 1, br: 1 }, + }), + text("Bordered content"), + close(), + close(), +]; - bench("simple text", () => { - term.render(helloOps); - }); - - let borderedOps: Op[] = [ - open("root", { - layout: { width: grow(), height: grow(), direction: "ttb" }, - }), - open("box", { +let dashboardOps: Op[] = [ + open("root", { + layout: { width: grow(), height: grow(), direction: "ttb" }, + }), + open("header", { + layout: { + width: grow(), + height: fixed(3), + padding: { left: 1 }, + direction: "ltr", + }, + bg: rgba(30, 30, 40), + border: { color: rgba(80, 80, 100), bottom: 1 }, + }), + text("Dashboard", { color: rgba(255, 255, 255) }), + close(), + open("body", { + layout: { width: grow(), height: grow(), direction: "ltr" }, + }), + open("sidebar", { + layout: { + width: fixed(20), + height: grow(), + direction: "ttb", + padding: { left: 1, top: 1 }, + }, + bg: rgba(25, 25, 35), + border: { color: rgba(60, 60, 80), right: 1 }, + }), + text("Nav 1"), + text("Nav 2"), + text("Nav 3"), + text("Nav 4"), + close(), + open("main", { + layout: { + width: grow(), + height: grow(), + direction: "ttb", + padding: { left: 2, top: 1 }, + }, + }), + ...Array.from({ length: 10 }, (_, i) => [ + open(`row-${i}`, { layout: { width: grow(), - height: grow(), - padding: { left: 1, right: 1, top: 1, bottom: 1 }, - direction: "ttb", - }, - border: { - color: rgba(0, 255, 0), - left: 1, - right: 1, - top: 1, - bottom: 1, + height: fixed(1), + direction: "ltr", }, - cornerRadius: { tl: 1, tr: 1, bl: 1, br: 1 }, + bg: i % 2 === 0 ? rgba(35, 35, 45) : undefined, }), - text("Bordered content"), - close(), + text(`Row ${i}: data value ${i * 42}`), close(), - ]; + ]).flat(), + close(), + close(), + open("footer", { + layout: { + width: grow(), + height: fixed(1), + padding: { left: 1 }, + }, + bg: rgba(30, 30, 40), + }), + text("Ready"), + close(), + close(), +]; - bench("bordered box with corner radius", () => { - term.render(borderedOps); - }); +let uiOps: Op[] = [ + open("root", { + layout: { width: grow(), height: grow(), direction: "ttb" }, + }), + open("button", { + layout: { + width: fixed(20), + height: fixed(3), + padding: { left: 1, right: 1 }, + }, + bg: rgba(50, 50, 200), + border: { + color: rgba(100, 100, 255), + left: 1, + right: 1, + top: 1, + bottom: 1, + }, + cornerRadius: { tl: 1, tr: 1, bl: 1, br: 1 }, + }), + text("Click me"), + close(), + close(), +]; - let dashboardOps: Op[] = [ - open("root", { - layout: { width: grow(), height: grow(), direction: "ttb" }, - }), - open("header", { - layout: { - width: grow(), - height: fixed(3), - padding: { left: 1 }, - direction: "ltr", - }, - bg: rgba(30, 30, 40), - border: { color: rgba(80, 80, 100), bottom: 1 }, - }), - text("Dashboard", { color: rgba(255, 255, 255) }), - close(), - open("body", { - layout: { width: grow(), height: grow(), direction: "ltr" }, - }), - open("sidebar", { - layout: { - width: fixed(20), - height: grow(), - direction: "ttb", - padding: { left: 1, top: 1 }, - }, - bg: rgba(25, 25, 35), - border: { color: rgba(60, 60, 80), right: 1 }, - }), - text("Nav 1"), - text("Nav 2"), - text("Nav 3"), - text("Nav 4"), - close(), - open("main", { - layout: { - width: grow(), - height: grow(), - direction: "ttb", - padding: { left: 2, top: 1 }, - }, - }), - ...Array.from({ length: 10 }, (_, i) => [ - open(`row-${i}`, { - layout: { - width: grow(), - height: fixed(1), - direction: "ltr", - }, - bg: i % 2 === 0 ? rgba(35, 35, 45) : undefined, - }), - text(`Row ${i}: data value ${i * 42}`), - close(), - ]).flat(), - close(), - close(), - open("footer", { - layout: { - width: grow(), - height: fixed(1), - padding: { left: 1 }, - }, - bg: rgba(30, 30, 40), - }), - text("Ready"), - close(), - close(), - ]; +let bench = withCodSpeed(new Bench()); - bench("dashboard layout", () => { +bench + .add("simple text", () => { + term.render(helloOps); + }) + .add("bordered box with corner radius", () => { + term.render(borderedOps); + }) + .add("dashboard layout", () => { term.render(dashboardOps); - }); - - bench("diff render (second frame)", () => { - // First render populates the front buffer + }) + .add("diff render (second frame)", () => { term.render(dashboardOps); - // Second render exercises the diff path term.render(dashboardOps); - }); -}); - -describe("render with pointer", () => { - let term: Term; - - beforeAll(async () => { - term = await createTerm({ width: 80, height: 24 }); + }) + .add("render with pointer hit testing", () => { + termPtr.render(uiOps, { pointer: { x: 10, y: 1, down: false } }); }); - let uiOps: Op[] = [ - open("root", { - layout: { width: grow(), height: grow(), direction: "ttb" }, - }), - open("button", { - layout: { - width: fixed(20), - height: fixed(3), - padding: { left: 1, right: 1 }, - }, - bg: rgba(50, 50, 200), - border: { - color: rgba(100, 100, 255), - left: 1, - right: 1, - top: 1, - bottom: 1, - }, - cornerRadius: { tl: 1, tr: 1, bl: 1, br: 1 }, - }), - text("Click me"), - close(), - close(), - ]; - - bench("render with pointer hit testing", () => { - term.render(uiOps, { pointer: { x: 10, y: 1, down: false } }); - }); -}); +await bench.run(); +console.table(bench.table()); diff --git a/deno.json b/deno.json index 67afee6..5057037 100644 --- a/deno.json +++ b/deno.json @@ -8,7 +8,7 @@ "build:npm": "deno run -A tasks/build-npm.ts", "build:jsr": "deno run -A tasks/build-jsr.ts", "demo": "deno run demo/keyboard.ts", - "bench": "deno run -A npm:vitest bench --run" + "bench": "deno run -A bench/mod.ts" }, "imports": { "@std/testing": "jsr:@std/testing@1", @@ -17,8 +17,8 @@ "dnt": "jsr:@deno/dnt@0.42.3", "effection": "npm:effection@^4.0.2", "@std/encoding": "jsr:@std/encoding@1", - "@codspeed/vitest-plugin": "npm:@codspeed/vitest-plugin@^5.4.0", - "vitest": "npm:vitest@^4.1.7" + "@codspeed/tinybench-plugin": "npm:@codspeed/tinybench-plugin@^5.4.0", + "tinybench": "npm:tinybench@^6.0.2" }, "exports": { ".": "./mod.ts", diff --git a/deno.lock b/deno.lock index 2b1fa4b..b4681a5 100644 --- a/deno.lock +++ b/deno.lock @@ -20,12 +20,12 @@ "jsr:@std/testing@1": "1.0.17", "jsr:@ts-morph/bootstrap@0.27": "0.27.0", "jsr:@ts-morph/common@0.27": "0.27.0", - "npm:@codspeed/vitest-plugin@^5.4.0": "5.4.0_tinybench@2.9.0_vite@7.3.3_vitest@4.1.7__vite@7.3.3", + "npm:@codspeed/tinybench-plugin@^5.4.0": "5.4.0_tinybench@6.0.2", "npm:@sinclair/typebox@*": "0.34.48", "npm:@sinclair/typebox@0.34": "0.34.48", "npm:effection@^4.0.2": "4.0.2", - "npm:valrs@*": "0.1.0", - "npm:vitest@^4.1.7": "4.1.7_vite@7.3.3" + "npm:tinybench@^6.0.2": "6.0.2", + "npm:valrs@*": "0.1.0" }, "jsr": { "@david/code-block-writer@13.0.3": { @@ -120,357 +120,23 @@ "node-gyp-build" ] }, - "@codspeed/vitest-plugin@5.4.0_tinybench@2.9.0_vite@7.3.3_vitest@4.1.7__vite@7.3.3": { - "integrity": "sha512-Xa9HaZHUjYXn1T39bTipV5hmguk1vIuDZs3Gc5OYA8X4ohftYbKfyoFtBqVFfB/ii/p1ihuwt+tltraKMcRDsA==", + "@codspeed/tinybench-plugin@5.4.0_tinybench@6.0.2": { + "integrity": "sha512-jzuFoyyoGxc3Lc+TTl54PnRsgqO3CYbbbnwYSVp/m/4rqvCwSUZChY9EuQJ6uZFbamT3UhWF2N6tDEGShkvsrw==", "dependencies": [ "@codspeed/core", - "tinybench", - "vite", - "vitest" + "stack-trace", + "tinybench" ] }, - "@esbuild/aix-ppc64@0.27.7": { - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", - "os": ["aix"], - "cpu": ["ppc64"] - }, - "@esbuild/android-arm64@0.27.7": { - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", - "os": ["android"], - "cpu": ["arm64"] - }, - "@esbuild/android-arm@0.27.7": { - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", - "os": ["android"], - "cpu": ["arm"] - }, - "@esbuild/android-x64@0.27.7": { - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", - "os": ["android"], - "cpu": ["x64"] - }, - "@esbuild/darwin-arm64@0.27.7": { - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", - "os": ["darwin"], - "cpu": ["arm64"] - }, - "@esbuild/darwin-x64@0.27.7": { - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", - "os": ["darwin"], - "cpu": ["x64"] - }, - "@esbuild/freebsd-arm64@0.27.7": { - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", - "os": ["freebsd"], - "cpu": ["arm64"] - }, - "@esbuild/freebsd-x64@0.27.7": { - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", - "os": ["freebsd"], - "cpu": ["x64"] - }, - "@esbuild/linux-arm64@0.27.7": { - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", - "os": ["linux"], - "cpu": ["arm64"] - }, - "@esbuild/linux-arm@0.27.7": { - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", - "os": ["linux"], - "cpu": ["arm"] - }, - "@esbuild/linux-ia32@0.27.7": { - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", - "os": ["linux"], - "cpu": ["ia32"] - }, - "@esbuild/linux-loong64@0.27.7": { - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", - "os": ["linux"], - "cpu": ["loong64"] - }, - "@esbuild/linux-mips64el@0.27.7": { - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", - "os": ["linux"], - "cpu": ["mips64el"] - }, - "@esbuild/linux-ppc64@0.27.7": { - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", - "os": ["linux"], - "cpu": ["ppc64"] - }, - "@esbuild/linux-riscv64@0.27.7": { - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", - "os": ["linux"], - "cpu": ["riscv64"] - }, - "@esbuild/linux-s390x@0.27.7": { - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", - "os": ["linux"], - "cpu": ["s390x"] - }, - "@esbuild/linux-x64@0.27.7": { - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", - "os": ["linux"], - "cpu": ["x64"] - }, - "@esbuild/netbsd-arm64@0.27.7": { - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", - "os": ["netbsd"], - "cpu": ["arm64"] - }, - "@esbuild/netbsd-x64@0.27.7": { - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", - "os": ["netbsd"], - "cpu": ["x64"] - }, - "@esbuild/openbsd-arm64@0.27.7": { - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", - "os": ["openbsd"], - "cpu": ["arm64"] - }, - "@esbuild/openbsd-x64@0.27.7": { - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", - "os": ["openbsd"], - "cpu": ["x64"] - }, - "@esbuild/openharmony-arm64@0.27.7": { - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", - "os": ["openharmony"], - "cpu": ["arm64"] - }, - "@esbuild/sunos-x64@0.27.7": { - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", - "os": ["sunos"], - "cpu": ["x64"] - }, - "@esbuild/win32-arm64@0.27.7": { - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", - "os": ["win32"], - "cpu": ["arm64"] - }, - "@esbuild/win32-ia32@0.27.7": { - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", - "os": ["win32"], - "cpu": ["ia32"] - }, - "@esbuild/win32-x64@0.27.7": { - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", - "os": ["win32"], - "cpu": ["x64"] - }, - "@jridgewell/sourcemap-codec@1.5.5": { - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" - }, - "@rollup/rollup-android-arm-eabi@4.60.4": { - "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", - "os": ["android"], - "cpu": ["arm"] - }, - "@rollup/rollup-android-arm64@4.60.4": { - "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", - "os": ["android"], - "cpu": ["arm64"] - }, - "@rollup/rollup-darwin-arm64@4.60.4": { - "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", - "os": ["darwin"], - "cpu": ["arm64"] - }, - "@rollup/rollup-darwin-x64@4.60.4": { - "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", - "os": ["darwin"], - "cpu": ["x64"] - }, - "@rollup/rollup-freebsd-arm64@4.60.4": { - "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", - "os": ["freebsd"], - "cpu": ["arm64"] - }, - "@rollup/rollup-freebsd-x64@4.60.4": { - "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", - "os": ["freebsd"], - "cpu": ["x64"] - }, - "@rollup/rollup-linux-arm-gnueabihf@4.60.4": { - "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", - "os": ["linux"], - "cpu": ["arm"] - }, - "@rollup/rollup-linux-arm-musleabihf@4.60.4": { - "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", - "os": ["linux"], - "cpu": ["arm"] - }, - "@rollup/rollup-linux-arm64-gnu@4.60.4": { - "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", - "os": ["linux"], - "cpu": ["arm64"] - }, - "@rollup/rollup-linux-arm64-musl@4.60.4": { - "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", - "os": ["linux"], - "cpu": ["arm64"] - }, - "@rollup/rollup-linux-loong64-gnu@4.60.4": { - "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", - "os": ["linux"], - "cpu": ["loong64"] - }, - "@rollup/rollup-linux-loong64-musl@4.60.4": { - "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", - "os": ["linux"], - "cpu": ["loong64"] - }, - "@rollup/rollup-linux-ppc64-gnu@4.60.4": { - "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", - "os": ["linux"], - "cpu": ["ppc64"] - }, - "@rollup/rollup-linux-ppc64-musl@4.60.4": { - "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", - "os": ["linux"], - "cpu": ["ppc64"] - }, - "@rollup/rollup-linux-riscv64-gnu@4.60.4": { - "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", - "os": ["linux"], - "cpu": ["riscv64"] - }, - "@rollup/rollup-linux-riscv64-musl@4.60.4": { - "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", - "os": ["linux"], - "cpu": ["riscv64"] - }, - "@rollup/rollup-linux-s390x-gnu@4.60.4": { - "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", - "os": ["linux"], - "cpu": ["s390x"] - }, - "@rollup/rollup-linux-x64-gnu@4.60.4": { - "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", - "os": ["linux"], - "cpu": ["x64"] - }, - "@rollup/rollup-linux-x64-musl@4.60.4": { - "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", - "os": ["linux"], - "cpu": ["x64"] - }, - "@rollup/rollup-openbsd-x64@4.60.4": { - "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", - "os": ["openbsd"], - "cpu": ["x64"] - }, - "@rollup/rollup-openharmony-arm64@4.60.4": { - "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", - "os": ["openharmony"], - "cpu": ["arm64"] - }, - "@rollup/rollup-win32-arm64-msvc@4.60.4": { - "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", - "os": ["win32"], - "cpu": ["arm64"] - }, - "@rollup/rollup-win32-ia32-msvc@4.60.4": { - "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", - "os": ["win32"], - "cpu": ["ia32"] - }, - "@rollup/rollup-win32-x64-gnu@4.60.4": { - "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", - "os": ["win32"], - "cpu": ["x64"] - }, - "@rollup/rollup-win32-x64-msvc@4.60.4": { - "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", - "os": ["win32"], - "cpu": ["x64"] - }, "@sinclair/typebox@0.34.48": { "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==" }, - "@standard-schema/spec@1.1.0": { - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==" - }, - "@types/chai@5.2.3": { - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dependencies": [ - "@types/deep-eql", - "assertion-error" - ] - }, - "@types/deep-eql@4.0.2": { - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==" - }, - "@types/estree@1.0.8": { - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" - }, - "@vitest/expect@4.1.7": { - "integrity": "sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w==", - "dependencies": [ - "@standard-schema/spec", - "@types/chai", - "@vitest/spy", - "@vitest/utils", - "chai", - "tinyrainbow" - ] - }, - "@vitest/mocker@4.1.7_vite@7.3.3": { - "integrity": "sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA==", - "dependencies": [ - "@vitest/spy", - "estree-walker", - "magic-string", - "vite" - ], - "optionalPeers": [ - "vite" - ] - }, - "@vitest/pretty-format@4.1.7": { - "integrity": "sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw==", - "dependencies": [ - "tinyrainbow" - ] - }, - "@vitest/runner@4.1.7": { - "integrity": "sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw==", - "dependencies": [ - "@vitest/utils", - "pathe" - ] - }, - "@vitest/snapshot@4.1.7": { - "integrity": "sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw==", - "dependencies": [ - "@vitest/pretty-format", - "@vitest/utils", - "magic-string", - "pathe" - ] - }, - "@vitest/spy@4.1.7": { - "integrity": "sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q==" - }, - "@vitest/utils@4.1.7": { - "integrity": "sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw==", - "dependencies": [ - "@vitest/pretty-format", - "convert-source-map", - "tinyrainbow" - ] - }, "agent-base@6.0.2": { "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dependencies": [ "debug" ] }, - "assertion-error@2.0.1": { - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==" - }, "asynckit@0.4.0": { "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, @@ -490,18 +156,12 @@ "function-bind" ] }, - "chai@6.2.2": { - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==" - }, "combined-stream@1.0.8": { "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": [ "delayed-stream" ] }, - "convert-source-map@2.0.0": { - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, "debug@4.4.3": { "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": [ @@ -528,9 +188,6 @@ "es-errors@1.3.0": { "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, - "es-module-lexer@2.1.0": { - "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==" - }, "es-object-atoms@1.1.2": { "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "dependencies": [ @@ -546,57 +203,6 @@ "hasown" ] }, - "esbuild@0.27.7": { - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", - "optionalDependencies": [ - "@esbuild/aix-ppc64", - "@esbuild/android-arm", - "@esbuild/android-arm64", - "@esbuild/android-x64", - "@esbuild/darwin-arm64", - "@esbuild/darwin-x64", - "@esbuild/freebsd-arm64", - "@esbuild/freebsd-x64", - "@esbuild/linux-arm", - "@esbuild/linux-arm64", - "@esbuild/linux-ia32", - "@esbuild/linux-loong64", - "@esbuild/linux-mips64el", - "@esbuild/linux-ppc64", - "@esbuild/linux-riscv64", - "@esbuild/linux-s390x", - "@esbuild/linux-x64", - "@esbuild/netbsd-arm64", - "@esbuild/netbsd-x64", - "@esbuild/openbsd-arm64", - "@esbuild/openbsd-x64", - "@esbuild/openharmony-arm64", - "@esbuild/sunos-x64", - "@esbuild/win32-arm64", - "@esbuild/win32-ia32", - "@esbuild/win32-x64" - ], - "scripts": true, - "bin": true - }, - "estree-walker@3.0.3": { - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dependencies": [ - "@types/estree" - ] - }, - "expect-type@1.3.0": { - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==" - }, - "fdir@6.5.0_picomatch@4.0.4": { - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dependencies": [ - "picomatch" - ], - "optionalPeers": [ - "picomatch" - ] - }, "find-up@6.3.0": { "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dependencies": [ @@ -617,11 +223,6 @@ "mime-types" ] }, - "fsevents@2.3.3": { - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "os": ["darwin"], - "scripts": true - }, "function-bind@1.1.2": { "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, @@ -678,12 +279,6 @@ "p-locate" ] }, - "magic-string@0.30.21": { - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dependencies": [ - "@jridgewell/sourcemap-codec" - ] - }, "math-intrinsics@1.1.0": { "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" }, @@ -699,17 +294,10 @@ "ms@2.1.3": { "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "nanoid@3.3.12": { - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", - "bin": true - }, "node-gyp-build@4.8.4": { "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", "bin": true }, - "obug@2.1.1": { - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==" - }, "p-limit@4.0.0": { "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dependencies": [ @@ -725,141 +313,18 @@ "path-exists@5.0.0": { "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==" }, - "pathe@2.0.3": { - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" - }, - "picocolors@1.1.1": { - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "picomatch@4.0.4": { - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==" - }, - "postcss@8.5.15": { - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "dependencies": [ - "nanoid", - "picocolors", - "source-map-js" - ] - }, "proxy-from-env@2.1.0": { "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==" }, - "rollup@4.60.4": { - "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", - "dependencies": [ - "@types/estree" - ], - "optionalDependencies": [ - "@rollup/rollup-android-arm-eabi", - "@rollup/rollup-android-arm64", - "@rollup/rollup-darwin-arm64", - "@rollup/rollup-darwin-x64", - "@rollup/rollup-freebsd-arm64", - "@rollup/rollup-freebsd-x64", - "@rollup/rollup-linux-arm-gnueabihf", - "@rollup/rollup-linux-arm-musleabihf", - "@rollup/rollup-linux-arm64-gnu", - "@rollup/rollup-linux-arm64-musl", - "@rollup/rollup-linux-loong64-gnu", - "@rollup/rollup-linux-loong64-musl", - "@rollup/rollup-linux-ppc64-gnu", - "@rollup/rollup-linux-ppc64-musl", - "@rollup/rollup-linux-riscv64-gnu", - "@rollup/rollup-linux-riscv64-musl", - "@rollup/rollup-linux-s390x-gnu", - "@rollup/rollup-linux-x64-gnu", - "@rollup/rollup-linux-x64-musl", - "@rollup/rollup-openbsd-x64", - "@rollup/rollup-openharmony-arm64", - "@rollup/rollup-win32-arm64-msvc", - "@rollup/rollup-win32-ia32-msvc", - "@rollup/rollup-win32-x64-gnu", - "@rollup/rollup-win32-x64-msvc", - "fsevents" - ], - "bin": true - }, - "siginfo@2.0.0": { - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" - }, - "source-map-js@1.2.1": { - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" - }, - "stackback@0.0.2": { - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" - }, - "std-env@4.1.0": { - "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==" - }, - "tinybench@2.9.0": { - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==" - }, - "tinyexec@1.2.2": { - "integrity": "sha512-M/Q0B2cp4K7kynaT/vnED1j8TlLY+Pp7C6Wl2bl/7u/F0mUVwdyOpwomQb8JpYLitHUssAJRmLZdMCGsrx7i+g==" - }, - "tinyglobby@0.2.16": { - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", - "dependencies": [ - "fdir", - "picomatch" - ] + "stack-trace@1.0.0-pre2": { + "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==" }, - "tinyrainbow@3.1.0": { - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==" + "tinybench@6.0.2": { + "integrity": "sha512-FlHoQpcFvCzeXK5kVPvV7IVgW/hs/B36QWTz876iSdeJguBDfdTSRQmYmaHX+fQNt4hp+gEFB2XXw+8hT4/y8A==" }, "valrs@0.1.0": { "integrity": "sha512-BqVkjx3qhsRLHerblLDoqEx0OEx7ms0DB6LPv40oWkMfFKUVKrqVuklaGdrPrHyubC5hSHYfEtUiQXrCkC6xHQ==" }, - "vite@7.3.3": { - "integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==", - "dependencies": [ - "esbuild", - "fdir", - "picomatch", - "postcss", - "rollup", - "tinyglobby" - ], - "optionalDependencies": [ - "fsevents" - ], - "bin": true - }, - "vitest@4.1.7_vite@7.3.3": { - "integrity": "sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA==", - "dependencies": [ - "@vitest/expect", - "@vitest/mocker", - "@vitest/pretty-format", - "@vitest/runner", - "@vitest/snapshot", - "@vitest/spy", - "@vitest/utils", - "es-module-lexer", - "expect-type", - "magic-string", - "obug", - "pathe", - "picomatch", - "std-env", - "tinybench", - "tinyexec", - "tinyglobby", - "tinyrainbow", - "vite", - "why-is-node-running" - ], - "bin": true - }, - "why-is-node-running@2.3.0": { - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dependencies": [ - "siginfo", - "stackback" - ], - "bin": true - }, "yocto-queue@1.2.2": { "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==" } @@ -870,10 +335,10 @@ "jsr:@std/encoding@1", "jsr:@std/expect@1", "jsr:@std/testing@1", - "npm:@codspeed/vitest-plugin@^5.4.0", + "npm:@codspeed/tinybench-plugin@^5.4.0", "npm:@sinclair/typebox@0.34", "npm:effection@^4.0.2", - "npm:vitest@^4.1.7" + "npm:tinybench@^6.0.2" ] } } From b117d21260bac2694d33558bc51c954e557c5aa5 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Sun, 24 May 2026 14:29:35 -0400 Subject: [PATCH 38/47] =?UTF-8?q?=F0=9F=A7=BC=20remove=20codspeed=20assets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 43 ++++++++++++++++++++++--------------------- vitest.config.ts | 11 ----------- 2 files changed, 22 insertions(+), 32 deletions(-) delete mode 100644 vitest.config.ts diff --git a/README.md b/README.md index 1299a89..a7309d5 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # clayterm -[![CodSpeed](https://img.shields.io/endpoint?url=https://codspeed.io/badge.json)](https://codspeed.io/bombshell-dev/clayterm?utm_source=badge) - A low-level, platform-independent terminal renderer and event parser for JavaScript. You can use clayterm directly, or as the foundation for your own framework. @@ -151,25 +149,28 @@ Pass pointer state to `render()` to have clayterm do hit detection and return pointer events in addition to the byte sequence. ```typescript -let { output, events } = term.render([ - open("root", { - layout: { width: grow(), height: grow(), direction: "ltr" }, - }), - open("sidebar", { - layout: { width: fixed(20), height: grow() }, - bg: rgba(30, 30, 40), - }), - text("Sidebar"), - close(), - open("main", { - layout: { width: grow(), height: grow() }, - }), - text("Main content"), - close(), - close(), -], { - pointer: { x: mouseX, y: mouseY, down: mouseDown }, -}); +let { output, events } = term.render( + [ + open("root", { + layout: { width: grow(), height: grow(), direction: "ltr" }, + }), + open("sidebar", { + layout: { width: fixed(20), height: grow() }, + bg: rgba(30, 30, 40), + }), + text("Sidebar"), + close(), + open("main", { + layout: { width: grow(), height: grow() }, + }), + text("Main content"), + close(), + close(), + ], + { + pointer: { x: mouseX, y: mouseY, down: mouseDown }, + }, +); for (let event of events) { // { type: "pointerenter", id: "sidebar" } diff --git a/vitest.config.ts b/vitest.config.ts deleted file mode 100644 index c7fe4c3..0000000 --- a/vitest.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from "vitest/config"; -import codspeed from "@codspeed/vitest-plugin"; - -export default defineConfig({ - plugins: [codspeed()], - test: { - benchmark: { - include: ["bench/**/*.bench.ts"], - }, - }, -}); From 839bcb7405d4c83fdae3103731045988bf68e96e Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Sun, 24 May 2026 14:46:23 -0400 Subject: [PATCH 39/47] =?UTF-8?q?=F0=9F=94=A8=20fix=20ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/benchmark.yml | 3 ++- deno.json | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index af545bc..123abef 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -44,4 +44,5 @@ jobs: uses: CodSpeedHQ/action@v4 with: mode: simulation - run: deno task bench + # IMPORTANT! deno task bench fails in CI due to incompatible V8 bindings + run: node bench/mod.ts diff --git a/deno.json b/deno.json index 5057037..3bbd75b 100644 --- a/deno.json +++ b/deno.json @@ -28,6 +28,7 @@ "include": ["*.ts"], "exclude": ["!wasm.ts"] }, + "nodeModulesDir": "auto", "fmt": { "exclude": ["clay", "build"] }, From c41f8bf2f040d70807104f02fa98bccec5e9d50f Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Sun, 24 May 2026 14:49:15 -0400 Subject: [PATCH 40/47] add type module --- package.json | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 package.json diff --git a/package.json b/package.json new file mode 100644 index 0000000..4720025 --- /dev/null +++ b/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} From f762bee24da1c54b3ee8bcce8accdd6c587d0510 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Sun, 24 May 2026 14:50:11 -0400 Subject: [PATCH 41/47] fmt --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4720025..3dbc1ca 100644 --- a/package.json +++ b/package.json @@ -1,3 +1,3 @@ { - "type": "module" + "type": "module" } From 0956472b1f95c79272e21f5d47e313201f20a782 Mon Sep 17 00:00:00 2001 From: "Willow (GHOST)" Date: Sun, 24 May 2026 13:56:21 -0700 Subject: [PATCH 42/47] chore: update github url (#38) --- BUILD.md | 2 +- tasks/build-npm.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BUILD.md b/BUILD.md index f7c4782..4946ba1 100644 --- a/BUILD.md +++ b/BUILD.md @@ -30,7 +30,7 @@ The build depends on the `clay` git submodule. Preferred fresh clone: ```sh -git clone --recurse-submodules https://github.com/thefrontside/clayterm.git +git clone --recurse-submodules https://github.com/bombshell-dev/clayterm.git cd clayterm ``` diff --git a/tasks/build-npm.ts b/tasks/build-npm.ts index 7259863..988e725 100644 --- a/tasks/build-npm.ts +++ b/tasks/build-npm.ts @@ -31,10 +31,10 @@ await build({ license: "MIT", repository: { type: "git", - url: "git+https://github.com/thefrontside/clayterm.git", + url: "git+https://github.com/bombshell-dev/clayterm.git", }, bugs: { - url: "https://github.com/thefrontside/clayterm/issues", + url: "https://github.com/bombshell-dev/clayterm/issues", }, engines: { node: ">= 16", From e5ae33e370f7adb9986e1b08643aefcd1367649d Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Sun, 24 May 2026 23:39:56 -0400 Subject: [PATCH 43/47] downgrade to tinybench@5 --- deno.json | 2 +- deno.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/deno.json b/deno.json index 3bbd75b..808d018 100644 --- a/deno.json +++ b/deno.json @@ -18,7 +18,7 @@ "effection": "npm:effection@^4.0.2", "@std/encoding": "jsr:@std/encoding@1", "@codspeed/tinybench-plugin": "npm:@codspeed/tinybench-plugin@^5.4.0", - "tinybench": "npm:tinybench@^6.0.2" + "tinybench": "npm:tinybench@^5.0.0" }, "exports": { ".": "./mod.ts", diff --git a/deno.lock b/deno.lock index b4681a5..d0f8ef2 100644 --- a/deno.lock +++ b/deno.lock @@ -20,11 +20,11 @@ "jsr:@std/testing@1": "1.0.17", "jsr:@ts-morph/bootstrap@0.27": "0.27.0", "jsr:@ts-morph/common@0.27": "0.27.0", - "npm:@codspeed/tinybench-plugin@^5.4.0": "5.4.0_tinybench@6.0.2", + "npm:@codspeed/tinybench-plugin@^5.4.0": "5.4.0_tinybench@5.1.0", "npm:@sinclair/typebox@*": "0.34.48", "npm:@sinclair/typebox@0.34": "0.34.48", "npm:effection@^4.0.2": "4.0.2", - "npm:tinybench@^6.0.2": "6.0.2", + "npm:tinybench@5": "5.1.0", "npm:valrs@*": "0.1.0" }, "jsr": { @@ -120,7 +120,7 @@ "node-gyp-build" ] }, - "@codspeed/tinybench-plugin@5.4.0_tinybench@6.0.2": { + "@codspeed/tinybench-plugin@5.4.0_tinybench@5.1.0": { "integrity": "sha512-jzuFoyyoGxc3Lc+TTl54PnRsgqO3CYbbbnwYSVp/m/4rqvCwSUZChY9EuQJ6uZFbamT3UhWF2N6tDEGShkvsrw==", "dependencies": [ "@codspeed/core", @@ -319,8 +319,8 @@ "stack-trace@1.0.0-pre2": { "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==" }, - "tinybench@6.0.2": { - "integrity": "sha512-FlHoQpcFvCzeXK5kVPvV7IVgW/hs/B36QWTz876iSdeJguBDfdTSRQmYmaHX+fQNt4hp+gEFB2XXw+8hT4/y8A==" + "tinybench@5.1.0": { + "integrity": "sha512-LXKNtFualiKOm6gADe1UXPtf8+Nfn1CtPMEHAT33Fd2YjQatrujkDcK0+4wRC1X6t7fxUDXUs6BsvuIgfkDgDg==" }, "valrs@0.1.0": { "integrity": "sha512-BqVkjx3qhsRLHerblLDoqEx0OEx7ms0DB6LPv40oWkMfFKUVKrqVuklaGdrPrHyubC5hSHYfEtUiQXrCkC6xHQ==" @@ -338,7 +338,7 @@ "npm:@codspeed/tinybench-plugin@^5.4.0", "npm:@sinclair/typebox@0.34", "npm:effection@^4.0.2", - "npm:tinybench@^6.0.2" + "npm:tinybench@5" ] } } From ed95c3eba4fd5d1341d1192989a3bd3b07ad1865 Mon Sep 17 00:00:00 2001 From: Jacob Bolda Date: Wed, 27 May 2026 15:50:06 -0500 Subject: [PATCH 44/47] move to examples folder with readme --- README.md | 6 +- deno.json | 1 - examples/README.md | 63 ++++++++++++++++++ .../inline-regions/index.ts | 6 +- .../keyboard.ts => examples/keyboard/index.ts | 4 +- .../keyboard}/keyboard-key-events.gif | Bin .../keyboard}/keyboard-pointer-events.gif | Bin {demo => examples/keyboard}/use-input.ts | 2 +- {demo => examples/keyboard}/use-stdin.ts | 0 9 files changed, 72 insertions(+), 10 deletions(-) create mode 100644 examples/README.md rename demo/inline-region.ts => examples/inline-regions/index.ts (98%) rename demo/keyboard.ts => examples/keyboard/index.ts (99%) rename {demo => examples/keyboard}/keyboard-key-events.gif (100%) rename {demo => examples/keyboard}/keyboard-pointer-events.gif (100%) rename {demo => examples/keyboard}/use-input.ts (98%) rename {demo => examples/keyboard}/use-stdin.ts (100%) diff --git a/README.md b/README.md index a7309d5..7e2fd70 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ computation. will run anywhere JavaScript runs with no native dependencies, and no build step for consumers. -### Demo +### Examples The application in this demo uses Clayterm for all layout and input parsing @@ -30,14 +30,14 @@ The application in this demo uses Clayterm for all layout and input parsing The input parser decodes raw terminal bytes into structured events. Here you can see each key event as the string "hello world" is typed. -![Keyboard events demo](demo/keyboard-key-events.gif) +![Keyboard events demo](examples/keyboard/keyboard-key-events.gif) #### Pointer Events Here we see hover styles applied to UI elements in response to the pointer state. Clay drives the hit testing; no manual coordinate math required. -![Pointer events demo](demo/keyboard-pointer-events.gif) +![Pointer events demo](examples/keyboard/keyboard-pointer-events.gif) ## Architecture diff --git a/deno.json b/deno.json index 808d018..901feb9 100644 --- a/deno.json +++ b/deno.json @@ -7,7 +7,6 @@ "fmt:check": "deno fmt --check && clang-format --dry-run --Werror src/*.c src/*.h", "build:npm": "deno run -A tasks/build-npm.ts", "build:jsr": "deno run -A tasks/build-jsr.ts", - "demo": "deno run demo/keyboard.ts", "bench": "deno run -A bench/mod.ts" }, "imports": { diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000..212f7a0 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,63 @@ +# examples + +This directory contains runnable example applications that exercise different +features of libs. If any of these examples are not working, please open an issue +with information about your terminal, shell, operating system and any other +information that could be pertinent to reproducing the issue. + +> [!NOTE] +> Run the commands in this document from the repository root. + +## Prerequisites + +Build the generated WebAssembly bundle before running the examples: + +```sh +make +``` + +## Keyboard + +Path: `examples/keyboard/index.ts` + +Run it with: + +```sh +deno run examples/keyboard/index.ts +``` + +What it shows: + +- raw keyboard input decoded into structured key events +- progressive keyboard protocol support +- pointer tracking and hover/click-driven UI updates +- terminal mode configuration such as alternate buffer, hidden cursor, and mouse + reporting + +Related files: + +- `examples/keyboard/use-input.ts` wraps the input parser as a stream of decoded + events +- `examples/keyboard/use-stdin.ts` adapts stdin into a byte stream for the demo + +## Inline Regions + +Path: `examples/inline-regions/index.ts` + +Run it with: + +```sh +deno run examples/inline-regions/index.ts +``` + +What it shows: + +- rendering animated regions into normal terminal scrollback +- querying cursor position with DSR to place later frames correctly +- updating a previously allocated region without taking over the whole screen +- small animated demos including a spinner, a progress bar, and a nyan-cat-style + sequence + +This example is useful if you want to embed transient or animated UI output into +a normal command-line workflow instead of switching to a full-screen alternate +buffer interface. diff --git a/demo/inline-region.ts b/examples/inline-regions/index.ts similarity index 98% rename from demo/inline-region.ts rename to examples/inline-regions/index.ts index 75a5b92..601dea8 100644 --- a/demo/inline-region.ts +++ b/examples/inline-regions/index.ts @@ -24,9 +24,9 @@ import { rgba, SHOWCURSOR, text, -} from "../mod.ts"; -import { cursor, settings } from "../settings.ts"; -import { validated } from "../validate.ts"; +} from "../../mod.ts"; +import { cursor, settings } from "../../settings.ts"; +import { validated } from "../../validate.ts"; const encode = (s: string) => new TextEncoder().encode(s); const write = (b: Uint8Array) => Deno.stdout.writeSync(b); diff --git a/demo/keyboard.ts b/examples/keyboard/index.ts similarity index 99% rename from demo/keyboard.ts rename to examples/keyboard/index.ts index 0dce0c3..ef8fec8 100644 --- a/demo/keyboard.ts +++ b/examples/keyboard/index.ts @@ -21,7 +21,7 @@ import { type PointerEvent, rgba, text, -} from "../mod.ts"; +} from "../../mod.ts"; import { alternateBuffer, cursor, @@ -29,7 +29,7 @@ import { progressiveInput, type Setting, settings, -} from "../settings.ts"; +} from "../../settings.ts"; import { useInput } from "./use-input.ts"; import { useStdin } from "./use-stdin.ts"; diff --git a/demo/keyboard-key-events.gif b/examples/keyboard/keyboard-key-events.gif similarity index 100% rename from demo/keyboard-key-events.gif rename to examples/keyboard/keyboard-key-events.gif diff --git a/demo/keyboard-pointer-events.gif b/examples/keyboard/keyboard-pointer-events.gif similarity index 100% rename from demo/keyboard-pointer-events.gif rename to examples/keyboard/keyboard-pointer-events.gif diff --git a/demo/use-input.ts b/examples/keyboard/use-input.ts similarity index 98% rename from demo/use-input.ts rename to examples/keyboard/use-input.ts index 73a4467..f85566c 100644 --- a/demo/use-input.ts +++ b/examples/keyboard/use-input.ts @@ -11,7 +11,7 @@ import { suspend, until, } from "effection"; -import { createInput, type InputEvent, type InputOptions } from "../mod.ts"; +import { createInput, type InputEvent, type InputOptions } from "../../mod.ts"; function nothing() { return suspend() as unknown as Operation< diff --git a/demo/use-stdin.ts b/examples/keyboard/use-stdin.ts similarity index 100% rename from demo/use-stdin.ts rename to examples/keyboard/use-stdin.ts From a533953ffedbd95e93af699eee8d26c4ff6b40ca Mon Sep 17 00:00:00 2001 From: Ryan Rauh Date: Sun, 31 May 2026 09:27:58 -0400 Subject: [PATCH 45/47] =?UTF-8?q?=F0=9F=94=A7=20export=20animating=20from?= =?UTF-8?q?=20wasm=20build?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 1103b8e..05a2dd1 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,7 @@ EXPORTS = \ -Wl,--export=pointer_over_id_string_length \ -Wl,--export=pointer_over_id_string_ptr \ -Wl,--export=get_element_bounds \ + -Wl,--export=animating \ -Wl,--export=error_count \ -Wl,--export=error_type \ -Wl,--export=error_message_length \ From 4effe2e805e0dd8512f5208b717af6bd2ea7e24b Mon Sep 17 00:00:00 2001 From: Ryan Rauh Date: Sun, 31 May 2026 09:29:58 -0400 Subject: [PATCH 46/47] =?UTF-8?q?=F0=9F=A7=AA=20cover=20transitions=20in?= =?UTF-8?q?=20snapshots=20and=20validation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ops.ts | 1 + test/transitions-pack.test.ts | 11 ++++++++++- test/validate.test.ts | 24 ++++++++++++++++++++++++ validate.ts | 29 +++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 1 deletion(-) diff --git a/ops.ts b/ops.ts index dd90163..637a0c4 100644 --- a/ops.ts +++ b/ops.ts @@ -370,6 +370,7 @@ function packSize(ops: Op[]): number { if (op.border) n += 8; if (op.clip) n += 4; if (op.floating) n += 16; + if (op.transition) n += 8; break; } case OP_TEXT: { diff --git a/test/transitions-pack.test.ts b/test/transitions-pack.test.ts index 885a89a..b505fd4 100644 --- a/test/transitions-pack.test.ts +++ b/test/transitions-pack.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "./suite.ts"; -import { close, open, pack } from "../mod.ts"; +import { close, open, pack, snapshot } from "../mod.ts"; describe("pack transition", () => { it("encodes a transition without throwing", () => { @@ -39,4 +39,13 @@ describe("pack transition", () => { // The transition block is exactly 8 bytes = 2 words. expect(withLen - withoutLen).toBe(2); }); + + it("includes transition bytes when sizing snapshots", () => { + expect(() => + snapshot([ + open("a", { transition: { duration: 0.2, properties: ["x"] } }), + close(), + ]) + ).not.toThrow(); + }); }); diff --git a/test/validate.test.ts b/test/validate.test.ts index 8db4af9..5eba9bb 100644 --- a/test/validate.test.ts +++ b/test/validate.test.ts @@ -19,6 +19,20 @@ describe("validate", () => { expect(validate([])).toBe(true); }); + it("accepts transition ops", () => { + expect(validate([ + open("x", { + transition: { + duration: 0.2, + easing: "easeOut", + properties: ["x", "bg"], + interactive: true, + }, + }), + close(), + ])).toBe(true); + }); + it("rejects ops with wrong directive", () => { expect(validate([{ directive: 0xff }])).toBe(false); }); @@ -31,6 +45,16 @@ describe("validate", () => { expect(validate([{ directive: 0x03 }])).toBe(false); }); + it("rejects invalid transition properties", () => { + expect(validate([ + open("x", { + // deno-lint-ignore no-explicit-any + transition: { duration: 0.2, properties: ["opacity" as any] }, + }), + close(), + ])).toBe(false); + }); + it("rejects non-array", () => { expect(validate("garbage")).toBe(false); }); diff --git a/validate.ts b/validate.ts index 248ea48..6a248b8 100644 --- a/validate.ts +++ b/validate.ts @@ -89,6 +89,34 @@ const Floating = Type.Object({ zIndex: Type.Optional(u16), }); +const TransitionProperty = Type.Union([ + Type.Literal("x"), + Type.Literal("y"), + Type.Literal("position"), + Type.Literal("width"), + Type.Literal("height"), + Type.Literal("size"), + Type.Literal("bg"), + Type.Literal("overlay"), + Type.Literal("borderColor"), + Type.Literal("borderWidth"), + Type.Literal("all"), +]); + +const Easing = Type.Union([ + Type.Literal("linear"), + Type.Literal("easeIn"), + Type.Literal("easeOut"), + Type.Literal("easeInOut"), +]); + +const Transition = Type.Object({ + duration: Type.Number(), + easing: Type.Optional(Easing), + properties: Type.Array(TransitionProperty), + interactive: Type.Optional(Type.Boolean()), +}); + /* ── Op types (discriminated on `directive`) ──────────────────────── */ const CloseElement = Type.Object({ directive: Type.Literal(0x04) }); @@ -102,6 +130,7 @@ const OpenElement = Type.Object({ border: Type.Optional(Border), clip: Type.Optional(Clip), floating: Type.Optional(Floating), + transition: Type.Optional(Transition), }); const TextOp = Type.Object({ From 7eab1e46b87fce704411ed0a0534f5c3d2c4a3b3 Mon Sep 17 00:00:00 2001 From: Ryan Rauh Date: Sun, 31 May 2026 09:34:08 -0400 Subject: [PATCH 47/47] =?UTF-8?q?=E2=9C=85=20enforce=20nonnegative=20trans?= =?UTF-8?q?ition=20duration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/validate.test.ts | 7 +++++++ validate.ts | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/test/validate.test.ts b/test/validate.test.ts index 5eba9bb..25a8e0e 100644 --- a/test/validate.test.ts +++ b/test/validate.test.ts @@ -55,6 +55,13 @@ describe("validate", () => { ])).toBe(false); }); + it("rejects negative transition duration", () => { + expect(validate([ + open("x", { transition: { duration: -1, properties: ["x"] } }), + close(), + ])).toBe(false); + }); + it("rejects non-array", () => { expect(validate("garbage")).toBe(false); }); diff --git a/validate.ts b/validate.ts index 6a248b8..a18e656 100644 --- a/validate.ts +++ b/validate.ts @@ -111,7 +111,7 @@ const Easing = Type.Union([ ]); const Transition = Type.Object({ - duration: Type.Number(), + duration: Type.Number({ minimum: 0 }), easing: Type.Optional(Easing), properties: Type.Array(TransitionProperty), interactive: Type.Optional(Type.Boolean()),