@rezi-ui/node 0.1.0-alpha.6 → 0.1.0-alpha.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +26 -6
  2. package/dist/backend/backendSharedConfig.d.ts +11 -0
  3. package/dist/backend/backendSharedConfig.d.ts.map +1 -0
  4. package/dist/backend/backendSharedConfig.js +99 -0
  5. package/dist/backend/backendSharedConfig.js.map +1 -0
  6. package/dist/backend/backendSharedDebug.d.ts +4 -0
  7. package/dist/backend/backendSharedDebug.d.ts.map +1 -0
  8. package/dist/backend/backendSharedDebug.js +29 -0
  9. package/dist/backend/backendSharedDebug.js.map +1 -0
  10. package/dist/backend/backendSharedMarkers.d.ts +10 -0
  11. package/dist/backend/backendSharedMarkers.d.ts.map +1 -0
  12. package/dist/backend/backendSharedMarkers.js +50 -0
  13. package/dist/backend/backendSharedMarkers.js.map +1 -0
  14. package/dist/backend/emojiWidthPolicy.d.ts +15 -0
  15. package/dist/backend/emojiWidthPolicy.d.ts.map +1 -0
  16. package/dist/backend/emojiWidthPolicy.js +229 -0
  17. package/dist/backend/emojiWidthPolicy.js.map +1 -0
  18. package/dist/backend/nodeBackend.d.ts +30 -2
  19. package/dist/backend/nodeBackend.d.ts.map +1 -1
  20. package/dist/backend/nodeBackend.js +418 -66
  21. package/dist/backend/nodeBackend.js.map +1 -1
  22. package/dist/backend/nodeBackendInline.d.ts.map +1 -1
  23. package/dist/backend/nodeBackendInline.js +131 -55
  24. package/dist/backend/nodeBackendInline.js.map +1 -1
  25. package/dist/backend/terminalProfile.d.ts +5 -0
  26. package/dist/backend/terminalProfile.d.ts.map +1 -0
  27. package/dist/backend/terminalProfile.js +117 -0
  28. package/dist/backend/terminalProfile.js.map +1 -0
  29. package/dist/dev/hotStateReload.d.ts +65 -0
  30. package/dist/dev/hotStateReload.d.ts.map +1 -0
  31. package/dist/dev/hotStateReload.js +438 -0
  32. package/dist/dev/hotStateReload.js.map +1 -0
  33. package/dist/dev/nodeAppHotReload.d.ts +11 -0
  34. package/dist/dev/nodeAppHotReload.d.ts.map +1 -0
  35. package/dist/dev/nodeAppHotReload.js +78 -0
  36. package/dist/dev/nodeAppHotReload.js.map +1 -0
  37. package/dist/frameAudit.d.ts +51 -0
  38. package/dist/frameAudit.d.ts.map +1 -0
  39. package/dist/frameAudit.js +257 -0
  40. package/dist/frameAudit.js.map +1 -0
  41. package/dist/image.d.ts +4 -0
  42. package/dist/image.d.ts.map +1 -0
  43. package/dist/image.js +43 -0
  44. package/dist/image.js.map +1 -0
  45. package/dist/index.d.ts +44 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +198 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/repro/index.d.ts +3 -0
  50. package/dist/repro/index.d.ts.map +1 -0
  51. package/dist/repro/index.js +2 -0
  52. package/dist/repro/index.js.map +1 -0
  53. package/dist/repro/recorder.d.ts +30 -0
  54. package/dist/repro/recorder.d.ts.map +1 -0
  55. package/dist/repro/recorder.js +321 -0
  56. package/dist/repro/recorder.js.map +1 -0
  57. package/dist/streams/tail.d.ts +6 -0
  58. package/dist/streams/tail.d.ts.map +1 -0
  59. package/dist/streams/tail.js +113 -0
  60. package/dist/streams/tail.js.map +1 -0
  61. package/dist/worker/engineWorker.js +487 -14
  62. package/dist/worker/engineWorker.js.map +1 -1
  63. package/dist/worker/protocol.d.ts +3 -0
  64. package/dist/worker/protocol.d.ts.map +1 -1
  65. package/dist/worker/testShims/invalidPollBytesNative.d.ts +22 -0
  66. package/dist/worker/testShims/invalidPollBytesNative.d.ts.map +1 -0
  67. package/dist/worker/testShims/invalidPollBytesNative.js +65 -0
  68. package/dist/worker/testShims/invalidPollBytesNative.js.map +1 -0
  69. package/dist/worker/testShims/limitsExpectNative.d.ts +22 -0
  70. package/dist/worker/testShims/limitsExpectNative.d.ts.map +1 -0
  71. package/dist/worker/testShims/limitsExpectNative.js +85 -0
  72. package/dist/worker/testShims/limitsExpectNative.js.map +1 -0
  73. package/dist/worker/testShims/limitsNative.d.ts +22 -0
  74. package/dist/worker/testShims/limitsNative.d.ts.map +1 -0
  75. package/dist/worker/testShims/limitsNative.js +90 -0
  76. package/dist/worker/testShims/limitsNative.js.map +1 -0
  77. package/dist/worker/tickTiming.d.ts +7 -0
  78. package/dist/worker/tickTiming.d.ts.map +1 -0
  79. package/dist/worker/tickTiming.js +26 -0
  80. package/dist/worker/tickTiming.js.map +1 -0
  81. package/package.json +12 -8
  82. package/dist/__e2e__/fixtures/terminal-app.d.ts +0 -2
  83. package/dist/__e2e__/fixtures/terminal-app.d.ts.map +0 -1
  84. package/dist/__e2e__/fixtures/terminal-app.js +0 -42
  85. package/dist/__e2e__/fixtures/terminal-app.js.map +0 -1
  86. package/dist/__e2e__/terminal-render.e2e.test.d.ts +0 -2
  87. package/dist/__e2e__/terminal-render.e2e.test.d.ts.map +0 -1
  88. package/dist/__e2e__/terminal-render.e2e.test.js +0 -125
  89. package/dist/__e2e__/terminal-render.e2e.test.js.map +0 -1
  90. package/dist/__tests__/worker_integration.test.d.ts +0 -2
  91. package/dist/__tests__/worker_integration.test.d.ts.map +0 -1
  92. package/dist/__tests__/worker_integration.test.js +0 -569
  93. package/dist/__tests__/worker_integration.test.js.map +0 -1
package/README.md CHANGED
@@ -1,17 +1,37 @@
1
1
  # @rezi-ui/node
2
2
 
3
- Node.js backend for Rezi. This package owns:
3
+ Node.js/Bun backend for Rezi. This package owns:
4
4
 
5
- - worker-thread engine ownership (native engine is never called on the main thread)
5
+ - configurable native engine execution mode (`auto` | `worker` | `inline`)
6
6
  - frame scheduling and buffer pooling
7
7
  - transfer of drawlists/events between core and the native addon
8
8
 
9
- Typical usage:
9
+ Recommended usage:
10
10
 
11
11
  ```ts
12
- import { createApp, ui } from "@rezi-ui/core";
13
- import { createNodeBackend } from "@rezi-ui/node";
12
+ import { createNodeApp } from "@rezi-ui/node";
14
13
  ```
15
14
 
16
- Docs: `https://rtlzeromemory.github.io/Rezi/`
15
+ Use `createNodeApp({ initialState, config })` as the default path. It wires
16
+ `@rezi-ui/core` and `@rezi-ui/node` with matched cursor protocol, event caps,
17
+ and fps settings. `executionMode` defaults to `auto` (`fpsCap <= 30` -> inline,
18
+ otherwise worker); set `executionMode: "worker"` or `"inline"` to force a mode.
17
19
 
20
+ For development-time hot swapping, pass `hotReload` to `createNodeApp(...)`:
21
+ - `viewModule` for widget-view apps
22
+ - `routesModule` for route-managed apps
23
+
24
+ `app.hotReload` exposes the controller for optional manual `reloadNow()` calls.
25
+
26
+ `createNodeBackend()` is available when you need direct access to a backend
27
+ instance (benchmarks/custom runners). Most apps should use `createNodeApp()`.
28
+
29
+ Install:
30
+
31
+ ```bash
32
+ npm i @rezi-ui/node
33
+ # or
34
+ bun add @rezi-ui/node
35
+ ```
36
+
37
+ Docs: `https://rezitui.dev/docs`
@@ -0,0 +1,11 @@
1
+ export declare const DEFAULT_FPS_CAP: 60;
2
+ export declare const MAX_SAFE_FPS_CAP: 1000;
3
+ export declare const DEFAULT_MAX_EVENT_BYTES: number;
4
+ export declare const MAX_SAFE_EVENT_BYTES: number;
5
+ export declare function mergeNativeLimits(nativeConfig: Readonly<Record<string, unknown>>): Readonly<Record<string, unknown>>;
6
+ export declare function normalizeBackendNativeConfig(nativeConfig: unknown): Readonly<Record<string, unknown>>;
7
+ export declare function parsePositiveIntOr(n: unknown, fallback: number): number;
8
+ export declare function parsePositiveInt(n: unknown): number | null;
9
+ export declare function parseBoundedPositiveIntOrThrow(name: string, value: unknown, fallback: number, max: number): number;
10
+ export declare function resolveTargetFps(fpsCap: number, nativeConfig: Readonly<Record<string, unknown>>): number;
11
+ //# sourceMappingURL=backendSharedConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backendSharedConfig.d.ts","sourceRoot":"","sources":["../../src/backend/backendSharedConfig.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,EAAG,EAAW,CAAC;AAC3C,eAAO,MAAM,gBAAgB,EAAG,IAAa,CAAC;AAC9C,eAAO,MAAM,uBAAuB,QAAU,CAAC;AAC/C,eAAO,MAAM,oBAAoB,QAAU,CAAC;AAsB5C,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAC9C,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAsBnC;AAED,wBAAgB,4BAA4B,CAC1C,YAAY,EAAE,OAAO,GACpB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAInC;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMvE;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAM1D;AAED,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,MAAM,CAUR;AAYD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAC9C,MAAM,CAgBR"}
@@ -0,0 +1,99 @@
1
+ import { ZrUiError } from "@rezi-ui/core";
2
+ export const DEFAULT_FPS_CAP = 60;
3
+ export const MAX_SAFE_FPS_CAP = 1000;
4
+ export const DEFAULT_MAX_EVENT_BYTES = 1 << 20;
5
+ export const MAX_SAFE_EVENT_BYTES = 4 << 20;
6
+ const EMPTY_NATIVE_CONFIG = Object.freeze({});
7
+ const DEFAULT_NATIVE_LIMITS = Object.freeze({
8
+ // Align native validation caps with JS drawlist builder defaults.
9
+ //
10
+ // Native defaults are intentionally conservative; however, @rezi-ui/core's
11
+ // drawlist builders default to 2 MiB max drawlist bytes and large command
12
+ // budgets. Without overriding, moderately large frames (e.g. images/canvas)
13
+ // can fail with ZR_ERR_LIMIT (-3) at submit time.
14
+ outMaxBytesPerFrame: 2 * 1024 * 1024,
15
+ dlMaxTotalBytes: 2 * 1024 * 1024,
16
+ dlMaxCmds: 100_000,
17
+ dlMaxStrings: 10_000,
18
+ dlMaxBlobs: 10_000,
19
+ });
20
+ function isPlainObject(v) {
21
+ return typeof v === "object" && v !== null && !Array.isArray(v);
22
+ }
23
+ export function mergeNativeLimits(nativeConfig) {
24
+ // biome-ignore lint/complexity/useLiteralKeys: bracket access is required by noPropertyAccessFromIndexSignature.
25
+ const limitsValue = nativeConfig["limits"];
26
+ const existingLimits = isPlainObject(limitsValue)
27
+ ? limitsValue
28
+ : null;
29
+ const limits = { ...(existingLimits ?? {}) };
30
+ const has = (camel) => {
31
+ const snake = camel.replace(/[A-Z]/g, (m) => `_${m.toLowerCase()}`);
32
+ return (Object.prototype.hasOwnProperty.call(limits, camel) ||
33
+ Object.prototype.hasOwnProperty.call(limits, snake));
34
+ };
35
+ for (const [camel, value] of Object.entries(DEFAULT_NATIVE_LIMITS)) {
36
+ if (has(camel))
37
+ continue;
38
+ limits[camel] = value;
39
+ }
40
+ return Object.freeze({ ...nativeConfig, limits: Object.freeze(limits) });
41
+ }
42
+ export function normalizeBackendNativeConfig(nativeConfig) {
43
+ return isPlainObject(nativeConfig)
44
+ ? mergeNativeLimits(nativeConfig)
45
+ : mergeNativeLimits(EMPTY_NATIVE_CONFIG);
46
+ }
47
+ export function parsePositiveIntOr(n, fallback) {
48
+ if (typeof n !== "number")
49
+ return fallback;
50
+ if (!Number.isFinite(n))
51
+ return fallback;
52
+ if (!Number.isInteger(n))
53
+ return fallback;
54
+ if (n <= 0)
55
+ return fallback;
56
+ return n;
57
+ }
58
+ export function parsePositiveInt(n) {
59
+ if (typeof n !== "number")
60
+ return null;
61
+ if (!Number.isFinite(n))
62
+ return null;
63
+ if (!Number.isInteger(n))
64
+ return null;
65
+ if (n <= 0)
66
+ return null;
67
+ return n;
68
+ }
69
+ export function parseBoundedPositiveIntOrThrow(name, value, fallback, max) {
70
+ if (value === undefined)
71
+ return fallback;
72
+ const parsed = parsePositiveInt(value);
73
+ if (parsed === null) {
74
+ throw new ZrUiError("ZRUI_INVALID_PROPS", `${name} must be a positive integer`);
75
+ }
76
+ if (parsed > max) {
77
+ throw new ZrUiError("ZRUI_INVALID_PROPS", `${name} must be <= ${String(max)}`);
78
+ }
79
+ return parsed;
80
+ }
81
+ function readNativeTargetFpsValues(cfg) {
82
+ const targetFpsCfg = cfg;
83
+ return {
84
+ camel: parsePositiveInt(targetFpsCfg.targetFps),
85
+ snake: parsePositiveInt(targetFpsCfg.target_fps),
86
+ };
87
+ }
88
+ export function resolveTargetFps(fpsCap, nativeConfig) {
89
+ const values = readNativeTargetFpsValues(nativeConfig);
90
+ if (values.camel !== null && values.snake !== null && values.camel !== values.snake) {
91
+ throw new ZrUiError("ZRUI_INVALID_PROPS", `createNodeBackend config mismatch: nativeConfig.targetFps=${String(values.camel)} must match nativeConfig.target_fps=${String(values.snake)}.`);
92
+ }
93
+ const nativeTargetFps = values.camel ?? values.snake;
94
+ if (nativeTargetFps !== null && nativeTargetFps !== fpsCap) {
95
+ throw new ZrUiError("ZRUI_INVALID_PROPS", `createNodeBackend config mismatch: fpsCap=${String(fpsCap)} must match nativeConfig.targetFps/target_fps=${String(nativeTargetFps)}. Fix: set nativeConfig.targetFps (or target_fps) to ${String(fpsCap)}, or remove the override and use fpsCap only.`);
96
+ }
97
+ return fpsCap;
98
+ }
99
+ //# sourceMappingURL=backendSharedConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backendSharedConfig.js","sourceRoot":"","sources":["../../src/backend/backendSharedConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const DEBUG_QUERY_DEFAULT_RECORDS: 4096;
2
+ export declare const DEBUG_QUERY_MAX_RECORDS: 16384;
3
+ export declare function readDebugBytesWithRetry<TEmpty>(read: (out: Uint8Array) => number, initialCapacity: number, emptyValue: TEmpty, operation: string): Uint8Array | TEmpty;
4
+ //# sourceMappingURL=backendSharedDebug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backendSharedDebug.d.ts","sourceRoot":"","sources":["../../src/backend/backendSharedDebug.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,2BAA2B,EAAG,IAAa,CAAC;AACzD,eAAO,MAAM,uBAAuB,EAAG,KAAc,CAAC;AAItD,wBAAgB,uBAAuB,CAAC,MAAM,EAC5C,IAAI,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,MAAM,EACjC,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,UAAU,GAAG,MAAM,CA4BrB"}
@@ -0,0 +1,29 @@
1
+ import { ZrUiError } from "@rezi-ui/core";
2
+ export const DEBUG_QUERY_DEFAULT_RECORDS = 4096;
3
+ export const DEBUG_QUERY_MAX_RECORDS = 16384;
4
+ const MAX_DEBUG_BYTES_RETRY_CAP = 64 << 20;
5
+ export function readDebugBytesWithRetry(read, initialCapacity, emptyValue, operation) {
6
+ const baseCapacity = Number.isFinite(initialCapacity) ? Math.floor(initialCapacity) : 1;
7
+ let capacity = Math.min(MAX_DEBUG_BYTES_RETRY_CAP, Math.max(1, baseCapacity));
8
+ while (true) {
9
+ const out = new Uint8Array(capacity);
10
+ const written = read(out);
11
+ if (!Number.isInteger(written) || written > out.byteLength) {
12
+ throw new ZrUiError("ZRUI_BACKEND_ERROR", `${operation} returned invalid byte count: written=${String(written)} capacity=${String(out.byteLength)}`);
13
+ }
14
+ if (written <= 0) {
15
+ return emptyValue;
16
+ }
17
+ if (written < out.byteLength) {
18
+ return out.slice(0, written);
19
+ }
20
+ if (capacity >= MAX_DEBUG_BYTES_RETRY_CAP) {
21
+ // Native debug APIs return written byte count but not total required size.
22
+ // If the output exactly fills our max-cap buffer, it's likely truncated.
23
+ process.emitWarning(`[rezi][debug] ${operation} filled ${String(capacity)} bytes at max cap; payload may be truncated.`);
24
+ return out.slice(0, written);
25
+ }
26
+ capacity = Math.min(MAX_DEBUG_BYTES_RETRY_CAP, capacity * 2);
27
+ }
28
+ }
29
+ //# sourceMappingURL=backendSharedDebug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backendSharedDebug.js","sourceRoot":"","sources":["../../src/backend/backendSharedDebug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAa,CAAC;AACzD,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAc,CAAC;AAEtD,MAAM,yBAAyB,GAAG,EAAE,IAAI,EAAE,CAAC;AAE3C,MAAM,UAAU,uBAAuB,CACrC,IAAiC,EACjC,eAAuB,EACvB,UAAkB,EAClB,SAAiB;IAEjB,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;IAC9E,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;YAC3D,MAAM,IAAI,SAAS,CACjB,oBAAoB,EACpB,GAAG,SAAS,yCAAyC,MAAM,CAAC,OAAO,CAAC,aAAa,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAC1G,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YACjB,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,IAAI,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;YAC7B,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,QAAQ,IAAI,yBAAyB,EAAE,CAAC;YAC1C,2EAA2E;YAC3E,yEAAyE;YACzE,OAAO,CAAC,WAAW,CACjB,iBAAiB,SAAS,WAAW,MAAM,CAAC,QAAQ,CAAC,8CAA8C,CACpG,CAAC;YACF,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/B,CAAC;QACD,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { BackendBeginFrame } from "@rezi-ui/core/backend";
2
+ type BackendMarkerOptions = Readonly<{
3
+ requestedDrawlistVersion: number;
4
+ maxEventBytes: number;
5
+ fpsCap: number;
6
+ beginFrame?: BackendBeginFrame | null;
7
+ }>;
8
+ export declare function attachBackendMarkers<TBackend extends object>(backend: TBackend, options: BackendMarkerOptions): TBackend;
9
+ export {};
10
+ //# sourceMappingURL=backendSharedMarkers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backendSharedMarkers.d.ts","sourceRoot":"","sources":["../../src/backend/backendSharedMarkers.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,KAAK,oBAAoB,GAAG,QAAQ,CAAC;IACnC,wBAAwB,EAAE,MAAM,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACvC,CAAC,CAAC;AAWH,wBAAgB,oBAAoB,CAAC,QAAQ,SAAS,MAAM,EAC1D,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,oBAAoB,GAC5B,QAAQ,CAuCV"}
@@ -0,0 +1,50 @@
1
+ import { BACKEND_BEGIN_FRAME_MARKER, BACKEND_DRAWLIST_VERSION_MARKER, BACKEND_FPS_CAP_MARKER, BACKEND_MAX_EVENT_BYTES_MARKER, BACKEND_RAW_WRITE_MARKER, } from "@rezi-ui/core";
2
+ const backendRawWrite = ((text) => {
3
+ if (typeof text !== "string" || text.length === 0)
4
+ return;
5
+ try {
6
+ process.stdout.write(text);
7
+ }
8
+ catch {
9
+ // Preserve backend determinism: clipboard write failures are non-fatal.
10
+ }
11
+ });
12
+ export function attachBackendMarkers(backend, options) {
13
+ const descriptors = {
14
+ [BACKEND_DRAWLIST_VERSION_MARKER]: {
15
+ value: options.requestedDrawlistVersion,
16
+ writable: false,
17
+ enumerable: false,
18
+ configurable: false,
19
+ },
20
+ [BACKEND_MAX_EVENT_BYTES_MARKER]: {
21
+ value: options.maxEventBytes,
22
+ writable: false,
23
+ enumerable: false,
24
+ configurable: false,
25
+ },
26
+ [BACKEND_FPS_CAP_MARKER]: {
27
+ value: options.fpsCap,
28
+ writable: false,
29
+ enumerable: false,
30
+ configurable: false,
31
+ },
32
+ [BACKEND_RAW_WRITE_MARKER]: {
33
+ value: backendRawWrite,
34
+ writable: false,
35
+ enumerable: false,
36
+ configurable: false,
37
+ },
38
+ };
39
+ if (options.beginFrame !== null && options.beginFrame !== undefined) {
40
+ descriptors[BACKEND_BEGIN_FRAME_MARKER] = {
41
+ value: options.beginFrame,
42
+ writable: false,
43
+ enumerable: false,
44
+ configurable: false,
45
+ };
46
+ }
47
+ Object.defineProperties(backend, descriptors);
48
+ return backend;
49
+ }
50
+ //# sourceMappingURL=backendSharedMarkers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backendSharedMarkers.js","sourceRoot":"","sources":["../../src/backend/backendSharedMarkers.ts"],"names":[],"mappings":"AACA,OAAO,EACL,0BAA0B,EAC1B,+BAA+B,EAC/B,sBAAsB,EACtB,8BAA8B,EAC9B,wBAAwB,GACzB,MAAM,eAAe,CAAC;AAUvB,MAAM,eAAe,GAAG,CAAC,CAAC,IAAY,EAAQ,EAAE;IAC9C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC1D,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;IAC1E,CAAC;AACH,CAAC,CAA2B,CAAC;AAE7B,MAAM,UAAU,oBAAoB,CAClC,OAAiB,EACjB,OAA6B;IAE7B,MAAM,WAAW,GAA0B;QACzC,CAAC,+BAA+B,CAAC,EAAE;YACjC,KAAK,EAAE,OAAO,CAAC,wBAAwB;YACvC,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;SACpB;QACD,CAAC,8BAA8B,CAAC,EAAE;YAChC,KAAK,EAAE,OAAO,CAAC,aAAa;YAC5B,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;SACpB;QACD,CAAC,sBAAsB,CAAC,EAAE;YACxB,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;SACpB;QACD,CAAC,wBAAwB,CAAC,EAAE;YAC1B,KAAK,EAAE,eAAe;YACtB,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;SACpB;KACF,CAAC;IAEF,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpE,WAAW,CAAC,0BAA0B,CAAC,GAAG;YACxC,KAAK,EAAE,OAAO,CAAC,UAAU;YACzB,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;SACpB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC9C,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,15 @@
1
+ export type BackendEmojiWidthPolicy = "auto" | "wide" | "narrow";
2
+ export type ResolvedEmojiWidthPolicy = "wide" | "narrow";
3
+ /**
4
+ * Resolve backend emoji width policy and align core/native width models.
5
+ *
6
+ * Resolution order:
7
+ * 1) explicit `requested` ("wide"/"narrow")
8
+ * 2) explicit native override (`nativeConfig.widthPolicy|width_policy`)
9
+ * 3) env override (`ZRUI_EMOJI_WIDTH_POLICY`)
10
+ * 4) optional probe (CPR-based) when `ZRUI_EMOJI_WIDTH_PROBE=1`
11
+ * 5) deterministic default ("wide")
12
+ */
13
+ export declare function resolveBackendEmojiWidthPolicy(requested: BackendEmojiWidthPolicy | undefined, nativeConfig: Readonly<Record<string, unknown>>): Promise<ResolvedEmojiWidthPolicy>;
14
+ export declare function applyEmojiWidthPolicy(policy: ResolvedEmojiWidthPolicy): 0 | 1;
15
+ //# sourceMappingURL=emojiWidthPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emojiWidthPolicy.d.ts","sourceRoot":"","sources":["../../src/backend/emojiWidthPolicy.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AACjE,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAoMzD;;;;;;;;;GASG;AACH,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,uBAAuB,GAAG,SAAS,EAC9C,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAC9C,OAAO,CAAC,wBAAwB,CAAC,CA8BnC;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,wBAAwB,GAAG,CAAC,GAAG,CAAC,CAG7E"}
@@ -0,0 +1,229 @@
1
+ import { ZrUiError, setTextMeasureEmojiPolicy } from "@rezi-ui/core";
2
+ const NATIVE_WIDTH_POLICY_NARROW = 0;
3
+ const NATIVE_WIDTH_POLICY_WIDE = 1;
4
+ const PROBE_TIMEOUT_MS_DEFAULT = 80;
5
+ const PROBE_GLYPHS = Object.freeze(["😀", "🚀", "🧪"]);
6
+ const ENV_EMOJI_WIDTH_POLICY = "ZRUI_EMOJI_WIDTH_POLICY";
7
+ const ENV_EMOJI_WIDTH_PROBE = "ZRUI_EMOJI_WIDTH_PROBE";
8
+ let cachedProbePolicy = null;
9
+ let cachedProbePromise = null;
10
+ function normalizePolicy(raw) {
11
+ if (typeof raw !== "string")
12
+ return null;
13
+ const value = raw.trim().toLowerCase();
14
+ if (value === "auto")
15
+ return "auto";
16
+ if (value === "wide")
17
+ return "wide";
18
+ if (value === "narrow")
19
+ return "narrow";
20
+ return null;
21
+ }
22
+ function nativeWidthPolicyToResolved(value) {
23
+ return value === NATIVE_WIDTH_POLICY_NARROW ? "narrow" : "wide";
24
+ }
25
+ function resolvedToNativeWidthPolicy(value) {
26
+ return value === "narrow" ? NATIVE_WIDTH_POLICY_NARROW : NATIVE_WIDTH_POLICY_WIDE;
27
+ }
28
+ function readNativeWidthPolicyValues(cfg) {
29
+ const parse = (value, key) => {
30
+ if (value === undefined)
31
+ return null;
32
+ if (typeof value !== "number" || !Number.isInteger(value) || (value !== 0 && value !== 1)) {
33
+ throw new ZrUiError("ZRUI_INVALID_PROPS", `createNodeBackend config mismatch: nativeConfig.${key} must be 0 (narrow) or 1 (wide).`);
34
+ }
35
+ return value;
36
+ };
37
+ const record = cfg;
38
+ return {
39
+ camel: parse(record.widthPolicy, "widthPolicy"),
40
+ snake: parse(record.width_policy, "width_policy"),
41
+ };
42
+ }
43
+ function readNativeWidthPolicyOverride(cfg) {
44
+ const values = readNativeWidthPolicyValues(cfg);
45
+ if (values.camel !== null && values.snake !== null && values.camel !== values.snake) {
46
+ throw new ZrUiError("ZRUI_INVALID_PROPS", `createNodeBackend config mismatch: nativeConfig.widthPolicy=${String(values.camel)} must match nativeConfig.width_policy=${String(values.snake)}.`);
47
+ }
48
+ const nativeValue = values.camel ?? values.snake;
49
+ if (nativeValue === null)
50
+ return null;
51
+ return nativeWidthPolicyToResolved(nativeValue);
52
+ }
53
+ function pushParsedCpr(buffer, out) {
54
+ let pending = buffer;
55
+ while (pending.length > 0) {
56
+ const esc = pending.indexOf("\x1b[");
57
+ if (esc < 0) {
58
+ if (pending.length > 128)
59
+ pending = pending.slice(-128);
60
+ break;
61
+ }
62
+ if (esc > 0) {
63
+ pending = pending.slice(esc);
64
+ }
65
+ const end = pending.indexOf("R", 2);
66
+ if (end < 0)
67
+ break;
68
+ const seq = pending.slice(0, end + 1);
69
+ pending = pending.slice(end + 1);
70
+ const body = seq.slice(2, seq.length - 1);
71
+ const sep = body.indexOf(";");
72
+ if (sep <= 0 || sep >= body.length - 1)
73
+ continue;
74
+ const rowText = body.slice(0, sep);
75
+ const colText = body.slice(sep + 1);
76
+ if (!/^\d+$/.test(rowText) || !/^\d+$/.test(colText))
77
+ continue;
78
+ const row = Number.parseInt(rowText, 10);
79
+ const col = Number.parseInt(colText, 10);
80
+ if (Number.isFinite(row) && Number.isFinite(col)) {
81
+ out.push({ row, col });
82
+ }
83
+ }
84
+ return pending;
85
+ }
86
+ async function probeGlyphWidthViaCpr(glyph, timeoutMs) {
87
+ const stdin = process.stdin;
88
+ const stdout = process.stdout;
89
+ if (!stdin.isTTY || !stdout.isTTY)
90
+ return null;
91
+ if (typeof stdin.setRawMode !== "function")
92
+ return null;
93
+ const wasRaw = stdin.isRaw === true;
94
+ let pending = "";
95
+ const cprs = [];
96
+ const onData = (chunk) => {
97
+ const text = typeof chunk === "string" ? chunk : chunk.toString("utf8");
98
+ pending = pushParsedCpr(pending + text, cprs);
99
+ };
100
+ let timeout = null;
101
+ try {
102
+ stdin.on("data", onData);
103
+ stdin.resume();
104
+ if (!wasRaw)
105
+ stdin.setRawMode(true);
106
+ // Save cursor, move to a stable column, query CPR, print glyph, query CPR again, restore cursor.
107
+ await new Promise((resolve, reject) => {
108
+ stdout.write(`\x1b[s\x1b[999;1H\x1b[6n${glyph}\x1b[6n\x1b[u`, (err) => {
109
+ if (err)
110
+ reject(err);
111
+ else
112
+ resolve();
113
+ });
114
+ });
115
+ await new Promise((resolve) => {
116
+ const done = () => {
117
+ if (timeout)
118
+ clearTimeout(timeout);
119
+ timeout = null;
120
+ resolve();
121
+ };
122
+ timeout = setTimeout(done, timeoutMs);
123
+ const poll = () => {
124
+ if (cprs.length >= 2) {
125
+ done();
126
+ return;
127
+ }
128
+ setTimeout(poll, 2);
129
+ };
130
+ poll();
131
+ });
132
+ }
133
+ catch {
134
+ return null;
135
+ }
136
+ finally {
137
+ if (timeout)
138
+ clearTimeout(timeout);
139
+ stdin.off("data", onData);
140
+ if (!wasRaw) {
141
+ try {
142
+ stdin.setRawMode(false);
143
+ }
144
+ catch {
145
+ // no-op
146
+ }
147
+ }
148
+ }
149
+ const a = cprs[0];
150
+ const b = cprs[1];
151
+ if (!a || !b)
152
+ return null;
153
+ if (b.row !== a.row)
154
+ return null;
155
+ const delta = b.col - a.col;
156
+ if (delta === 1 || delta === 2)
157
+ return delta;
158
+ return null;
159
+ }
160
+ async function probeTerminalEmojiWidthPolicy(timeoutMs) {
161
+ const widths = [];
162
+ for (const glyph of PROBE_GLYPHS) {
163
+ const width = await probeGlyphWidthViaCpr(glyph, timeoutMs);
164
+ if (width !== null)
165
+ widths.push(width);
166
+ }
167
+ if (widths.length === 0)
168
+ return null;
169
+ if (widths.includes(1))
170
+ return "narrow";
171
+ return "wide";
172
+ }
173
+ async function probeTerminalEmojiWidthPolicyCached(timeoutMs) {
174
+ if (cachedProbePolicy !== null)
175
+ return cachedProbePolicy;
176
+ if (cachedProbePromise)
177
+ return cachedProbePromise;
178
+ cachedProbePromise = probeTerminalEmojiWidthPolicy(timeoutMs)
179
+ .then((probed) => {
180
+ if (probed !== null)
181
+ cachedProbePolicy = probed;
182
+ return probed;
183
+ })
184
+ .finally(() => {
185
+ cachedProbePromise = null;
186
+ });
187
+ return cachedProbePromise;
188
+ }
189
+ /**
190
+ * Resolve backend emoji width policy and align core/native width models.
191
+ *
192
+ * Resolution order:
193
+ * 1) explicit `requested` ("wide"/"narrow")
194
+ * 2) explicit native override (`nativeConfig.widthPolicy|width_policy`)
195
+ * 3) env override (`ZRUI_EMOJI_WIDTH_POLICY`)
196
+ * 4) optional probe (CPR-based) when `ZRUI_EMOJI_WIDTH_PROBE=1`
197
+ * 5) deterministic default ("wide")
198
+ */
199
+ export async function resolveBackendEmojiWidthPolicy(requested, nativeConfig) {
200
+ const requestedPolicy = requested ?? "auto";
201
+ const nativeOverride = readNativeWidthPolicyOverride(nativeConfig);
202
+ if (requestedPolicy === "narrow" || requestedPolicy === "wide") {
203
+ if (nativeOverride !== null && nativeOverride !== requestedPolicy) {
204
+ throw new ZrUiError("ZRUI_INVALID_PROPS", `createNodeBackend config mismatch: emojiWidthPolicy=${requestedPolicy} must match nativeConfig.widthPolicy/width_policy=${nativeOverride === "narrow" ? 0 : 1}.`);
205
+ }
206
+ return requestedPolicy;
207
+ }
208
+ if (nativeOverride !== null)
209
+ return nativeOverride;
210
+ const envOverride = normalizePolicy(process.env[ENV_EMOJI_WIDTH_POLICY]);
211
+ if (envOverride === "wide" || envOverride === "narrow")
212
+ return envOverride;
213
+ /*
214
+ CPR probing is opt-in because it temporarily consumes stdin bytes while
215
+ collecting CPR responses, which can race startup-time key streams.
216
+ */
217
+ const probeEnabled = process.env[ENV_EMOJI_WIDTH_PROBE] === "1";
218
+ if (probeEnabled) {
219
+ const probed = await probeTerminalEmojiWidthPolicyCached(PROBE_TIMEOUT_MS_DEFAULT);
220
+ if (probed !== null)
221
+ return probed;
222
+ }
223
+ return "wide";
224
+ }
225
+ export function applyEmojiWidthPolicy(policy) {
226
+ setTextMeasureEmojiPolicy(policy);
227
+ return resolvedToNativeWidthPolicy(policy);
228
+ }
229
+ //# sourceMappingURL=emojiWidthPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emojiWidthPolicy.js","sourceRoot":"","sources":["../../src/backend/emojiWidthPolicy.ts"],"names":[],"mappings":"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"}
@@ -15,10 +15,16 @@ export type NodeBackendConfig = Readonly<{
15
15
  * - "inline": single-thread inline backend (no worker-hop transport)
16
16
  */
17
17
  executionMode?: "auto" | "worker" | "inline";
18
+ /**
19
+ * @deprecated Prefer createNodeApp({ config: { fpsCap } }) so app/core and backend
20
+ * remain aligned by construction.
21
+ */
18
22
  fpsCap?: number;
23
+ /**
24
+ * @deprecated Prefer createNodeApp({ config: { maxEventBytes } }) so app/core and backend
25
+ * remain aligned by construction.
26
+ */
19
27
  maxEventBytes?: number;
20
- /** Request drawlist v2 for native cursor support (default: false for compatibility) */
21
- useDrawlistV2?: boolean;
22
28
  /**
23
29
  * Frame transport mode:
24
30
  * - "auto": prefer SAB mailbox transport when available, fallback to transfer.
@@ -35,6 +41,16 @@ export type NodeBackendConfig = Readonly<{
35
41
  * Keys are forwarded as-is (camelCase or snake_case accepted by the native parser).
36
42
  */
37
43
  nativeConfig?: Readonly<Record<string, unknown>>;
44
+ /**
45
+ * Emoji width policy used to keep core layout measurement and native rendering aligned.
46
+ * - "auto": use native/env overrides; optional probe when `ZRUI_EMOJI_WIDTH_PROBE=1`
47
+ * then fallback to deterministic "wide"
48
+ * - "wide": emoji clusters consume 2 cells
49
+ * - "narrow": emoji clusters consume 1 cell
50
+ *
51
+ * This sets core text measurement policy and native `widthPolicy` together.
52
+ */
53
+ emojiWidthPolicy?: "auto" | "wide" | "narrow";
38
54
  }>;
39
55
  export type NodeBackendInternalOpts = Readonly<{
40
56
  config?: NodeBackendConfig;
@@ -58,5 +74,17 @@ export type NodeBackend = RuntimeBackend & Readonly<{
58
74
  debug: DebugBackend;
59
75
  perf: NodeBackendPerf;
60
76
  }>;
77
+ export type NodeBackendExecutionModeSelectionInput = Readonly<{
78
+ requestedExecutionMode: "auto" | "worker" | "inline";
79
+ fpsCap: number;
80
+ nativeShimModule?: string;
81
+ hasAnyTty: boolean;
82
+ }>;
83
+ export type NodeBackendExecutionModeSelection = Readonly<{
84
+ resolvedExecutionMode: "worker" | "inline";
85
+ selectedExecutionMode: "worker" | "inline";
86
+ fallbackReason: string | null;
87
+ }>;
88
+ export declare function selectNodeBackendExecutionMode(input: NodeBackendExecutionModeSelectionInput): NodeBackendExecutionModeSelection;
61
89
  export declare function createNodeBackendInternal(opts?: NodeBackendInternalOpts): NodeBackend;
62
90
  //# sourceMappingURL=nodeBackend.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nodeBackend.d.ts","sourceRoot":"","sources":["../../src/backend/nodeBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAEV,YAAY,EAKZ,cAAc,EAEf,MAAM,eAAe,CAAC;AAkCvB,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uFAAuF;IACvF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,KAAK,CAAC;IAC7C,2CAA2C;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mDAAmD;IACnD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAClD,CAAC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC7C,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC7C,MAAM,EAAE,QAAQ,CACd,MAAM,CACJ,MAAM,EACN;QACE,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;KAC5B,CACF,CACF,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,YAAY,EAAE,MAAM,OAAO,CAAC,uBAAuB,CAAC,CAAC;CACtD,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,CAAC,CAAC;AAwKpG,wBAAgB,yBAAyB,CAAC,IAAI,GAAE,uBAA4B,GAAG,WAAW,CAq3BzF"}
1
+ {"version":3,"file":"nodeBackend.d.ts","sourceRoot":"","sources":["../../src/backend/nodeBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAEV,YAAY,EAKZ,cAAc,EAGf,MAAM,eAAe,CAAC;AAuDvB,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC7C;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,KAAK,CAAC;IAC7C,2CAA2C;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mDAAmD;IACnD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;CAC/C,CAAC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC7C,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC7C,MAAM,EAAE,QAAQ,CACd,MAAM,CACJ,MAAM,EACN;QACE,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;KAC5B,CACF,CACF,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,YAAY,EAAE,MAAM,OAAO,CAAC,uBAAuB,CAAC,CAAC;CACtD,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,CAAC,CAAC;AAEpG,MAAM,MAAM,sCAAsC,GAAG,QAAQ,CAAC;IAC5D,sBAAsB,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,MAAM,iCAAiC,GAAG,QAAQ,CAAC;IACvD,qBAAqB,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3C,qBAAqB,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3C,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC,CAAC;AA0FH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,sCAAsC,GAC5C,iCAAiC,CAenC;AAgLD,wBAAgB,yBAAyB,CAAC,IAAI,GAAE,uBAA4B,GAAG,WAAW,CA6tCzF"}