@profullstack/hqtui 0.1.0

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 (98) hide show
  1. package/README.md +144 -0
  2. package/dist/ansi.d.ts +42 -0
  3. package/dist/ansi.d.ts.map +1 -0
  4. package/dist/ansi.js +66 -0
  5. package/dist/ansi.js.map +1 -0
  6. package/dist/app.d.ts +128 -0
  7. package/dist/app.d.ts.map +1 -0
  8. package/dist/app.js +296 -0
  9. package/dist/app.js.map +1 -0
  10. package/dist/buffer.d.ts +50 -0
  11. package/dist/buffer.d.ts.map +1 -0
  12. package/dist/buffer.js +184 -0
  13. package/dist/buffer.js.map +1 -0
  14. package/dist/capabilities.d.ts +36 -0
  15. package/dist/capabilities.d.ts.map +1 -0
  16. package/dist/capabilities.js +93 -0
  17. package/dist/capabilities.js.map +1 -0
  18. package/dist/color.d.ts +47 -0
  19. package/dist/color.d.ts.map +1 -0
  20. package/dist/color.js +176 -0
  21. package/dist/color.js.map +1 -0
  22. package/dist/diff.d.ts +39 -0
  23. package/dist/diff.d.ts.map +1 -0
  24. package/dist/diff.js +203 -0
  25. package/dist/diff.js.map +1 -0
  26. package/dist/graphics/blocks.d.ts +26 -0
  27. package/dist/graphics/blocks.d.ts.map +1 -0
  28. package/dist/graphics/blocks.js +49 -0
  29. package/dist/graphics/blocks.js.map +1 -0
  30. package/dist/graphics/braille.d.ts +33 -0
  31. package/dist/graphics/braille.d.ts.map +1 -0
  32. package/dist/graphics/braille.js +166 -0
  33. package/dist/graphics/braille.js.map +1 -0
  34. package/dist/graphics/index.d.ts +4 -0
  35. package/dist/graphics/index.d.ts.map +1 -0
  36. package/dist/graphics/index.js +4 -0
  37. package/dist/graphics/index.js.map +1 -0
  38. package/dist/graphics/plot.d.ts +91 -0
  39. package/dist/graphics/plot.d.ts.map +1 -0
  40. package/dist/graphics/plot.js +291 -0
  41. package/dist/graphics/plot.js.map +1 -0
  42. package/dist/index.d.ts +34 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +42 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/input.d.ts +62 -0
  47. package/dist/input.d.ts.map +1 -0
  48. package/dist/input.js +245 -0
  49. package/dist/input.js.map +1 -0
  50. package/dist/layout.d.ts +51 -0
  51. package/dist/layout.d.ts.map +1 -0
  52. package/dist/layout.js +163 -0
  53. package/dist/layout.js.map +1 -0
  54. package/dist/surface.d.ts +81 -0
  55. package/dist/surface.d.ts.map +1 -0
  56. package/dist/surface.js +181 -0
  57. package/dist/surface.js.map +1 -0
  58. package/dist/terminal.d.ts +63 -0
  59. package/dist/terminal.d.ts.map +1 -0
  60. package/dist/terminal.js +189 -0
  61. package/dist/terminal.js.map +1 -0
  62. package/dist/testing.d.ts +71 -0
  63. package/dist/testing.d.ts.map +1 -0
  64. package/dist/testing.js +171 -0
  65. package/dist/testing.js.map +1 -0
  66. package/dist/theme.d.ts +58 -0
  67. package/dist/theme.d.ts.map +1 -0
  68. package/dist/theme.js +238 -0
  69. package/dist/theme.js.map +1 -0
  70. package/dist/ui.d.ts +194 -0
  71. package/dist/ui.d.ts.map +1 -0
  72. package/dist/ui.js +439 -0
  73. package/dist/ui.js.map +1 -0
  74. package/dist/unicode.d.ts +36 -0
  75. package/dist/unicode.d.ts.map +1 -0
  76. package/dist/unicode.js +221 -0
  77. package/dist/unicode.js.map +1 -0
  78. package/dist/widgets/controls.d.ts +95 -0
  79. package/dist/widgets/controls.d.ts.map +1 -0
  80. package/dist/widgets/controls.js +231 -0
  81. package/dist/widgets/controls.js.map +1 -0
  82. package/dist/widgets/index.d.ts +5 -0
  83. package/dist/widgets/index.d.ts.map +1 -0
  84. package/dist/widgets/index.js +5 -0
  85. package/dist/widgets/index.js.map +1 -0
  86. package/dist/widgets/meters.d.ts +100 -0
  87. package/dist/widgets/meters.d.ts.map +1 -0
  88. package/dist/widgets/meters.js +209 -0
  89. package/dist/widgets/meters.js.map +1 -0
  90. package/dist/widgets/table.d.ts +92 -0
  91. package/dist/widgets/table.d.ts.map +1 -0
  92. package/dist/widgets/table.js +228 -0
  93. package/dist/widgets/table.js.map +1 -0
  94. package/dist/widgets/text.d.ts +64 -0
  95. package/dist/widgets/text.d.ts.map +1 -0
  96. package/dist/widgets/text.js +123 -0
  97. package/dist/widgets/text.js.map +1 -0
  98. package/package.json +56 -0
@@ -0,0 +1,291 @@
1
+ import { gradient as makeGradient, mix } from "../color.js";
2
+ import { BrailleCanvas } from "./braille.js";
3
+ import { verticalGlyph, horizontalGlyph } from "./blocks.js";
4
+ import { seriesColor } from "../theme.js";
5
+ function extent(seriesList, options) {
6
+ let min = options.min;
7
+ let max = options.max;
8
+ if (min === undefined || max === undefined) {
9
+ let lo = Infinity;
10
+ let hi = -Infinity;
11
+ for (const s of seriesList) {
12
+ for (const v of s.values) {
13
+ if (!Number.isFinite(v))
14
+ continue;
15
+ if (v < lo)
16
+ lo = v;
17
+ if (v > hi)
18
+ hi = v;
19
+ }
20
+ }
21
+ if (!Number.isFinite(lo)) {
22
+ lo = 0;
23
+ hi = 1;
24
+ }
25
+ min = min ?? Math.min(0, lo);
26
+ max = max ?? hi;
27
+ }
28
+ if (max <= min)
29
+ max = min + 1;
30
+ return [min, max];
31
+ }
32
+ function drawGrid(surface, color, bg) {
33
+ const { width: w, height: h } = surface;
34
+ for (let y = 0; y < h; y += Math.max(2, Math.floor(h / 4))) {
35
+ for (let x = 0; x < w; x += 2)
36
+ surface.char(x, y, "·", { fg: color, bg });
37
+ }
38
+ }
39
+ /**
40
+ * Draw one or more series across the whole surface.
41
+ * With `mode: "braille"` each cell carries a 2x4 pixel matrix, so a 40x10 panel
42
+ * plots at 80x40 resolution.
43
+ */
44
+ export function plot(surface, series, options = {}) {
45
+ if (surface.empty || series.length === 0)
46
+ return;
47
+ const theme = surface.theme;
48
+ const mode = options.mode ?? "braille";
49
+ const bg = options.background;
50
+ const w = surface.width;
51
+ const h = surface.height;
52
+ // Only the samples that will actually be drawn should set the scale, or an
53
+ // old spike still sitting in the history buffer flattens the live line.
54
+ const columns = mode === "braille" ? w * 2 : w;
55
+ const visible = series.map((s) => ({ ...s, values: s.values.slice(-Math.max(1, columns)) }));
56
+ const [min, max] = extent(visible, options);
57
+ const span = max - min;
58
+ series = visible;
59
+ if (options.grid)
60
+ drawGrid(surface, options.gridColor ?? mix(theme.border, theme.background, 0.4), bg);
61
+ if (mode === "block" || mode === "ascii" || mode === "half") {
62
+ // One column per cell, newest value on the right.
63
+ series.forEach((s, si) => {
64
+ const color = s.color ?? options.color ?? seriesColor(theme, si);
65
+ const ramp = options.colors ? makeGradient(options.colors) : undefined;
66
+ for (let x = 0; x < w; x++) {
67
+ const idx = s.values.length - w + x;
68
+ const v = idx >= 0 ? s.values[idx] : undefined;
69
+ if (v === undefined || !Number.isFinite(v))
70
+ continue;
71
+ const ratio = (v - min) / span;
72
+ const filled = ratio * h;
73
+ const full = Math.floor(filled);
74
+ const cellColor = ramp ? ramp(ratio) : color;
75
+ for (let k = 0; k < full && k < h; k++) {
76
+ surface.char(x, h - 1 - k, "█", { fg: cellColor, bg });
77
+ }
78
+ if (full < h) {
79
+ const glyph = verticalGlyph(filled - full, mode);
80
+ if (glyph !== " ")
81
+ surface.char(x, h - 1 - full, glyph, { fg: cellColor, bg });
82
+ }
83
+ }
84
+ });
85
+ return;
86
+ }
87
+ // Braille: build one canvas per series so colors stay separable.
88
+ const canvas = new BrailleCanvas(w, h);
89
+ const px = canvas.width;
90
+ const py = canvas.height;
91
+ series.forEach((s, si) => {
92
+ canvas.clear();
93
+ const color = s.color ?? options.color ?? seriesColor(theme, si);
94
+ const values = s.values;
95
+ if (values.length === 0)
96
+ return;
97
+ const count = Math.min(values.length, px);
98
+ const start = values.length - count;
99
+ const points = [];
100
+ for (let i = 0; i < count; i++) {
101
+ const v = values[start + i];
102
+ if (!Number.isFinite(v))
103
+ continue;
104
+ const ratio = (v - min) / span;
105
+ const x = count === 1 ? px - 1 : Math.round((i / (count - 1)) * (px - 1));
106
+ const y = Math.round((1 - Math.max(0, Math.min(1, ratio))) * (py - 1));
107
+ points.push([x, y]);
108
+ }
109
+ if (points.length === 0)
110
+ return;
111
+ if (points.length === 1)
112
+ canvas.pixel(points[0][0], points[0][1]);
113
+ else
114
+ canvas.polyline(points);
115
+ const wantFill = s.fill ?? options.fill ?? false;
116
+ const fillAlpha = options.fillAlpha ?? 0.35;
117
+ if (wantFill) {
118
+ const area = new BrailleCanvas(w, h);
119
+ area.polyline(points);
120
+ area.fillUnder(points, py - 1);
121
+ // Fade the shading downwards so the line stays the brightest thing on screen.
122
+ const base = bg ?? theme.background;
123
+ blit(surface, area, (_col, row) => {
124
+ const depth = h <= 1 ? 0 : row / (h - 1);
125
+ return mix(base, color, fillAlpha * (1 - depth * 0.6));
126
+ }, bg);
127
+ }
128
+ const ramp = options.colors ? makeGradient(options.colors) : undefined;
129
+ blit(surface, canvas, (col, row) => {
130
+ if (!ramp)
131
+ return color;
132
+ return ramp(1 - row / Math.max(1, h - 1));
133
+ }, bg);
134
+ });
135
+ }
136
+ /** Copy a Braille canvas onto a surface, one glyph per cell. */
137
+ export function blit(surface, canvas, colorAt, bg) {
138
+ for (let row = 0; row < canvas.rows; row++) {
139
+ for (let col = 0; col < canvas.cols; col++) {
140
+ const value = canvas.cell(col, row);
141
+ if (value === 0)
142
+ continue;
143
+ surface.char(col, row, value, { fg: colorAt(col, row), bg });
144
+ }
145
+ }
146
+ }
147
+ /** A single-row trend line. Cheap enough to put in a table cell. */
148
+ export function sparkline(surface, values, options = {}) {
149
+ if (surface.empty)
150
+ return;
151
+ const theme = surface.theme;
152
+ const w = surface.width;
153
+ const windowed = values.slice(-Math.max(1, w));
154
+ const [min, max] = extent([{ values: windowed }], options);
155
+ const span = max - min;
156
+ const ramp = options.colors ? makeGradient(options.colors) : undefined;
157
+ const color = options.color ?? theme.accent;
158
+ const count = Math.min(values.length, w);
159
+ const start = values.length - count;
160
+ const offset = w - count;
161
+ for (let i = 0; i < count; i++) {
162
+ const v = values[start + i];
163
+ if (!Number.isFinite(v))
164
+ continue;
165
+ const ratio = Math.max(0, Math.min(1, (v - min) / span));
166
+ surface.char(offset + i, 0, verticalGlyph(ratio, options.mode ?? "block"), {
167
+ fg: ramp ? ramp(ratio) : color,
168
+ bg: options.background,
169
+ });
170
+ }
171
+ }
172
+ /** A horizontal bar filling the surface's first row. */
173
+ export function bar(surface, options) {
174
+ if (surface.empty)
175
+ return;
176
+ const theme = surface.theme;
177
+ const w = surface.width;
178
+ const ratio = Math.max(0, Math.min(1, options.value));
179
+ const style = options.style ?? "smooth";
180
+ const trackColor = options.track ?? mix(theme.background, theme.border, 0.8);
181
+ const heat = options.heat ? makeGradient(theme.heat) : undefined;
182
+ const color = options.color ?? theme.primary;
183
+ const trackChar = options.trackChar ?? (style === "ascii" ? "-" : style === "segmented" ? "░" : "─");
184
+ const filled = ratio * w;
185
+ const full = Math.floor(filled);
186
+ for (let x = 0; x < w; x++) {
187
+ if (x < full) {
188
+ surface.char(x, 0, style === "ascii" ? "#" : "█", {
189
+ fg: heat ? heat(w <= 1 ? ratio : x / (w - 1)) : color,
190
+ bg: options.background,
191
+ });
192
+ }
193
+ else if (x === full && style !== "segmented") {
194
+ const glyph = horizontalGlyph(filled - full, style === "ascii" ? "ascii" : "block");
195
+ surface.char(x, 0, glyph === " " ? trackChar : glyph, {
196
+ fg: glyph === " " ? trackColor : heat ? heat(ratio) : color,
197
+ bg: options.background,
198
+ });
199
+ }
200
+ else {
201
+ surface.char(x, 0, trackChar, { fg: trackColor, bg: options.background });
202
+ }
203
+ }
204
+ }
205
+ /**
206
+ * A semicircular dial drawn with Braille. Needs about 9x5 cells to look right.
207
+ */
208
+ export function gauge(surface, options) {
209
+ if (surface.empty || surface.height < 3) {
210
+ bar(surface, { value: options.value, color: options.color, heat: options.heat });
211
+ return;
212
+ }
213
+ const theme = surface.theme;
214
+ const ratio = Math.max(0, Math.min(1, options.value));
215
+ const canvas = new BrailleCanvas(surface.width, surface.height);
216
+ const cx = canvas.width / 2;
217
+ const cy = canvas.height - 2;
218
+ const radius = Math.min(canvas.width / 2 - 1, canvas.height - 3);
219
+ const heat = makeGradient(theme.heat);
220
+ const arcColors = [];
221
+ const steps = Math.max(24, Math.round(radius * 4));
222
+ for (let i = 0; i <= steps; i++) {
223
+ const t = i / steps;
224
+ const angle = Math.PI * (1 - t);
225
+ const x = cx + Math.cos(angle) * radius;
226
+ const y = cy - Math.sin(angle) * radius * 0.85;
227
+ if (t <= ratio) {
228
+ canvas.pixel(x, y);
229
+ canvas.pixel(x, y - 1);
230
+ arcColors.push(t);
231
+ }
232
+ }
233
+ const color = options.color ?? (options.heat === false ? theme.primary : heat(ratio));
234
+ blit(surface, canvas, () => color, options.background);
235
+ // Unfilled remainder of the dial, dimmed.
236
+ const rest = new BrailleCanvas(surface.width, surface.height);
237
+ for (let i = 0; i <= steps; i++) {
238
+ const t = i / steps;
239
+ if (t <= ratio)
240
+ continue;
241
+ const angle = Math.PI * (1 - t);
242
+ rest.pixel(cx + Math.cos(angle) * radius, cy - Math.sin(angle) * radius * 0.85);
243
+ }
244
+ blit(surface, rest, () => mix(theme.background, theme.border, 0.9), options.background);
245
+ if (options.label) {
246
+ const y = surface.height - 1;
247
+ surface.textAligned(y, options.label, "center", { fg: color, attrs: 1 });
248
+ }
249
+ }
250
+ /** A ring chart. Reads well from about 12x6 cells. */
251
+ export function donut(surface, options) {
252
+ if (surface.empty)
253
+ return;
254
+ const theme = surface.theme;
255
+ const total = options.segments.reduce((a, s) => a + Math.max(0, s.value), 0) || 1;
256
+ const canvas = new BrailleCanvas(surface.width, surface.height);
257
+ const cx = canvas.width / 2;
258
+ const cy = canvas.height / 2;
259
+ const outer = Math.min(canvas.width / 2, canvas.height / 2) - 1;
260
+ const inner = outer * 0.55;
261
+ const colorFor = new Map();
262
+ let angle = -Math.PI / 2;
263
+ options.segments.forEach((seg, i) => {
264
+ const sweep = (Math.max(0, seg.value) / total) * Math.PI * 2;
265
+ const color = seg.color ?? seriesColor(theme, i);
266
+ const steps = Math.max(8, Math.round(sweep * outer * 3));
267
+ for (let s = 0; s <= steps; s++) {
268
+ const a = angle + (sweep * s) / steps;
269
+ for (let r = inner; r <= outer; r += 0.4) {
270
+ const x = Math.round(cx + Math.cos(a) * r);
271
+ const y = Math.round(cy + Math.sin(a) * r * 0.9);
272
+ canvas.pixel(x, y);
273
+ colorFor.set(`${x >> 1},${y >> 2}`, color);
274
+ }
275
+ }
276
+ angle += sweep;
277
+ });
278
+ blit(surface, canvas, (col, row) => colorFor.get(`${col},${row}`) ?? theme.muted, options.background);
279
+ }
280
+ /** Vertical column chart, one column per value, newest on the right. */
281
+ export function histogram(surface, options) {
282
+ plot(surface, [{ values: options.values }], {
283
+ mode: "block",
284
+ color: options.color,
285
+ colors: options.colors,
286
+ background: options.background,
287
+ max: options.max,
288
+ min: 0,
289
+ });
290
+ }
291
+ //# sourceMappingURL=plot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plot.js","sourceRoot":"","sources":["../../src/graphics/plot.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,QAAQ,IAAI,YAAY,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAiB,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA4B1C,SAAS,MAAM,CAAC,UAAoB,EAAE,OAAoB;IACxD,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACtB,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACtB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QAC3C,IAAI,EAAE,GAAG,QAAQ,CAAC;QAClB,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC;QACnB,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;gBACzB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,SAAS;gBAClC,IAAI,CAAC,GAAG,EAAE;oBAAE,EAAE,GAAG,CAAC,CAAC;gBACnB,IAAI,CAAC,GAAG,EAAE;oBAAE,EAAE,GAAG,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACzB,EAAE,GAAG,CAAC,CAAC;YACP,EAAE,GAAG,CAAC,CAAC;QACT,CAAC;QACD,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7B,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC;IAClB,CAAC;IACD,IAAI,GAAG,IAAI,GAAG;QAAE,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,QAAQ,CAAC,OAAgB,EAAE,KAAY,EAAE,EAAU;IAC1D,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAAC,OAAgB,EAAE,MAAgB,EAAE,UAAuB,EAAE;IAChF,IAAI,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC;IACvC,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAC9B,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IACxB,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,2EAA2E;IAC3E,wEAAwE;IACxE,MAAM,OAAO,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7F,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;IACvB,MAAM,GAAG,OAAO,CAAC;IAEjB,IAAI,OAAO,CAAC,IAAI;QAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAEvG,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5D,kDAAkD;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;YACvB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACjE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;gBACpC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC/C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,SAAS;gBACrD,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;gBAC/B,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;gBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAChC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACvC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;gBACzD,CAAC;gBACD,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;oBACb,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;oBACjD,IAAI,KAAK,KAAK,GAAG;wBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;gBACjF,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,iEAAiE;IACjE,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IACxB,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC;IAEzB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QACvB,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;QACxB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;QACpC,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAS;YAClC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;YAC/B,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1E,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAChC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;YAC7D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE7B,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC;QACjD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;QAC5C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,IAAI,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACtB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;YAC/B,8EAA8E;YAC9E,MAAM,IAAI,GAAG,EAAE,IAAI,KAAK,CAAC,UAAU,CAAC;YACpC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;gBAChC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzC,OAAO,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC;YACzD,CAAC,EAAE,EAAE,CAAC,CAAC;QACT,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACjC,IAAI,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YACxB,OAAO,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,IAAI,CAClB,OAAgB,EAChB,MAAqB,EACrB,OAA4C,EAC5C,EAAU;IAEV,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;QAC3C,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACpC,IAAI,KAAK,KAAK,CAAC;gBAAE,SAAS;YAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;AACH,CAAC;AAWD,oEAAoE;AACpE,MAAM,UAAU,SAAS,CAAC,OAAgB,EAAE,MAAgB,EAAE,UAA4B,EAAE;IAC1F,IAAI,OAAO,CAAC,KAAK;QAAE,OAAO;IAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IACxB,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;IACvB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;IACpC,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,SAAS;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE;YACzE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK;YAC9B,EAAE,EAAE,OAAO,CAAC,UAAU;SACvB,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAeD,wDAAwD;AACxD,MAAM,UAAU,GAAG,CAAC,OAAgB,EAAE,OAAmB;IACvD,IAAI,OAAO,CAAC,KAAK;QAAE,OAAO;IAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC;IACxC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAErG,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE;gBAChD,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;gBACrD,EAAE,EAAE,OAAO,CAAC,UAAU;aACvB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACpF,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE;gBACpD,EAAE,EAAE,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK;gBAC3D,EAAE,EAAE,OAAO,CAAC,UAAU;aACvB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;AACH,CAAC;AAUD;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,OAAgB,EAAE,OAAqB;IAC3D,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEtC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;QACxC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;QAC/C,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACtF,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAEvD,0CAA0C;IAC1C,MAAM,IAAI,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,IAAI,KAAK;YAAE,SAAS;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAExF,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7B,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAOD,sDAAsD;AACtD,MAAM,UAAU,KAAK,CAAC,OAAgB,EAAE,OAAqB;IAC3D,IAAI,OAAO,CAAC,KAAK;QAAE,OAAO;IAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAiB,CAAC;IAE1C,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;YACtC,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;gBACzC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;gBACjD,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnB,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QACD,KAAK,IAAI,KAAK,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;AACxG,CAAC;AAUD,wEAAwE;AACxE,MAAM,UAAU,SAAS,CAAC,OAAgB,EAAE,OAAyB;IACnE,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE;QAC1C,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,CAAC;KACP,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * HQTUI — High Quality Terminal UI for TypeScript.
3
+ *
4
+ * import { createApp } from "@profullstack/hqtui";
5
+ *
6
+ * const app = await createApp();
7
+ * app.render(({ ui }) => {
8
+ * ui.panel({ title: "Hello" }, panel => panel.text("Hello, terminal."));
9
+ * });
10
+ * await app.start();
11
+ *
12
+ * Dark theme, mouse, truecolor, resize handling and terminal restoration are
13
+ * all on by default. https://hqtui.com
14
+ */
15
+ export { App, createApp, type AppOptions, type RenderArgs, type RenderFn, type FrameStats } from "./app.ts";
16
+ export { Container, GridContainer } from "./ui.ts";
17
+ export type { RenderContext, ContainerOptions, PanelOptions, GridOptions, CellOptions, HitRegion, } from "./ui.ts";
18
+ export { Terminal, createTerminal, emergencyRestore, type TerminalOptions, type TerminalSize } from "./terminal.ts";
19
+ export { detectCapabilities, type Capabilities, type ColorDepth, type CapabilityOverrides } from "./capabilities.ts";
20
+ export { FrameBuffer, Attr, type Style, type Attributes } from "./buffer.ts";
21
+ export { Encoder, encodeFull, type EncodeResult } from "./diff.ts";
22
+ export { Surface, createSurface, BORDERS, type BorderStyle, type BoxOptions, type Align } from "./surface.ts";
23
+ export { ansi, stripAnsi, moveTo, setTitle } from "./ansi.ts";
24
+ export { rgb, hex, ansi256, gradient, gradientSteps, mix, alpha, lighten, darken, grayscale, luminance, contrast, to256, to16, from256, DEFAULT_COLOR, type Color, } from "./color.ts";
25
+ export { themes, themeList, defineTheme, resolveTheme, elevate, heatColor, seriesColor, type Theme, type ThemeName, } from "./theme.ts";
26
+ export { solve, stack, inset, intersect, contains, isEmpty, fixed, percent, flex, auto, fill, remaining, minmax, normalizePadding, type Rect, type Size, type Constraint, type Padding, } from "./layout.ts";
27
+ export { InputParser, matchKey, type InputEvent, type KeyEvent, type MouseEvent, type PasteEvent, type FocusEvent } from "./input.ts";
28
+ export { stringWidth, truncate, fit, wrap, graphemes, charWidth } from "./unicode.ts";
29
+ export { BrailleCanvas } from "./graphics/braille.ts";
30
+ export { plot, blit, sparkline, bar, gauge, donut, histogram, verticalGlyph, horizontalGlyph, shadeGlyph, bestMode, type Series, type PlotOptions, type FillMode, } from "./graphics/index.ts";
31
+ export * as widgets from "./widgets/index.ts";
32
+ export { renderToScreen, renderToText, renderToAnsi, renderToHtml, renderFrames } from "./testing.ts";
33
+ export type { RenderedScreen, RenderOptions, CellSnapshot } from "./testing.ts";
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC5G,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,YAAY,EACV,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,GACnF,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGrH,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AAC9G,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAG9D,OAAO,EACL,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAClF,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,KAAK,GACrE,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAC7E,KAAK,KAAK,EAAE,KAAK,SAAS,GAC3B,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACnF,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,OAAO,GACzF,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAGtI,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGtF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACL,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EACnD,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EACpD,KAAK,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,GAC7C,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAG9C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACtG,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,42 @@
1
+ /**
2
+ * HQTUI — High Quality Terminal UI for TypeScript.
3
+ *
4
+ * import { createApp } from "@profullstack/hqtui";
5
+ *
6
+ * const app = await createApp();
7
+ * app.render(({ ui }) => {
8
+ * ui.panel({ title: "Hello" }, panel => panel.text("Hello, terminal."));
9
+ * });
10
+ * await app.start();
11
+ *
12
+ * Dark theme, mouse, truecolor, resize handling and terminal restoration are
13
+ * all on by default. https://hqtui.com
14
+ */
15
+ export { App, createApp } from "./app.js";
16
+ export { Container, GridContainer } from "./ui.js";
17
+ // Terminal + capabilities
18
+ export { Terminal, createTerminal, emergencyRestore } from "./terminal.js";
19
+ export { detectCapabilities } from "./capabilities.js";
20
+ // Rendering core
21
+ export { FrameBuffer, Attr } from "./buffer.js";
22
+ export { Encoder, encodeFull } from "./diff.js";
23
+ export { Surface, createSurface, BORDERS } from "./surface.js";
24
+ export { ansi, stripAnsi, moveTo, setTitle } from "./ansi.js";
25
+ // Color
26
+ export { rgb, hex, ansi256, gradient, gradientSteps, mix, alpha, lighten, darken, grayscale, luminance, contrast, to256, to16, from256, DEFAULT_COLOR, } from "./color.js";
27
+ // Theme
28
+ export { themes, themeList, defineTheme, resolveTheme, elevate, heatColor, seriesColor, } from "./theme.js";
29
+ // Layout
30
+ export { solve, stack, inset, intersect, contains, isEmpty, fixed, percent, flex, auto, fill, remaining, minmax, normalizePadding, } from "./layout.js";
31
+ // Input
32
+ export { InputParser, matchKey } from "./input.js";
33
+ // Text
34
+ export { stringWidth, truncate, fit, wrap, graphemes, charWidth } from "./unicode.js";
35
+ // Graphics
36
+ export { BrailleCanvas } from "./graphics/braille.js";
37
+ export { plot, blit, sparkline, bar, gauge, donut, histogram, verticalGlyph, horizontalGlyph, shadeGlyph, bestMode, } from "./graphics/index.js";
38
+ // Widgets (for drawing straight onto a Surface)
39
+ export * as widgets from "./widgets/index.js";
40
+ // Headless rendering + testing
41
+ export { renderToScreen, renderToText, renderToAnsi, renderToHtml, renderFrames } from "./testing.js";
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,GAAG,EAAE,SAAS,EAAoE,MAAM,UAAU,CAAC;AAC5G,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAKnD,0BAA0B;AAC1B,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAA2C,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,kBAAkB,EAAgE,MAAM,mBAAmB,CAAC;AAErH,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,IAAI,EAA+B,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAqB,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAiD,MAAM,cAAc,CAAC;AAC9G,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE9D,QAAQ;AACR,OAAO,EACL,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAClF,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,GACzD,MAAM,YAAY,CAAC;AAEpB,QAAQ;AACR,OAAO,EACL,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,GAE9E,MAAM,YAAY,CAAC;AAEpB,SAAS;AACT,OAAO,EACL,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACnF,SAAS,EAAE,MAAM,EAAE,gBAAgB,GACpC,MAAM,aAAa,CAAC;AAErB,QAAQ;AACR,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAqF,MAAM,YAAY,CAAC;AAEtI,OAAO;AACP,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEtF,WAAW;AACX,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACL,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EACnD,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,GAErD,MAAM,qBAAqB,CAAC;AAE7B,gDAAgD;AAChD,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAE9C,+BAA+B;AAC/B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Decodes raw terminal bytes into normalized events. Applications should never
3
+ * see an escape sequence — only `"ctrl+c"`, `"up"`, or a printable character.
4
+ */
5
+ export interface KeyEvent {
6
+ type: "key";
7
+ /** Normalized name: "a", "up", "enter", "f5", "escape", "space", … */
8
+ name: string;
9
+ ctrl: boolean;
10
+ alt: boolean;
11
+ shift: boolean;
12
+ /** The printable character, when there is one. */
13
+ char?: string;
14
+ /** Full form including modifiers, e.g. "ctrl+c" — what you usually match on. */
15
+ key: string;
16
+ raw: string;
17
+ }
18
+ export interface MouseEvent {
19
+ type: "mouse";
20
+ action: "press" | "release" | "move" | "drag" | "scroll";
21
+ button: "left" | "middle" | "right" | "none";
22
+ /** Zero-based cell coordinates. */
23
+ x: number;
24
+ y: number;
25
+ /** -1 up, 1 down; 0 when this is not a scroll. */
26
+ scroll: number;
27
+ ctrl: boolean;
28
+ alt: boolean;
29
+ shift: boolean;
30
+ }
31
+ export interface PasteEvent {
32
+ type: "paste";
33
+ text: string;
34
+ }
35
+ export interface FocusEvent {
36
+ type: "focus";
37
+ focused: boolean;
38
+ }
39
+ export type InputEvent = KeyEvent | MouseEvent | PasteEvent | FocusEvent;
40
+ /**
41
+ * Feed it chunks, get events. Stateful so a sequence split across two reads
42
+ * (common over SSH) still decodes correctly.
43
+ */
44
+ export declare class InputParser {
45
+ private pending;
46
+ private pasteBuffer;
47
+ /** True when bytes are buffered awaiting the rest of a sequence. */
48
+ get hasPending(): boolean;
49
+ /**
50
+ * Resolve buffered bytes that turned out to be complete after all. A lone ESC
51
+ * is ambiguous — it only becomes the Escape key once no more bytes follow —
52
+ * so the terminal calls this on a short timeout.
53
+ */
54
+ flush(): InputEvent[];
55
+ parse(chunk: string): InputEvent[];
56
+ private parsePlain;
57
+ private parseEscape;
58
+ private decodeMouse;
59
+ }
60
+ /** Does this event match a binding like `"ctrl+c"`, `"q"`, or `"f10"`? */
61
+ export declare function matchKey(event: KeyEvent, binding: string): boolean;
62
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,KAAK,CAAC;IACZ,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzD,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAC7C,mCAAmC;IACnC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AAsCzE;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,WAAW,CAAuB;IAE1C,oEAAoE;IACpE,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;;;OAIG;IACH,KAAK,IAAI,UAAU,EAAE;IAYrB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE;IA4ClC,OAAO,CAAC,UAAU;IA+BlB,OAAO,CAAC,WAAW;IAuEnB,OAAO,CAAC,WAAW;CAmCpB;AAID,0EAA0E;AAC1E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAKlE"}