@kerusiweb/core 2.3.0 → 3.0.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.
- package/LICENSE +22 -22
- package/README.md +70 -68
- package/dist/kerusi/index.d.ts +4 -3
- package/dist/kerusi/index.d.ts.map +1 -1
- package/dist/kerusi/index.js +4 -3
- package/dist/kerusi/index.js.map +1 -1
- package/dist/kerusi/kerusi-geometry.d.ts +47 -0
- package/dist/kerusi/kerusi-geometry.d.ts.map +1 -0
- package/dist/kerusi/kerusi-geometry.js +111 -0
- package/dist/kerusi/kerusi-geometry.js.map +1 -0
- package/dist/kerusi/kerusi-map.model.d.ts +121 -68
- package/dist/kerusi/kerusi-map.model.d.ts.map +1 -1
- package/dist/kerusi/kerusi-map.model.js +6 -2
- package/dist/kerusi/kerusi-map.model.js.map +1 -1
- package/dist/kerusi/kerusi-rows.d.ts +2 -2
- package/dist/kerusi/kerusi-rows.js +2 -2
- package/dist/kerusi/kerusi-validator.d.ts +18 -9
- package/dist/kerusi/kerusi-validator.d.ts.map +1 -1
- package/dist/kerusi/kerusi-validator.js +301 -122
- package/dist/kerusi/kerusi-validator.js.map +1 -1
- package/dist/render/build-render-model.d.ts +8 -4
- package/dist/render/build-render-model.d.ts.map +1 -1
- package/dist/render/build-render-model.js +147 -45
- package/dist/render/build-render-model.js.map +1 -1
- package/dist/render/index.d.ts +1 -1
- package/dist/render/index.d.ts.map +1 -1
- package/dist/render/index.js +1 -1
- package/dist/render/index.js.map +1 -1
- package/dist/render/map-layout.d.ts +92 -0
- package/dist/render/map-layout.d.ts.map +1 -0
- package/dist/render/map-layout.js +93 -0
- package/dist/render/map-layout.js.map +1 -0
- package/dist/render/navigation-order.d.ts +20 -10
- package/dist/render/navigation-order.d.ts.map +1 -1
- package/dist/render/navigation-order.js +72 -57
- package/dist/render/navigation-order.js.map +1 -1
- package/dist/render/render-model.d.ts +48 -26
- package/dist/render/render-model.d.ts.map +1 -1
- package/dist/render/seat-shapes.d.ts +3 -3
- package/dist/render/seat-shapes.js +3 -3
- package/dist/view/rtl.d.ts +1 -1
- package/dist/view/rtl.js +1 -1
- package/dist/view/seat-aria.d.ts +6 -0
- package/dist/view/seat-aria.d.ts.map +1 -1
- package/dist/view/seat-aria.js +8 -0
- package/dist/view/seat-aria.js.map +1 -1
- package/dist/view/seat-glyph.d.ts +1 -1
- package/dist/view/seat-glyph.d.ts.map +1 -1
- package/dist/view/viewport.d.ts +35 -7
- package/dist/view/viewport.d.ts.map +1 -1
- package/dist/view/viewport.js +56 -7
- package/dist/view/viewport.js.map +1 -1
- package/package.json +42 -42
- package/dist/kerusi/kerusi-layout-mode.d.ts +0 -58
- package/dist/kerusi/kerusi-layout-mode.d.ts.map +0 -1
- package/dist/kerusi/kerusi-layout-mode.js +0 -117
- package/dist/kerusi/kerusi-layout-mode.js.map +0 -1
- package/dist/render/section-layout.d.ts +0 -66
- package/dist/render/section-layout.d.ts.map +0 -1
- package/dist/render/section-layout.js +0 -186
- package/dist/render/section-layout.js.map +0 -1
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import { elementStyle } from './element-shapes.js';
|
|
2
|
-
const DEFAULTS = {
|
|
3
|
-
seatSize: 28,
|
|
4
|
-
seatGap: 6,
|
|
5
|
-
freeformBasis: 1000,
|
|
6
|
-
};
|
|
7
|
-
/** Padding around the seating area, as a multiple of the seat size. */
|
|
8
|
-
const PADDING_RATIO = 0.5;
|
|
9
|
-
/**
|
|
10
|
-
* Places a section's seats and elements. Dispatches on the section's own
|
|
11
|
-
* resolved layout mode, so a map may mix grid, freeform and mixed sections —
|
|
12
|
-
* the pre-1.0 adapter collapsed the whole map to a single mode.
|
|
13
|
-
*
|
|
14
|
-
* `mixed` is laid out as freeform: §4.3.1 makes `x`/`y` authoritative for
|
|
15
|
-
* visual placement when both are present. Its `col` survives on the seat and is
|
|
16
|
-
* consumed by `navigation-order.ts`.
|
|
17
|
-
*/
|
|
18
|
-
export function computeSectionLayout(section, options = {}) {
|
|
19
|
-
return section.layoutMode === 'grid'
|
|
20
|
-
? computeGridLayout(section, options)
|
|
21
|
-
: computeFreeformLayout(section, options);
|
|
22
|
-
}
|
|
23
|
-
// --- grid -------------------------------------------------------------------
|
|
24
|
-
/**
|
|
25
|
-
* Places seats and elements on the `(row, col)` lattice.
|
|
26
|
-
*
|
|
27
|
-
* Both axes reserve space the same way. A column no seat occupies is simply
|
|
28
|
-
* empty space — §4.3.2's "no filler objects": the gap that is an aisle needs no
|
|
29
|
-
* placeholder seat, and none is synthesized. A row no seat occupies is an empty
|
|
30
|
-
* row the document declared (§4.2.2), already materialized in `section.rows`,
|
|
31
|
-
* so it costs a full row pitch here without this function knowing it is empty.
|
|
32
|
-
* That is what opens the throw between a cinema screen and row A.
|
|
33
|
-
*/
|
|
34
|
-
function computeGridLayout(section, options) {
|
|
35
|
-
const size = options.seatSize ?? DEFAULTS.seatSize;
|
|
36
|
-
const gap = options.seatGap ?? DEFAULTS.seatGap;
|
|
37
|
-
const pitch = size + gap;
|
|
38
|
-
const padding = size * PADDING_RATIO;
|
|
39
|
-
const columns = columnExtent(section);
|
|
40
|
-
const rowCount = Math.max(section.rows.length, 1);
|
|
41
|
-
const width = padding * 2 + columns.count * pitch - gap;
|
|
42
|
-
const height = padding * 2 + rowCount * pitch - gap;
|
|
43
|
-
/** Column index → x, mirrored when the locale reads right-to-left. */
|
|
44
|
-
const colX = (col) => {
|
|
45
|
-
const offset = options.rtl ? columns.max - col : col - columns.min;
|
|
46
|
-
return padding + offset * pitch;
|
|
47
|
-
};
|
|
48
|
-
const seats = [];
|
|
49
|
-
for (const row of section.rows) {
|
|
50
|
-
const y = padding + row.index * pitch;
|
|
51
|
-
row.seats.forEach((seat, i) => {
|
|
52
|
-
// A grid seat is required to carry `col` (§4.5); fall back to its index
|
|
53
|
-
// so an unvalidated document still draws something in order.
|
|
54
|
-
const x = colX(seat.col ?? columns.min + i);
|
|
55
|
-
seats.push(box(seat, x, y, size, size, seat.rotation ?? 0));
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
const elements = section.elements.map((element) => {
|
|
59
|
-
// §4.4.1: in grid mode width/height are column and row spans in cells, not
|
|
60
|
-
// percentages — a two-seat-wide lavatory is `{ col: 1, width: 2 }`, and a
|
|
61
|
-
// screen filling two empty rows is `{ row: "screen-1", height: 2 }`. The
|
|
62
|
-
// spec requires positive integers; a fractional span is an
|
|
63
|
-
// `element-span-invalid` the validator rejects, and is rounded here so an
|
|
64
|
-
// unvalidated document still draws something.
|
|
65
|
-
const spanY = gridSpan(element.height);
|
|
66
|
-
// Omitting `col` spans the section's full column extent and ignores
|
|
67
|
-
// `width` — the usual form for a screen or a stage (§4.4.1).
|
|
68
|
-
const elWidth = element.col !== undefined
|
|
69
|
-
? gridSpan(element.width) * pitch - gap
|
|
70
|
-
: columns.count * pitch - gap;
|
|
71
|
-
const elHeight = spanY * pitch - gap;
|
|
72
|
-
// An element carrying x/y in a grid section violates §4.4.1 and the
|
|
73
|
-
// validator rejects it; it still places, by percentage of the section box,
|
|
74
|
-
// rather than collapsing into the corner.
|
|
75
|
-
const x = element.col !== undefined
|
|
76
|
-
? colX(element.col)
|
|
77
|
-
: element.x !== undefined
|
|
78
|
-
? (element.x / 100) * width - elWidth / 2
|
|
79
|
-
: padding;
|
|
80
|
-
const y = element.rowIndex !== undefined
|
|
81
|
-
? padding + element.rowIndex * pitch
|
|
82
|
-
: element.y !== undefined
|
|
83
|
-
? (element.y / 100) * height - elHeight / 2
|
|
84
|
-
: padding;
|
|
85
|
-
return elementBox(element, x, y, elWidth, elHeight);
|
|
86
|
-
});
|
|
87
|
-
return { width, height, seats, elements };
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* A grid `width`/`height`, normalized. §4.4.1 makes these positive integers
|
|
91
|
-
* defaulting to 1; rounding rather than rejecting keeps an invalid document
|
|
92
|
-
* drawable, since the validator is what refuses it.
|
|
93
|
-
*/
|
|
94
|
-
function gridSpan(span) {
|
|
95
|
-
return Math.max(Math.round(span ?? 1), 1);
|
|
96
|
-
}
|
|
97
|
-
/** The lowest and highest column any seat occupies, and how many that spans. */
|
|
98
|
-
function columnExtent(section) {
|
|
99
|
-
const cols = section.seats
|
|
100
|
-
.map((s) => s.col)
|
|
101
|
-
.filter((c) => c !== undefined && c !== null);
|
|
102
|
-
// An element's `width` is a column span in grid mode, so a two-cell-wide
|
|
103
|
-
// lavatory at column 4 reaches column 5 and the canvas must cover it.
|
|
104
|
-
const elementCols = section.elements
|
|
105
|
-
.filter((e) => e.col !== undefined && e.col !== null)
|
|
106
|
-
.flatMap((e) => [e.col, e.col + gridSpan(e.width) - 1]);
|
|
107
|
-
const all = [...cols, ...elementCols];
|
|
108
|
-
if (all.length === 0) {
|
|
109
|
-
const fallback = Math.max(...section.rows.map((r) => r.seats.length), 1);
|
|
110
|
-
return { min: 0, max: fallback - 1, count: fallback };
|
|
111
|
-
}
|
|
112
|
-
const min = Math.min(...all);
|
|
113
|
-
const max = Math.max(...all);
|
|
114
|
-
return { min, max, count: max - min + 1 };
|
|
115
|
-
}
|
|
116
|
-
// --- freeform / mixed -------------------------------------------------------
|
|
117
|
-
/**
|
|
118
|
-
* Places seats from percentage coordinates inside a box of the section's
|
|
119
|
-
* aspect ratio. Because the box *is* the viewBox, percentages map linearly and
|
|
120
|
-
* no letterboxing is needed — the SVG's `preserveAspectRatio` handles fitting
|
|
121
|
-
* the box into whatever space CSS gives it.
|
|
122
|
-
*/
|
|
123
|
-
function computeFreeformLayout(section, options) {
|
|
124
|
-
const width = options.freeformBasis ?? DEFAULTS.freeformBasis;
|
|
125
|
-
const height = width / parseAspectRatio(options.aspectRatio ?? section.aspectRatio);
|
|
126
|
-
const size = options.seatSize ?? Math.min(width, height) * 0.05;
|
|
127
|
-
const seats = section.seats.map((seat) => {
|
|
128
|
-
const centerX = ((seat.x ?? 0) / 100) * width;
|
|
129
|
-
const centerY = ((seat.y ?? 0) / 100) * height;
|
|
130
|
-
return box(seat, centerX - size / 2, centerY - size / 2, size, size, seat.rotation ?? 0);
|
|
131
|
-
});
|
|
132
|
-
const elements = section.elements.map((element) => {
|
|
133
|
-
// In freeform mode width/height are percentages of the section box.
|
|
134
|
-
const elWidth = ((element.width ?? 6) / 100) * width;
|
|
135
|
-
const elHeight = ((element.height ?? 6) / 100) * height;
|
|
136
|
-
const centerX = ((element.x ?? 50) / 100) * width;
|
|
137
|
-
const centerY = ((element.y ?? 50) / 100) * height;
|
|
138
|
-
return elementBox(element, centerX - elWidth / 2, centerY - elHeight / 2, elWidth, elHeight);
|
|
139
|
-
});
|
|
140
|
-
return { width, height, seats, elements };
|
|
141
|
-
}
|
|
142
|
-
/** "16:9" → 1.777…. Falls back to square for anything unparseable. */
|
|
143
|
-
function parseAspectRatio(ratio) {
|
|
144
|
-
const [w, h] = ratio.split(':').map(Number);
|
|
145
|
-
return w > 0 && h > 0 ? w / h : 1;
|
|
146
|
-
}
|
|
147
|
-
// --- shared -----------------------------------------------------------------
|
|
148
|
-
function box(seat, x, y, width, height, rotation) {
|
|
149
|
-
return {
|
|
150
|
-
seat,
|
|
151
|
-
x,
|
|
152
|
-
y,
|
|
153
|
-
width,
|
|
154
|
-
height,
|
|
155
|
-
centerX: x + width / 2,
|
|
156
|
-
centerY: y + height / 2,
|
|
157
|
-
fontSize: width * 0.4,
|
|
158
|
-
rotation,
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
function elementBox(element, x, y, width, height) {
|
|
162
|
-
return {
|
|
163
|
-
element,
|
|
164
|
-
x,
|
|
165
|
-
y,
|
|
166
|
-
width,
|
|
167
|
-
height,
|
|
168
|
-
centerX: x + width / 2,
|
|
169
|
-
centerY: y + height / 2,
|
|
170
|
-
fontSize: elementFontSize(element, width, height),
|
|
171
|
-
rotation: element.rotation ?? 0,
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
/** Average glyph advance as a fraction of the font size, for fitting text to a width. */
|
|
175
|
-
const GLYPH_WIDTH = 0.6;
|
|
176
|
-
function elementFontSize(element, width, height) {
|
|
177
|
-
if (elementStyle(element.kind).shape !== 'text') {
|
|
178
|
-
return Math.max(Math.min(height * 0.5, width * 0.18), 6);
|
|
179
|
-
}
|
|
180
|
-
// A text element has no box to read from, so the height sets the size and the
|
|
181
|
-
// width only shrinks it, so the whole label fits however long it is.
|
|
182
|
-
const base = Math.max(height * 0.6, 6);
|
|
183
|
-
const length = element.label?.length ?? 0;
|
|
184
|
-
return length ? Math.min(base, width / (length * GLYPH_WIDTH)) : base;
|
|
185
|
-
}
|
|
186
|
-
//# sourceMappingURL=section-layout.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"section-layout.js","sourceRoot":"","sources":["../../src/render/section-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AA8DnD,MAAM,QAAQ,GAAG;IACf,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,CAAC;IACV,aAAa,EAAE,IAAI;CACX,CAAC;AAEX,uEAAuE;AACvE,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAsB,EACtB,UAAgC,EAAE;IAElC,OAAO,OAAO,CAAC,UAAU,KAAK,MAAM;QAClC,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC;QACrC,CAAC,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,+EAA+E;AAE/E;;;;;;;;;GASG;AACH,SAAS,iBAAiB,CAAC,OAAsB,EAAE,OAA6B;IAC9E,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,GAAG,GAAG,CAAC;IACzB,MAAM,OAAO,GAAG,IAAI,GAAG,aAAa,CAAC;IAErC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAElD,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC;IACxD,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,GAAG,QAAQ,GAAG,KAAK,GAAG,GAAG,CAAC;IAEpD,sEAAsE;IACtE,MAAM,IAAI,GAAG,CAAC,GAAW,EAAU,EAAE;QACnC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACnE,OAAO,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;IAClC,CAAC,CAAC;IAEF,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,OAAO,GAAG,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;QACtC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YAC5B,wEAAwE;YACxE,6DAA6D;YAC7D,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAoB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACjE,2EAA2E;QAC3E,0EAA0E;QAC1E,yEAAyE;QACzE,2DAA2D;QAC3D,0EAA0E;QAC1E,8CAA8C;QAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvC,oEAAoE;QACpE,6DAA6D;QAC7D,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,KAAK,SAAS;YACvB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,GAAG;YACvC,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC;QAClC,MAAM,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC;QAErC,oEAAoE;QACpE,2EAA2E;QAC3E,0CAA0C;QAC1C,MAAM,CAAC,GACL,OAAO,CAAC,GAAG,KAAK,SAAS;YACvB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;YACnB,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,SAAS;gBACvB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,GAAG,OAAO,GAAG,CAAC;gBACzC,CAAC,CAAC,OAAO,CAAC;QAChB,MAAM,CAAC,GACL,OAAO,CAAC,QAAQ,KAAK,SAAS;YAC5B,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,KAAK;YACpC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,SAAS;gBACvB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,GAAG,QAAQ,GAAG,CAAC;gBAC3C,CAAC,CAAC,OAAO,CAAC;QAEhB,OAAO,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,SAAS,QAAQ,CAAC,IAAwB;IACxC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,gFAAgF;AAChF,SAAS,YAAY,CAAC,OAAsB;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;SACjB,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAC7D,yEAAyE;IACzE,sEAAsE;IACtE,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ;SACjC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC;SACpD,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAI,EAAE,CAAC,CAAC,GAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,WAAW,CAAC,CAAC;IAEtC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACzE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACxD,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IAC7B,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,+EAA+E;AAE/E;;;;;GAKG;AACH,SAAS,qBAAqB,CAC5B,OAAsB,EACtB,OAA6B;IAE7B,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC;IAC9D,MAAM,MAAM,GAAG,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IACpF,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAEhE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACvC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;QAC9C,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;QAC/C,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAChD,oEAAoE;QACpE,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;QACrD,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;QACxD,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;QAClD,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;QACnD,OAAO,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC5C,CAAC;AAED,sEAAsE;AACtE,SAAS,gBAAgB,CAAC,KAAa;IACrC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,+EAA+E;AAE/E,SAAS,GAAG,CACV,IAAgB,EAChB,CAAS,EACT,CAAS,EACT,KAAa,EACb,MAAc,EACd,QAAgB;IAEhB,OAAO;QACL,IAAI;QACJ,CAAC;QACD,CAAC;QACD,KAAK;QACL,MAAM;QACN,OAAO,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC;QACtB,OAAO,EAAE,CAAC,GAAG,MAAM,GAAG,CAAC;QACvB,QAAQ,EAAE,KAAK,GAAG,GAAG;QACrB,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CACjB,OAAsB,EACtB,CAAS,EACT,CAAS,EACT,KAAa,EACb,MAAc;IAEd,OAAO;QACL,OAAO;QACP,CAAC;QACD,CAAC;QACD,KAAK;QACL,MAAM;QACN,OAAO,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC;QACtB,OAAO,EAAE,CAAC,GAAG,MAAM,GAAG,CAAC;QACvB,QAAQ,EAAE,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC;QACjD,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,yFAAyF;AACzF,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB,SAAS,eAAe,CAAC,OAAsB,EAAE,KAAa,EAAE,MAAc;IAC5E,IAAI,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,8EAA8E;IAC9E,qEAAqE;IACrE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxE,CAAC"}
|