orez-lite 0.12.21 → 0.13.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/README.md +1 -1
- package/dist/aggregate.d.ts +85 -0
- package/dist/aggregate.d.ts.map +1 -0
- package/dist/aggregate.js +616 -0
- package/dist/aggregate.js.map +1 -0
- package/dist/client/fixture-schema.d.ts +1 -1
- package/package.json +8 -8
- package/dist/rollup.d.ts +0 -82
- package/dist/rollup.d.ts.map +0 -1
- package/dist/rollup.js +0 -592
- package/dist/rollup.js.map +0 -1
package/dist/rollup.js
DELETED
|
@@ -1,592 +0,0 @@
|
|
|
1
|
-
import { createBuilder } from '@rocicorp/zero';
|
|
2
|
-
const ROLLUP_RUNTIME = Symbol.for('orez-lite:rollup-runtime');
|
|
3
|
-
export function count() {
|
|
4
|
-
return { kind: 'count' };
|
|
5
|
-
}
|
|
6
|
-
export function sum(source) {
|
|
7
|
-
return { kind: 'sum', source };
|
|
8
|
-
}
|
|
9
|
-
function quoteIdentifier(identifier) {
|
|
10
|
-
return `"${identifier.replaceAll('"', '""')}"`;
|
|
11
|
-
}
|
|
12
|
-
function tablePhysicalName(table) {
|
|
13
|
-
return table.serverName ?? table.name.replace(/^public\./, '');
|
|
14
|
-
}
|
|
15
|
-
function columnPhysicalName(columnName, column) {
|
|
16
|
-
if (column &&
|
|
17
|
-
typeof column === 'object' &&
|
|
18
|
-
'serverName' in column &&
|
|
19
|
-
typeof column.serverName === 'string') {
|
|
20
|
-
return column.serverName;
|
|
21
|
-
}
|
|
22
|
-
return columnName;
|
|
23
|
-
}
|
|
24
|
-
function ensureOwnColumn(rollupName, tableName, columns, columnName) {
|
|
25
|
-
if (!Object.hasOwn(columns, columnName)) {
|
|
26
|
-
throw new TypeError(`rollup ${rollupName} references unknown column ${tableName}.${columnName}`);
|
|
27
|
-
}
|
|
28
|
-
return columns[columnName];
|
|
29
|
-
}
|
|
30
|
-
export function defineRollups(schema, definitions) {
|
|
31
|
-
const compiled = [];
|
|
32
|
-
const triggerNames = new Set();
|
|
33
|
-
for (const [name, definition] of Object.entries(definitions)) {
|
|
34
|
-
if (!/^[A-Za-z][A-Za-z0-9_]{0,62}$/.test(name)) {
|
|
35
|
-
throw new TypeError(`rollup name must be an identifier of at most 63 characters: ${JSON.stringify(name)}`);
|
|
36
|
-
}
|
|
37
|
-
if (triggerNames.has(name)) {
|
|
38
|
-
throw new TypeError(`duplicate rollup name: ${name}`);
|
|
39
|
-
}
|
|
40
|
-
triggerNames.add(name);
|
|
41
|
-
const source = schema.tables[definition.source];
|
|
42
|
-
const target = schema.tables[definition.target];
|
|
43
|
-
if (!source) {
|
|
44
|
-
throw new TypeError(`rollup ${name} references unknown table ${definition.source}`);
|
|
45
|
-
}
|
|
46
|
-
if (!target) {
|
|
47
|
-
throw new TypeError(`rollup ${name} references unknown table ${definition.target}`);
|
|
48
|
-
}
|
|
49
|
-
if (definition.source === definition.target) {
|
|
50
|
-
throw new TypeError(`rollup ${name} must use different source and target tables`);
|
|
51
|
-
}
|
|
52
|
-
const groups = Object.entries(definition.groupBy).map(([sourceColumnName, targetColumnName]) => {
|
|
53
|
-
if (typeof targetColumnName !== 'string') {
|
|
54
|
-
throw new TypeError(`rollup ${name} has an invalid group mapping`);
|
|
55
|
-
}
|
|
56
|
-
const sourceColumn = ensureOwnColumn(name, definition.source, source.columns, sourceColumnName);
|
|
57
|
-
const targetColumn = ensureOwnColumn(name, definition.target, target.columns, targetColumnName);
|
|
58
|
-
return {
|
|
59
|
-
source: {
|
|
60
|
-
logical: sourceColumnName,
|
|
61
|
-
physical: columnPhysicalName(sourceColumnName, sourceColumn),
|
|
62
|
-
},
|
|
63
|
-
target: {
|
|
64
|
-
logical: targetColumnName,
|
|
65
|
-
physical: columnPhysicalName(targetColumnName, targetColumn),
|
|
66
|
-
},
|
|
67
|
-
};
|
|
68
|
-
});
|
|
69
|
-
if (groups.length === 0) {
|
|
70
|
-
throw new TypeError(`rollup ${name} must group by at least one column`);
|
|
71
|
-
}
|
|
72
|
-
if (new Set(groups.map((group) => group.target.logical)).size !== groups.length) {
|
|
73
|
-
throw new TypeError(`rollup ${name} maps more than one source column to one key`);
|
|
74
|
-
}
|
|
75
|
-
const targetPrimaryKey = [...target.primaryKey];
|
|
76
|
-
const groupedTargetColumns = [...groups].map((group) => group.target.logical).sort();
|
|
77
|
-
if (targetPrimaryKey.length !== groupedTargetColumns.length ||
|
|
78
|
-
[...targetPrimaryKey]
|
|
79
|
-
.sort()
|
|
80
|
-
.some((columnName, index) => columnName !== groupedTargetColumns[index])) {
|
|
81
|
-
throw new TypeError(`rollup ${name} groupBy must map every primary key column of ${definition.target}`);
|
|
82
|
-
}
|
|
83
|
-
const aggregates = Object.entries(definition.aggregates).map(([targetColumnName, aggregate]) => {
|
|
84
|
-
if (!aggregate || typeof aggregate !== 'object') {
|
|
85
|
-
throw new TypeError(`rollup ${name} has an invalid aggregate`);
|
|
86
|
-
}
|
|
87
|
-
const targetColumn = ensureOwnColumn(name, definition.target, target.columns, targetColumnName);
|
|
88
|
-
if (!targetColumn ||
|
|
89
|
-
typeof targetColumn !== 'object' ||
|
|
90
|
-
!('type' in targetColumn) ||
|
|
91
|
-
targetColumn.type !== 'number') {
|
|
92
|
-
throw new TypeError(`rollup ${name} target column ${definition.target}.${targetColumnName} must be numeric`);
|
|
93
|
-
}
|
|
94
|
-
const compiledTarget = {
|
|
95
|
-
logical: targetColumnName,
|
|
96
|
-
physical: columnPhysicalName(targetColumnName, targetColumn),
|
|
97
|
-
};
|
|
98
|
-
const kind = Reflect.get(aggregate, 'kind');
|
|
99
|
-
if (kind === 'count') {
|
|
100
|
-
return { kind: 'count', target: compiledTarget };
|
|
101
|
-
}
|
|
102
|
-
const aggregateSource = Reflect.get(aggregate, 'source');
|
|
103
|
-
if (kind !== 'sum' || typeof aggregateSource !== 'string') {
|
|
104
|
-
throw new TypeError(`rollup ${name} has an invalid aggregate`);
|
|
105
|
-
}
|
|
106
|
-
const sourceColumn = ensureOwnColumn(name, definition.source, source.columns, aggregateSource);
|
|
107
|
-
if (!sourceColumn ||
|
|
108
|
-
typeof sourceColumn !== 'object' ||
|
|
109
|
-
!('type' in sourceColumn) ||
|
|
110
|
-
sourceColumn.type !== 'number') {
|
|
111
|
-
throw new TypeError(`rollup ${name} source column ${definition.source}.${aggregateSource} must be numeric`);
|
|
112
|
-
}
|
|
113
|
-
return {
|
|
114
|
-
kind: 'sum',
|
|
115
|
-
source: {
|
|
116
|
-
logical: aggregateSource,
|
|
117
|
-
physical: columnPhysicalName(aggregateSource, sourceColumn),
|
|
118
|
-
},
|
|
119
|
-
target: compiledTarget,
|
|
120
|
-
};
|
|
121
|
-
});
|
|
122
|
-
if (aggregates.length === 0) {
|
|
123
|
-
throw new TypeError(`rollup ${name} must declare at least one aggregate`);
|
|
124
|
-
}
|
|
125
|
-
if (aggregates.filter((aggregate) => aggregate.kind === 'count').length > 1) {
|
|
126
|
-
throw new TypeError(`rollup ${name} may declare only one count aggregate`);
|
|
127
|
-
}
|
|
128
|
-
if (groups.some((group) => aggregates.some((aggregate) => aggregate.target.logical === group.target.logical))) {
|
|
129
|
-
throw new TypeError(`rollup ${name} cannot aggregate into a primary key column`);
|
|
130
|
-
}
|
|
131
|
-
if (definition.mode === 'materialized') {
|
|
132
|
-
if (!aggregates.some((aggregate) => aggregate.kind === 'count')) {
|
|
133
|
-
throw new TypeError(`materialized rollup ${name} needs a count aggregate to remove empty groups`);
|
|
134
|
-
}
|
|
135
|
-
const ownedTargetColumns = new Set([
|
|
136
|
-
...groups.map((group) => group.target.logical),
|
|
137
|
-
...aggregates.map((aggregate) => aggregate.target.logical),
|
|
138
|
-
]);
|
|
139
|
-
const extraTargetColumn = Object.keys(target.columns).find((columnName) => !ownedTargetColumns.has(columnName));
|
|
140
|
-
if (extraTargetColumn) {
|
|
141
|
-
throw new TypeError(`materialized rollup ${name} target has non-rollup column ${definition.target}.${extraTargetColumn}`);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
else if (definition.mode !== 'existing') {
|
|
145
|
-
throw new TypeError(`rollup ${name} has an invalid target mode`);
|
|
146
|
-
}
|
|
147
|
-
compiled.push({
|
|
148
|
-
name,
|
|
149
|
-
source: {
|
|
150
|
-
logical: definition.source,
|
|
151
|
-
physical: tablePhysicalName(source),
|
|
152
|
-
primaryKey: [...source.primaryKey],
|
|
153
|
-
},
|
|
154
|
-
target: {
|
|
155
|
-
logical: definition.target,
|
|
156
|
-
physical: tablePhysicalName(target),
|
|
157
|
-
primaryKey: targetPrimaryKey,
|
|
158
|
-
},
|
|
159
|
-
mode: definition.mode,
|
|
160
|
-
groups,
|
|
161
|
-
aggregates,
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
const sourceTables = new Set(compiled.map((rollup) => rollup.source.logical));
|
|
165
|
-
for (const rollup of compiled) {
|
|
166
|
-
if (sourceTables.has(rollup.target.logical)) {
|
|
167
|
-
throw new TypeError(`rollup ${rollup.name} target ${rollup.target.logical} cannot feed another rollup`);
|
|
168
|
-
}
|
|
169
|
-
for (const candidate of compiled) {
|
|
170
|
-
if (candidate === rollup || candidate.target.logical !== rollup.target.logical) {
|
|
171
|
-
continue;
|
|
172
|
-
}
|
|
173
|
-
if (rollup.mode === 'materialized' || candidate.mode === 'materialized') {
|
|
174
|
-
throw new TypeError(`materialized rollup target ${rollup.target.logical} may have only one owner`);
|
|
175
|
-
}
|
|
176
|
-
const duplicate = rollup.aggregates.find((aggregate) => candidate.aggregates.some((other) => other.target.logical === aggregate.target.logical));
|
|
177
|
-
if (duplicate) {
|
|
178
|
-
throw new TypeError(`rollup target column ${rollup.target.logical}.${duplicate.target.logical} has more than one owner`);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
const bySource = new Map();
|
|
183
|
-
for (const rollup of compiled) {
|
|
184
|
-
const sourceRollups = bySource.get(rollup.source.logical);
|
|
185
|
-
if (sourceRollups)
|
|
186
|
-
sourceRollups.push(rollup);
|
|
187
|
-
else
|
|
188
|
-
bySource.set(rollup.source.logical, [rollup]);
|
|
189
|
-
}
|
|
190
|
-
return {
|
|
191
|
-
[ROLLUP_RUNTIME]: {
|
|
192
|
-
schema,
|
|
193
|
-
definitions: compiled,
|
|
194
|
-
queryBuilder: createBuilder(schema),
|
|
195
|
-
bySource,
|
|
196
|
-
},
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
function sourceReference(column, row) {
|
|
200
|
-
return `${row}.${quoteIdentifier(column.physical)}`;
|
|
201
|
-
}
|
|
202
|
-
function targetWhere(rollup, row) {
|
|
203
|
-
return rollup.groups
|
|
204
|
-
.map((group) => `${quoteIdentifier(group.target.physical)} IS ${sourceReference(group.source, row)}`)
|
|
205
|
-
.join(' AND ');
|
|
206
|
-
}
|
|
207
|
-
function sameGroup(rollup) {
|
|
208
|
-
return rollup.groups
|
|
209
|
-
.map((group) => `${sourceReference(group.source, 'OLD')} IS ${sourceReference(group.source, 'NEW')}`)
|
|
210
|
-
.join(' AND ');
|
|
211
|
-
}
|
|
212
|
-
function aggregateChanged(rollup) {
|
|
213
|
-
const sums = rollup.aggregates.filter((aggregate) => aggregate.kind === 'sum');
|
|
214
|
-
return sums.length
|
|
215
|
-
? sums
|
|
216
|
-
.map((aggregate) => `${sourceReference(aggregate.source, 'OLD')} IS NOT ${sourceReference(aggregate.source, 'NEW')}`)
|
|
217
|
-
.join(' OR ')
|
|
218
|
-
: '0';
|
|
219
|
-
}
|
|
220
|
-
function contribution(aggregate, row) {
|
|
221
|
-
return aggregate.kind === 'count'
|
|
222
|
-
? '1'
|
|
223
|
-
: `COALESCE(${sourceReference(aggregate.source, row)}, 0)`;
|
|
224
|
-
}
|
|
225
|
-
function assignments(rollup, operation) {
|
|
226
|
-
return rollup.aggregates
|
|
227
|
-
.flatMap((aggregate) => {
|
|
228
|
-
const target = quoteIdentifier(aggregate.target.physical);
|
|
229
|
-
if (operation === 'delta') {
|
|
230
|
-
return aggregate.kind === 'sum'
|
|
231
|
-
? [
|
|
232
|
-
`${target} = ${target} + ${contribution(aggregate, 'NEW')} - ${contribution(aggregate, 'OLD')}`,
|
|
233
|
-
]
|
|
234
|
-
: [];
|
|
235
|
-
}
|
|
236
|
-
const operator = operation === 'add' ? '+' : '-';
|
|
237
|
-
const row = operation === 'add' ? 'NEW' : 'OLD';
|
|
238
|
-
return [`${target} = ${target} ${operator} ${contribution(aggregate, row)}`];
|
|
239
|
-
})
|
|
240
|
-
.join(', ');
|
|
241
|
-
}
|
|
242
|
-
function insertColumns(rollup) {
|
|
243
|
-
return [
|
|
244
|
-
...rollup.groups.map((group) => group.target),
|
|
245
|
-
...rollup.aggregates.map((a) => a.target),
|
|
246
|
-
]
|
|
247
|
-
.map((column) => quoteIdentifier(column.physical))
|
|
248
|
-
.join(', ');
|
|
249
|
-
}
|
|
250
|
-
function insertValues(rollup, row) {
|
|
251
|
-
return [
|
|
252
|
-
...rollup.groups.map((group) => sourceReference(group.source, row)),
|
|
253
|
-
...rollup.aggregates.map((aggregate) => contribution(aggregate, row)),
|
|
254
|
-
].join(', ');
|
|
255
|
-
}
|
|
256
|
-
function upsertAssignments(rollup) {
|
|
257
|
-
return rollup.aggregates
|
|
258
|
-
.map((aggregate) => {
|
|
259
|
-
const target = quoteIdentifier(aggregate.target.physical);
|
|
260
|
-
return `${target} = ${target} + excluded.${target}`;
|
|
261
|
-
})
|
|
262
|
-
.join(', ');
|
|
263
|
-
}
|
|
264
|
-
function countTarget(rollup) {
|
|
265
|
-
const aggregate = rollup.aggregates.find((candidate) => candidate.kind === 'count');
|
|
266
|
-
if (!aggregate) {
|
|
267
|
-
throw new TypeError(`materialized rollup ${rollup.name} has no count aggregate`);
|
|
268
|
-
}
|
|
269
|
-
return aggregate.target;
|
|
270
|
-
}
|
|
271
|
-
function watchedSourceColumns(rollup) {
|
|
272
|
-
return [
|
|
273
|
-
...new Set([
|
|
274
|
-
...rollup.groups.map((group) => group.source.physical),
|
|
275
|
-
...rollup.aggregates.flatMap((aggregate) => aggregate.kind === 'sum' ? [aggregate.source.physical] : []),
|
|
276
|
-
]),
|
|
277
|
-
]
|
|
278
|
-
.map(quoteIdentifier)
|
|
279
|
-
.join(', ');
|
|
280
|
-
}
|
|
281
|
-
function backfillStatements(rollup) {
|
|
282
|
-
const sourceTable = quoteIdentifier(rollup.source.physical);
|
|
283
|
-
const targetTable = quoteIdentifier(rollup.target.physical);
|
|
284
|
-
if (rollup.mode === 'materialized') {
|
|
285
|
-
const select = [
|
|
286
|
-
...rollup.groups.map((group) => quoteIdentifier(group.source.physical)),
|
|
287
|
-
...rollup.aggregates.map((aggregate) => aggregate.kind === 'count'
|
|
288
|
-
? 'COUNT(*)'
|
|
289
|
-
: `COALESCE(SUM(${quoteIdentifier(aggregate.source.physical)}), 0)`),
|
|
290
|
-
].join(', ');
|
|
291
|
-
const groupBy = rollup.groups
|
|
292
|
-
.map((group) => quoteIdentifier(group.source.physical))
|
|
293
|
-
.join(', ');
|
|
294
|
-
return [
|
|
295
|
-
`DELETE FROM ${targetTable}`,
|
|
296
|
-
`INSERT INTO ${targetTable} (${insertColumns(rollup)}) SELECT ${select} FROM ${sourceTable} GROUP BY ${groupBy}`,
|
|
297
|
-
];
|
|
298
|
-
}
|
|
299
|
-
const correlation = rollup.groups
|
|
300
|
-
.map((group) => `${sourceTable}.${quoteIdentifier(group.source.physical)} IS ${targetTable}.${quoteIdentifier(group.target.physical)}`)
|
|
301
|
-
.join(' AND ');
|
|
302
|
-
const values = rollup.aggregates
|
|
303
|
-
.map((aggregate) => {
|
|
304
|
-
const target = quoteIdentifier(aggregate.target.physical);
|
|
305
|
-
const value = aggregate.kind === 'count'
|
|
306
|
-
? `COUNT(*)`
|
|
307
|
-
: `COALESCE(SUM(${sourceTable}.${quoteIdentifier(aggregate.source.physical)}), 0)`;
|
|
308
|
-
return `${target} = (SELECT ${value} FROM ${sourceTable} WHERE ${correlation})`;
|
|
309
|
-
})
|
|
310
|
-
.join(', ');
|
|
311
|
-
return [`UPDATE ${targetTable} SET ${values}`];
|
|
312
|
-
}
|
|
313
|
-
function triggerStatements(rollup) {
|
|
314
|
-
const sourceTable = quoteIdentifier(rollup.source.physical);
|
|
315
|
-
const targetTable = quoteIdentifier(rollup.target.physical);
|
|
316
|
-
const insertTrigger = quoteIdentifier(`_orez_rollup_${rollup.name}_insert`);
|
|
317
|
-
const updateTrigger = quoteIdentifier(`_orez_rollup_${rollup.name}_update`);
|
|
318
|
-
const deleteTrigger = quoteIdentifier(`_orez_rollup_${rollup.name}_delete`);
|
|
319
|
-
const keyConflict = rollup.groups
|
|
320
|
-
.map((group) => quoteIdentifier(group.target.physical))
|
|
321
|
-
.join(', ');
|
|
322
|
-
const changedGroup = `NOT (${sameGroup(rollup)})`;
|
|
323
|
-
const sumsChanged = aggregateChanged(rollup);
|
|
324
|
-
if (rollup.mode === 'existing') {
|
|
325
|
-
const updateColumns = watchedSourceColumns(rollup);
|
|
326
|
-
const updateBody = [
|
|
327
|
-
`UPDATE ${targetTable} SET ${assignments(rollup, 'remove')} WHERE ${targetWhere(rollup, 'OLD')} AND ${changedGroup};`,
|
|
328
|
-
`UPDATE ${targetTable} SET ${assignments(rollup, 'add')} WHERE ${targetWhere(rollup, 'NEW')} AND ${changedGroup};`,
|
|
329
|
-
...(assignments(rollup, 'delta')
|
|
330
|
-
? [
|
|
331
|
-
`UPDATE ${targetTable} SET ${assignments(rollup, 'delta')} WHERE ${targetWhere(rollup, 'NEW')} AND (${sameGroup(rollup)}) AND (${sumsChanged});`,
|
|
332
|
-
]
|
|
333
|
-
: []),
|
|
334
|
-
].join(' ');
|
|
335
|
-
return [
|
|
336
|
-
`CREATE TRIGGER ${insertTrigger} AFTER INSERT ON ${sourceTable} BEGIN UPDATE ${targetTable} SET ${assignments(rollup, 'add')} WHERE ${targetWhere(rollup, 'NEW')}; END`,
|
|
337
|
-
`CREATE TRIGGER ${updateTrigger} AFTER UPDATE OF ${updateColumns} ON ${sourceTable} BEGIN ${updateBody} END`,
|
|
338
|
-
`CREATE TRIGGER ${deleteTrigger} AFTER DELETE ON ${sourceTable} BEGIN UPDATE ${targetTable} SET ${assignments(rollup, 'remove')} WHERE ${targetWhere(rollup, 'OLD')}; END`,
|
|
339
|
-
];
|
|
340
|
-
}
|
|
341
|
-
const countColumn = quoteIdentifier(countTarget(rollup).physical);
|
|
342
|
-
const insert = `INSERT INTO ${targetTable} (${insertColumns(rollup)}) VALUES (${insertValues(rollup, 'NEW')}) ON CONFLICT (${keyConflict}) DO UPDATE SET ${upsertAssignments(rollup)};`;
|
|
343
|
-
const updateColumns = watchedSourceColumns(rollup);
|
|
344
|
-
const updateBody = [
|
|
345
|
-
`UPDATE ${targetTable} SET ${assignments(rollup, 'remove')} WHERE ${targetWhere(rollup, 'OLD')} AND ${changedGroup};`,
|
|
346
|
-
`DELETE FROM ${targetTable} WHERE ${targetWhere(rollup, 'OLD')} AND ${countColumn} <= 0 AND ${changedGroup};`,
|
|
347
|
-
`INSERT INTO ${targetTable} (${insertColumns(rollup)}) SELECT ${insertValues(rollup, 'NEW')} WHERE ${changedGroup} ON CONFLICT (${keyConflict}) DO UPDATE SET ${upsertAssignments(rollup)};`,
|
|
348
|
-
...(assignments(rollup, 'delta')
|
|
349
|
-
? [
|
|
350
|
-
`UPDATE ${targetTable} SET ${assignments(rollup, 'delta')} WHERE ${targetWhere(rollup, 'NEW')} AND (${sameGroup(rollup)}) AND (${sumsChanged});`,
|
|
351
|
-
]
|
|
352
|
-
: []),
|
|
353
|
-
].join(' ');
|
|
354
|
-
return [
|
|
355
|
-
`CREATE TRIGGER ${insertTrigger} AFTER INSERT ON ${sourceTable} BEGIN ${insert} END`,
|
|
356
|
-
`CREATE TRIGGER ${updateTrigger} AFTER UPDATE OF ${updateColumns} ON ${sourceTable} BEGIN ${updateBody} END`,
|
|
357
|
-
`CREATE TRIGGER ${deleteTrigger} AFTER DELETE ON ${sourceTable} BEGIN UPDATE ${targetTable} SET ${assignments(rollup, 'remove')} WHERE ${targetWhere(rollup, 'OLD')}; DELETE FROM ${targetTable} WHERE ${targetWhere(rollup, 'OLD')} AND ${countColumn} <= 0; END`,
|
|
358
|
-
];
|
|
359
|
-
}
|
|
360
|
-
export function rollupMigrationStatements(rollups) {
|
|
361
|
-
return rollups[ROLLUP_RUNTIME].definitions.flatMap((rollup) => {
|
|
362
|
-
const triggerNames = ['insert', 'update', 'delete'].map((operation) => quoteIdentifier(`_orez_rollup_${rollup.name}_${operation}`));
|
|
363
|
-
return [
|
|
364
|
-
...triggerNames.map((name) => `DROP TRIGGER IF EXISTS ${name}`),
|
|
365
|
-
...backfillStatements(rollup),
|
|
366
|
-
...triggerStatements(rollup),
|
|
367
|
-
];
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
export function rollupMigrationSQL(rollups) {
|
|
371
|
-
return rollupMigrationStatements(rollups).join('\n--> statement-breakpoint\n');
|
|
372
|
-
}
|
|
373
|
-
function rollupRow(value, context) {
|
|
374
|
-
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
375
|
-
throw new TypeError(`${context} must be a row object`);
|
|
376
|
-
}
|
|
377
|
-
return Object.fromEntries(Object.entries(value));
|
|
378
|
-
}
|
|
379
|
-
function numericValue(value, context, nullable) {
|
|
380
|
-
if (nullable && value === null)
|
|
381
|
-
return 0;
|
|
382
|
-
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
383
|
-
throw new TypeError(`${context} must be a finite number`);
|
|
384
|
-
}
|
|
385
|
-
return value;
|
|
386
|
-
}
|
|
387
|
-
async function readRollupRow(tx, builder, tableName, primaryKey, key) {
|
|
388
|
-
let query = Reflect.get(builder, tableName);
|
|
389
|
-
if (!query || typeof query !== 'object') {
|
|
390
|
-
throw new TypeError(`rollup query table is unavailable: ${tableName}`);
|
|
391
|
-
}
|
|
392
|
-
for (const columnName of primaryKey) {
|
|
393
|
-
const value = key[columnName];
|
|
394
|
-
if (value === undefined || value === null) {
|
|
395
|
-
throw new TypeError(`rollup key ${tableName}.${columnName} must be non-null`);
|
|
396
|
-
}
|
|
397
|
-
const where = Reflect.get(query, 'where');
|
|
398
|
-
if (typeof where !== 'function') {
|
|
399
|
-
throw new TypeError(`rollup query does not support where(): ${tableName}`);
|
|
400
|
-
}
|
|
401
|
-
query = Reflect.apply(where, query, [columnName, '=', value]);
|
|
402
|
-
if (!query || typeof query !== 'object') {
|
|
403
|
-
throw new TypeError(`rollup query returned an invalid value: ${tableName}`);
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
const one = Reflect.get(query, 'one');
|
|
407
|
-
const run = Reflect.get(tx, 'run');
|
|
408
|
-
if (typeof one !== 'function' || typeof run !== 'function') {
|
|
409
|
-
throw new TypeError(`rollup transaction cannot read ${tableName}`);
|
|
410
|
-
}
|
|
411
|
-
const singular = Reflect.apply(one, query, []);
|
|
412
|
-
const result = await Reflect.apply(run, tx, [singular]);
|
|
413
|
-
return result === undefined || result === null
|
|
414
|
-
? null
|
|
415
|
-
: rollupRow(result, `rollup query result for ${tableName}`);
|
|
416
|
-
}
|
|
417
|
-
function groupKey(rollup, row) {
|
|
418
|
-
const key = {};
|
|
419
|
-
for (const group of rollup.groups) {
|
|
420
|
-
const value = row[group.source.logical];
|
|
421
|
-
if (value === undefined || value === null) {
|
|
422
|
-
throw new TypeError(`rollup ${rollup.name} group ${rollup.source.logical}.${group.source.logical} must be non-null`);
|
|
423
|
-
}
|
|
424
|
-
key[group.target.logical] = value;
|
|
425
|
-
}
|
|
426
|
-
return key;
|
|
427
|
-
}
|
|
428
|
-
function sameKey(rollup, left, right) {
|
|
429
|
-
return rollup.groups.every((group) => Object.is(left[group.target.logical], right[group.target.logical]));
|
|
430
|
-
}
|
|
431
|
-
function aggregateContribution(rollup, row) {
|
|
432
|
-
const contribution = {};
|
|
433
|
-
for (const aggregate of rollup.aggregates) {
|
|
434
|
-
contribution[aggregate.target.logical] =
|
|
435
|
-
aggregate.kind === 'count'
|
|
436
|
-
? 1
|
|
437
|
-
: numericValue(row[aggregate.source.logical], `rollup ${rollup.name} source ${rollup.source.logical}.${aggregate.source.logical}`, true);
|
|
438
|
-
}
|
|
439
|
-
return contribution;
|
|
440
|
-
}
|
|
441
|
-
async function mutateRollupTarget(tx, rollup, operation, row) {
|
|
442
|
-
const mutate = Reflect.get(tx, 'mutate');
|
|
443
|
-
if (!mutate || typeof mutate !== 'object') {
|
|
444
|
-
throw new TypeError(`rollup transaction has no mutate object`);
|
|
445
|
-
}
|
|
446
|
-
const tableMutate = Reflect.get(mutate, rollup.target.logical);
|
|
447
|
-
if (!tableMutate || typeof tableMutate !== 'object') {
|
|
448
|
-
throw new TypeError(`rollup target mutation is unavailable: ${rollup.target.logical}`);
|
|
449
|
-
}
|
|
450
|
-
const method = Reflect.get(tableMutate, operation);
|
|
451
|
-
if (typeof method !== 'function') {
|
|
452
|
-
throw new TypeError(`rollup target mutation is unavailable: ${rollup.target.logical}.${operation}`);
|
|
453
|
-
}
|
|
454
|
-
await Reflect.apply(method, tableMutate, [row]);
|
|
455
|
-
}
|
|
456
|
-
async function addRollupContribution(tx, builder, rollup, sourceRow) {
|
|
457
|
-
const key = groupKey(rollup, sourceRow);
|
|
458
|
-
const targetRow = await readRollupRow(tx, builder, rollup.target.logical, rollup.target.primaryKey, key);
|
|
459
|
-
const contribution = aggregateContribution(rollup, sourceRow);
|
|
460
|
-
if (!targetRow) {
|
|
461
|
-
if (rollup.mode === 'materialized') {
|
|
462
|
-
await mutateRollupTarget(tx, rollup, 'insert', { ...key, ...contribution });
|
|
463
|
-
}
|
|
464
|
-
return;
|
|
465
|
-
}
|
|
466
|
-
const update = { ...key };
|
|
467
|
-
for (const aggregate of rollup.aggregates) {
|
|
468
|
-
update[aggregate.target.logical] =
|
|
469
|
-
numericValue(targetRow[aggregate.target.logical], `rollup ${rollup.name} target ${rollup.target.logical}.${aggregate.target.logical}`, false) + contribution[aggregate.target.logical];
|
|
470
|
-
}
|
|
471
|
-
await mutateRollupTarget(tx, rollup, 'update', update);
|
|
472
|
-
}
|
|
473
|
-
async function removeRollupContribution(tx, builder, rollup, sourceRow) {
|
|
474
|
-
const key = groupKey(rollup, sourceRow);
|
|
475
|
-
const targetRow = await readRollupRow(tx, builder, rollup.target.logical, rollup.target.primaryKey, key);
|
|
476
|
-
if (!targetRow)
|
|
477
|
-
return;
|
|
478
|
-
const contribution = aggregateContribution(rollup, sourceRow);
|
|
479
|
-
const update = { ...key };
|
|
480
|
-
let remainingCount = null;
|
|
481
|
-
for (const aggregate of rollup.aggregates) {
|
|
482
|
-
const next = numericValue(targetRow[aggregate.target.logical], `rollup ${rollup.name} target ${rollup.target.logical}.${aggregate.target.logical}`, false) - contribution[aggregate.target.logical];
|
|
483
|
-
update[aggregate.target.logical] = next;
|
|
484
|
-
if (aggregate.kind === 'count')
|
|
485
|
-
remainingCount = next;
|
|
486
|
-
}
|
|
487
|
-
if (rollup.mode === 'materialized' && remainingCount !== null && remainingCount <= 0) {
|
|
488
|
-
await mutateRollupTarget(tx, rollup, 'delete', key);
|
|
489
|
-
return;
|
|
490
|
-
}
|
|
491
|
-
await mutateRollupTarget(tx, rollup, 'update', update);
|
|
492
|
-
}
|
|
493
|
-
async function updateRollupContribution(tx, builder, rollup, previousSourceRow, nextSourceRow) {
|
|
494
|
-
const previousKey = groupKey(rollup, previousSourceRow);
|
|
495
|
-
const nextKey = groupKey(rollup, nextSourceRow);
|
|
496
|
-
if (!sameKey(rollup, previousKey, nextKey)) {
|
|
497
|
-
await removeRollupContribution(tx, builder, rollup, previousSourceRow);
|
|
498
|
-
await addRollupContribution(tx, builder, rollup, nextSourceRow);
|
|
499
|
-
return;
|
|
500
|
-
}
|
|
501
|
-
const previous = aggregateContribution(rollup, previousSourceRow);
|
|
502
|
-
const next = aggregateContribution(rollup, nextSourceRow);
|
|
503
|
-
if (rollup.aggregates.every((aggregate) => Object.is(previous[aggregate.target.logical], next[aggregate.target.logical]))) {
|
|
504
|
-
return;
|
|
505
|
-
}
|
|
506
|
-
const targetRow = await readRollupRow(tx, builder, rollup.target.logical, rollup.target.primaryKey, nextKey);
|
|
507
|
-
if (!targetRow)
|
|
508
|
-
return;
|
|
509
|
-
const update = { ...nextKey };
|
|
510
|
-
for (const aggregate of rollup.aggregates) {
|
|
511
|
-
update[aggregate.target.logical] =
|
|
512
|
-
numericValue(targetRow[aggregate.target.logical], `rollup ${rollup.name} target ${rollup.target.logical}.${aggregate.target.logical}`, false) +
|
|
513
|
-
next[aggregate.target.logical] -
|
|
514
|
-
previous[aggregate.target.logical];
|
|
515
|
-
}
|
|
516
|
-
await mutateRollupTarget(tx, rollup, 'update', update);
|
|
517
|
-
}
|
|
518
|
-
/**
|
|
519
|
-
* Wrap a Zero client transaction so source-table CRUD also projects its
|
|
520
|
-
* declared rollups. Server transactions are returned unchanged because SQLite
|
|
521
|
-
* triggers own the authoritative write.
|
|
522
|
-
*/
|
|
523
|
-
export function withOptimisticRollups(tx, rollups) {
|
|
524
|
-
const runtime = rollups[ROLLUP_RUNTIME];
|
|
525
|
-
if (Reflect.get(tx, 'location') !== 'client' || runtime.definitions.length === 0) {
|
|
526
|
-
return tx;
|
|
527
|
-
}
|
|
528
|
-
const baseMutate = Reflect.get(tx, 'mutate');
|
|
529
|
-
if (!baseMutate || typeof baseMutate !== 'object') {
|
|
530
|
-
throw new TypeError(`rollup transaction has no mutate object`);
|
|
531
|
-
}
|
|
532
|
-
const builder = runtime.queryBuilder;
|
|
533
|
-
const bySource = runtime.bySource;
|
|
534
|
-
const tableProxies = new Map();
|
|
535
|
-
const wrappedMutate = new Proxy(baseMutate, {
|
|
536
|
-
get(target, tableName, receiver) {
|
|
537
|
-
if (typeof tableName !== 'string' || !bySource.has(tableName)) {
|
|
538
|
-
return Reflect.get(target, tableName, receiver);
|
|
539
|
-
}
|
|
540
|
-
const cached = tableProxies.get(tableName);
|
|
541
|
-
if (cached)
|
|
542
|
-
return cached;
|
|
543
|
-
const tableMutate = Reflect.get(target, tableName, receiver);
|
|
544
|
-
if (!tableMutate || typeof tableMutate !== 'object')
|
|
545
|
-
return tableMutate;
|
|
546
|
-
const tableProxy = new Proxy(tableMutate, {
|
|
547
|
-
get(tableTarget, operation, tableReceiver) {
|
|
548
|
-
const method = Reflect.get(tableTarget, operation, tableReceiver);
|
|
549
|
-
if (typeof operation !== 'string' ||
|
|
550
|
-
!['insert', 'upsert', 'update', 'delete'].includes(operation) ||
|
|
551
|
-
typeof method !== 'function') {
|
|
552
|
-
return method;
|
|
553
|
-
}
|
|
554
|
-
return async (...args) => {
|
|
555
|
-
const input = rollupRow(args[0], `rollup source mutation ${tableName}.${operation}`);
|
|
556
|
-
const definitions = bySource.get(tableName);
|
|
557
|
-
const source = definitions[0].source;
|
|
558
|
-
const previous = operation === 'insert'
|
|
559
|
-
? null
|
|
560
|
-
: await readRollupRow(tx, builder, source.logical, source.primaryKey, input);
|
|
561
|
-
await Reflect.apply(method, tableTarget, args);
|
|
562
|
-
const next = operation === 'delete'
|
|
563
|
-
? null
|
|
564
|
-
: await readRollupRow(tx, builder, source.logical, source.primaryKey, input);
|
|
565
|
-
for (const rollup of definitions) {
|
|
566
|
-
if (previous && next) {
|
|
567
|
-
await updateRollupContribution(tx, builder, rollup, previous, next);
|
|
568
|
-
}
|
|
569
|
-
else if (previous) {
|
|
570
|
-
await removeRollupContribution(tx, builder, rollup, previous);
|
|
571
|
-
}
|
|
572
|
-
else if (next) {
|
|
573
|
-
await addRollupContribution(tx, builder, rollup, next);
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
};
|
|
577
|
-
},
|
|
578
|
-
});
|
|
579
|
-
tableProxies.set(tableName, tableProxy);
|
|
580
|
-
return tableProxy;
|
|
581
|
-
},
|
|
582
|
-
});
|
|
583
|
-
return new Proxy(tx, {
|
|
584
|
-
get(target, property, receiver) {
|
|
585
|
-
if (property === 'mutate')
|
|
586
|
-
return wrappedMutate;
|
|
587
|
-
const value = Reflect.get(target, property, receiver);
|
|
588
|
-
return typeof value === 'function' ? value.bind(target) : value;
|
|
589
|
-
},
|
|
590
|
-
});
|
|
591
|
-
}
|
|
592
|
-
//# sourceMappingURL=rollup.js.map
|
package/dist/rollup.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rollup.js","sourceRoot":"","sources":["../src/rollup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAiG9C,MAAM,cAAc,GAAkB,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;AAM5E,MAAM,UAAU,KAAK;IACnB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,GAAG,CACjB,MAAoB;IAEpB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AAChC,CAAC;AAED,SAAS,eAAe,CAAC,UAAkB;IACzC,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAA;AAChD,CAAC;AAED,SAAS,iBAAiB,CAAC,KAG1B;IACC,OAAO,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;AAChE,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAkB,EAAE,MAAe;IAC7D,IACE,MAAM;QACN,OAAO,MAAM,KAAK,QAAQ;QAC1B,YAAY,IAAI,MAAM;QACtB,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,EACrC,CAAC;QACD,OAAO,MAAM,CAAC,UAAU,CAAA;IAC1B,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,SAAS,eAAe,CACtB,UAAkB,EAClB,SAAiB,EACjB,OAA0C,EAC1C,UAAkB;IAElB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CACjB,UAAU,UAAU,8BAA8B,SAAS,IAAI,UAAU,EAAE,CAC5E,CAAA;IACH,CAAC;IACD,OAAO,OAAO,CAAC,UAAU,CAAC,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,aAAa,CAG3B,MAAS,EAAE,WAAwB;IACnC,MAAM,QAAQ,GAAqB,EAAE,CAAA;IACrC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;IAEtC,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7D,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,SAAS,CACjB,+DAA+D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CACtF,CAAA;QACH,CAAC;QACD,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,SAAS,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAA;QACvD,CAAC;QACD,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEtB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;QAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,SAAS,CAAC,UAAU,IAAI,6BAA6B,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;QACrF,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,SAAS,CAAC,UAAU,IAAI,6BAA6B,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;QACrF,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;YAC5C,MAAM,IAAI,SAAS,CAAC,UAAU,IAAI,8CAA8C,CAAC,CAAA;QACnF,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,CACnD,CAAC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,EAAE,EAAE;YACvC,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE,CAAC;gBACzC,MAAM,IAAI,SAAS,CAAC,UAAU,IAAI,+BAA+B,CAAC,CAAA;YACpE,CAAC;YACD,MAAM,YAAY,GAAG,eAAe,CAClC,IAAI,EACJ,UAAU,CAAC,MAAM,EACjB,MAAM,CAAC,OAAO,EACd,gBAAgB,CACjB,CAAA;YACD,MAAM,YAAY,GAAG,eAAe,CAClC,IAAI,EACJ,UAAU,CAAC,MAAM,EACjB,MAAM,CAAC,OAAO,EACd,gBAAgB,CACjB,CAAA;YACD,OAAO;gBACL,MAAM,EAAE;oBACN,OAAO,EAAE,gBAAgB;oBACzB,QAAQ,EAAE,kBAAkB,CAAC,gBAAgB,EAAE,YAAY,CAAC;iBAC7D;gBACD,MAAM,EAAE;oBACN,OAAO,EAAE,gBAAgB;oBACzB,QAAQ,EAAE,kBAAkB,CAAC,gBAAgB,EAAE,YAAY,CAAC;iBAC7D;aACF,CAAA;QACH,CAAC,CACF,CAAA;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,SAAS,CAAC,UAAU,IAAI,oCAAoC,CAAC,CAAA;QACzE,CAAC;QACD,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;YAChF,MAAM,IAAI,SAAS,CAAC,UAAU,IAAI,8CAA8C,CAAC,CAAA;QACnF,CAAC;QAED,MAAM,gBAAgB,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,oBAAoB,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;QACpF,IACE,gBAAgB,CAAC,MAAM,KAAK,oBAAoB,CAAC,MAAM;YACvD,CAAC,GAAG,gBAAgB,CAAC;iBAClB,IAAI,EAAE;iBACN,IAAI,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,KAAK,oBAAoB,CAAC,KAAK,CAAC,CAAC,EAC1E,CAAC;YACD,MAAM,IAAI,SAAS,CACjB,UAAU,IAAI,iDAAiD,UAAU,CAAC,MAAM,EAAE,CACnF,CAAA;QACH,CAAC;QAED,MAAM,UAAU,GAAwB,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,GAAG,CAC/E,CAAC,CAAC,gBAAgB,EAAE,SAAS,CAAC,EAAE,EAAE;YAChC,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAChD,MAAM,IAAI,SAAS,CAAC,UAAU,IAAI,2BAA2B,CAAC,CAAA;YAChE,CAAC;YACD,MAAM,YAAY,GAAG,eAAe,CAClC,IAAI,EACJ,UAAU,CAAC,MAAM,EACjB,MAAM,CAAC,OAAO,EACd,gBAAgB,CACjB,CAAA;YACD,IACE,CAAC,YAAY;gBACb,OAAO,YAAY,KAAK,QAAQ;gBAChC,CAAC,CAAC,MAAM,IAAI,YAAY,CAAC;gBACzB,YAAY,CAAC,IAAI,KAAK,QAAQ,EAC9B,CAAC;gBACD,MAAM,IAAI,SAAS,CACjB,UAAU,IAAI,kBAAkB,UAAU,CAAC,MAAM,IAAI,gBAAgB,kBAAkB,CACxF,CAAA;YACH,CAAC;YACD,MAAM,cAAc,GAAG;gBACrB,OAAO,EAAE,gBAAgB;gBACzB,QAAQ,EAAE,kBAAkB,CAAC,gBAAgB,EAAE,YAAY,CAAC;aAC7D,CAAA;YACD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;YAC3C,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;YAClD,CAAC;YACD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;YACxD,IAAI,IAAI,KAAK,KAAK,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE,CAAC;gBAC1D,MAAM,IAAI,SAAS,CAAC,UAAU,IAAI,2BAA2B,CAAC,CAAA;YAChE,CAAC;YACD,MAAM,YAAY,GAAG,eAAe,CAClC,IAAI,EACJ,UAAU,CAAC,MAAM,EACjB,MAAM,CAAC,OAAO,EACd,eAAe,CAChB,CAAA;YACD,IACE,CAAC,YAAY;gBACb,OAAO,YAAY,KAAK,QAAQ;gBAChC,CAAC,CAAC,MAAM,IAAI,YAAY,CAAC;gBACzB,YAAY,CAAC,IAAI,KAAK,QAAQ,EAC9B,CAAC;gBACD,MAAM,IAAI,SAAS,CACjB,UAAU,IAAI,kBAAkB,UAAU,CAAC,MAAM,IAAI,eAAe,kBAAkB,CACvF,CAAA;YACH,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE;oBACN,OAAO,EAAE,eAAe;oBACxB,QAAQ,EAAE,kBAAkB,CAAC,eAAe,EAAE,YAAY,CAAC;iBAC5D;gBACD,MAAM,EAAE,cAAc;aACvB,CAAA;QACH,CAAC,CACF,CAAA;QACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,SAAS,CAAC,UAAU,IAAI,sCAAsC,CAAC,CAAA;QAC3E,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5E,MAAM,IAAI,SAAS,CAAC,UAAU,IAAI,uCAAuC,CAAC,CAAA;QAC5E,CAAC;QACD,IACE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACpB,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAClF,EACD,CAAC;YACD,MAAM,IAAI,SAAS,CAAC,UAAU,IAAI,6CAA6C,CAAC,CAAA;QAClF,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACvC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;gBAChE,MAAM,IAAI,SAAS,CACjB,uBAAuB,IAAI,iDAAiD,CAC7E,CAAA;YACH,CAAC;YACD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;gBACjC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC9C,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;aAC3D,CAAC,CAAA;YACF,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CACxD,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CACpD,CAAA;YACD,IAAI,iBAAiB,EAAE,CAAC;gBACtB,MAAM,IAAI,SAAS,CACjB,uBAAuB,IAAI,iCAAiC,UAAU,CAAC,MAAM,IAAI,iBAAiB,EAAE,CACrG,CAAA;YACH,CAAC;QACH,CAAC;aAAM,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC1C,MAAM,IAAI,SAAS,CAAC,UAAU,IAAI,6BAA6B,CAAC,CAAA;QAClE,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI;YACJ,MAAM,EAAE;gBACN,OAAO,EAAE,UAAU,CAAC,MAAM;gBAC1B,QAAQ,EAAE,iBAAiB,CAAC,MAAM,CAAC;gBACnC,UAAU,EAAE,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC;aACnC;YACD,MAAM,EAAE;gBACN,OAAO,EAAE,UAAU,CAAC,MAAM;gBAC1B,QAAQ,EAAE,iBAAiB,CAAC,MAAM,CAAC;gBACnC,UAAU,EAAE,gBAAgB;aAC7B;YACD,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,MAAM;YACN,UAAU;SACX,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;IAC7E,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,SAAS,CACjB,UAAU,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,MAAM,CAAC,OAAO,6BAA6B,CACnF,CAAA;QACH,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;YACjC,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/E,SAAQ;YACV,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,IAAI,SAAS,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACxE,MAAM,IAAI,SAAS,CACjB,8BAA8B,MAAM,CAAC,MAAM,CAAC,OAAO,0BAA0B,CAC9E,CAAA;YACH,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CACrD,SAAS,CAAC,UAAU,CAAC,IAAI,CACvB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,MAAM,CAAC,OAAO,CAC7D,CACF,CAAA;YACD,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,IAAI,SAAS,CACjB,wBAAwB,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,0BAA0B,CACpG,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAA;IACpD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACzD,IAAI,aAAa;YAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;;YACxC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IACpD,CAAC;IAED,OAAO;QACL,CAAC,cAAc,CAAC,EAAE;YAChB,MAAM;YACN,WAAW,EAAE,QAAQ;YACrB,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC;YACnC,QAAQ;SACT;KACF,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CAAC,MAAoB,EAAE,GAAkB;IAC/D,OAAO,GAAG,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAA;AACrD,CAAC;AAED,SAAS,WAAW,CAAC,MAAsB,EAAE,GAAkB;IAC7D,OAAO,MAAM,CAAC,MAAM;SACjB,GAAG,CACF,CAAC,KAAK,EAAE,EAAE,CACR,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CACvF;SACA,IAAI,CAAC,OAAO,CAAC,CAAA;AAClB,CAAC;AAED,SAAS,SAAS,CAAC,MAAsB;IACvC,OAAO,MAAM,CAAC,MAAM;SACjB,GAAG,CACF,CAAC,KAAK,EAAE,EAAE,CACR,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CACvF;SACA,IAAI,CAAC,OAAO,CAAC,CAAA;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAsB;IAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CACnC,CAAC,SAAS,EAA4D,EAAE,CACtE,SAAS,CAAC,IAAI,KAAK,KAAK,CAC3B,CAAA;IACD,OAAO,IAAI,CAAC,MAAM;QAChB,CAAC,CAAC,IAAI;aACD,GAAG,CACF,CAAC,SAAS,EAAE,EAAE,CACZ,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,eAAe,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CACnG;aACA,IAAI,CAAC,MAAM,CAAC;QACjB,CAAC,CAAC,GAAG,CAAA;AACT,CAAC;AAED,SAAS,YAAY,CAAC,SAA4B,EAAE,GAAkB;IACpE,OAAO,SAAS,CAAC,IAAI,KAAK,OAAO;QAC/B,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,YAAY,eAAe,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAA;AAC9D,CAAC;AAED,SAAS,WAAW,CAClB,MAAsB,EACtB,SAAqC;IAErC,OAAO,MAAM,CAAC,UAAU;SACrB,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACzD,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC,IAAI,KAAK,KAAK;gBAC7B,CAAC,CAAC;oBACE,GAAG,MAAM,MAAM,MAAM,MAAM,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE;iBAChG;gBACH,CAAC,CAAC,EAAE,CAAA;QACR,CAAC;QACD,MAAM,QAAQ,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;QAChD,MAAM,GAAG,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;QAC/C,OAAO,CAAC,GAAG,MAAM,MAAM,MAAM,IAAI,QAAQ,IAAI,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;IAC9E,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC;AAED,SAAS,aAAa,CAAC,MAAsB;IAC3C,OAAO;QACL,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;QAC7C,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;KAC1C;SACE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SACjD,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC;AAED,SAAS,YAAY,CAAC,MAAsB,EAAE,GAAkB;IAC9D,OAAO;QACL,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACnE,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;KACtE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAsB;IAC/C,OAAO,MAAM,CAAC,UAAU;SACrB,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QACjB,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACzD,OAAO,GAAG,MAAM,MAAM,MAAM,eAAe,MAAM,EAAE,CAAA;IACrD,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC;AAED,SAAS,WAAW,CAAC,MAAsB;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CACtC,CAAC,SAAS,EAA8D,EAAE,CACxE,SAAS,CAAC,IAAI,KAAK,OAAO,CAC7B,CAAA;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,SAAS,CAAC,uBAAuB,MAAM,CAAC,IAAI,yBAAyB,CAAC,CAAA;IAClF,CAAC;IACD,OAAO,SAAS,CAAC,MAAM,CAAA;AACzB,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAsB;IAClD,OAAO;QACL,GAAG,IAAI,GAAG,CAAC;YACT,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;YACtD,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CACzC,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAC5D;SACF,CAAC;KACH;SACE,GAAG,CAAC,eAAe,CAAC;SACpB,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAsB;IAChD,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC3D,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC3D,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG;YACb,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvE,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CACrC,SAAS,CAAC,IAAI,KAAK,OAAO;gBACxB,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,gBAAgB,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CACtE;SACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACZ,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM;aAC1B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;aACtD,IAAI,CAAC,IAAI,CAAC,CAAA;QACb,OAAO;YACL,eAAe,WAAW,EAAE;YAC5B,eAAe,WAAW,KAAK,aAAa,CAAC,MAAM,CAAC,YAAY,MAAM,SAAS,WAAW,aAAa,OAAO,EAAE;SACjH,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM;SAC9B,GAAG,CACF,CAAC,KAAK,EAAE,EAAE,CACR,GAAG,WAAW,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,WAAW,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CACzH;SACA,IAAI,CAAC,OAAO,CAAC,CAAA;IAChB,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU;SAC7B,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QACjB,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACzD,MAAM,KAAK,GACT,SAAS,CAAC,IAAI,KAAK,OAAO;YACxB,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,gBAAgB,WAAW,IAAI,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAA;QACtF,OAAO,GAAG,MAAM,cAAc,KAAK,SAAS,WAAW,UAAU,WAAW,GAAG,CAAA;IACjF,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;IACb,OAAO,CAAC,UAAU,WAAW,QAAQ,MAAM,EAAE,CAAC,CAAA;AAChD,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAsB;IAC/C,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC3D,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC3D,MAAM,aAAa,GAAG,eAAe,CAAC,gBAAgB,MAAM,CAAC,IAAI,SAAS,CAAC,CAAA;IAC3E,MAAM,aAAa,GAAG,eAAe,CAAC,gBAAgB,MAAM,CAAC,IAAI,SAAS,CAAC,CAAA;IAC3E,MAAM,aAAa,GAAG,eAAe,CAAC,gBAAgB,MAAM,CAAC,IAAI,SAAS,CAAC,CAAA;IAC3E,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM;SAC9B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SACtD,IAAI,CAAC,IAAI,CAAC,CAAA;IACb,MAAM,YAAY,GAAG,QAAQ,SAAS,CAAC,MAAM,CAAC,GAAG,CAAA;IACjD,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAE5C,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAA;QAClD,MAAM,UAAU,GAAG;YACjB,UAAU,WAAW,QAAQ,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,YAAY,GAAG;YACrH,UAAU,WAAW,QAAQ,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,YAAY,GAAG;YAClH,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC;gBAC9B,CAAC,CAAC;oBACE,UAAU,WAAW,QAAQ,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,UAAU,WAAW,IAAI;iBACjJ;gBACH,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACX,OAAO;YACL,kBAAkB,aAAa,oBAAoB,WAAW,iBAAiB,WAAW,QAAQ,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO;YACvK,kBAAkB,aAAa,oBAAoB,aAAa,OAAO,WAAW,UAAU,UAAU,MAAM;YAC5G,kBAAkB,aAAa,oBAAoB,WAAW,iBAAiB,WAAW,QAAQ,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO;SAC3K,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAA;IACjE,MAAM,MAAM,GAAG,eAAe,WAAW,KAAK,aAAa,CAAC,MAAM,CAAC,aAAa,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,kBAAkB,WAAW,mBAAmB,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAA;IACvL,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAA;IAClD,MAAM,UAAU,GAAG;QACjB,UAAU,WAAW,QAAQ,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,YAAY,GAAG;QACrH,eAAe,WAAW,UAAU,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,WAAW,aAAa,YAAY,GAAG;QAC7G,eAAe,WAAW,KAAK,aAAa,CAAC,MAAM,CAAC,YAAY,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,YAAY,iBAAiB,WAAW,mBAAmB,iBAAiB,CAAC,MAAM,CAAC,GAAG;QAC5L,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC;YAC9B,CAAC,CAAC;gBACE,UAAU,WAAW,QAAQ,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,UAAU,WAAW,IAAI;aACjJ;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACX,OAAO;QACL,kBAAkB,aAAa,oBAAoB,WAAW,UAAU,MAAM,MAAM;QACpF,kBAAkB,aAAa,oBAAoB,aAAa,OAAO,WAAW,UAAU,UAAU,MAAM;QAC5G,kBAAkB,aAAa,oBAAoB,WAAW,iBAAiB,WAAW,QAAQ,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,iBAAiB,WAAW,UAAU,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,WAAW,YAAY;KACnQ,CAAA;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAkB;IAC1D,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QAC5D,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CACpE,eAAe,CAAC,gBAAgB,MAAM,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC,CAC5D,CAAA;QACD,OAAO;YACL,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,0BAA0B,IAAI,EAAE,CAAC;YAC/D,GAAG,kBAAkB,CAAC,MAAM,CAAC;YAC7B,GAAG,iBAAiB,CAAC,MAAM,CAAC;SAC7B,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAkB;IACnD,OAAO,yBAAyB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAA;AAChF,CAAC;AAID,SAAS,SAAS,CAAC,KAAc,EAAE,OAAe;IAChD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,SAAS,CAAC,GAAG,OAAO,uBAAuB,CAAC,CAAA;IACxD,CAAC;IACD,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;AAClD,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,OAAe,EAAE,QAAiB;IACtE,IAAI,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,CAAC,CAAA;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,SAAS,CAAC,GAAG,OAAO,0BAA0B,CAAC,CAAA;IAC3D,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,EAAU,EACV,OAAe,EACf,SAAiB,EACjB,UAA6B,EAC7B,GAAc;IAEd,IAAI,KAAK,GAAY,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACpD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,sCAAsC,SAAS,EAAE,CAAC,CAAA;IACxE,CAAC;IACD,KAAK,MAAM,UAAU,IAAI,UAAU,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAA;QAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC1C,MAAM,IAAI,SAAS,CAAC,cAAc,SAAS,IAAI,UAAU,mBAAmB,CAAC,CAAA;QAC/E,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACzC,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,MAAM,IAAI,SAAS,CAAC,0CAA0C,SAAS,EAAE,CAAC,CAAA;QAC5E,CAAC;QACD,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;QAC7D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,SAAS,CAAC,2CAA2C,SAAS,EAAE,CAAC,CAAA;QAC7E,CAAC;IACH,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;IAClC,IAAI,OAAO,GAAG,KAAK,UAAU,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;QAC3D,MAAM,IAAI,SAAS,CAAC,kCAAkC,SAAS,EAAE,CAAC,CAAA;IACpE,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;IAC9C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;IACvD,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;QAC5C,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,2BAA2B,SAAS,EAAE,CAAC,CAAA;AAC/D,CAAC;AAED,SAAS,QAAQ,CAAC,MAAsB,EAAE,GAAc;IACtD,MAAM,GAAG,GAA4B,EAAE,CAAA;IACvC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACvC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC1C,MAAM,IAAI,SAAS,CACjB,UAAU,MAAM,CAAC,IAAI,UAAU,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,mBAAmB,CAChG,CAAA;QACH,CAAC;QACD,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAA;IACnC,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,SAAS,OAAO,CAAC,MAAsB,EAAE,IAAe,EAAE,KAAgB;IACxE,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CACnC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CACnE,CAAA;AACH,CAAC;AAED,SAAS,qBAAqB,CAC5B,MAAsB,EACtB,GAAc;IAEd,MAAM,YAAY,GAA2B,EAAE,CAAA;IAC/C,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1C,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;YACpC,SAAS,CAAC,IAAI,KAAK,OAAO;gBACxB,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,YAAY,CACV,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAC7B,UAAU,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EACnF,IAAI,CACL,CAAA;IACT,CAAC;IACD,OAAO,YAAY,CAAA;AACrB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,EAAU,EACV,MAAsB,EACtB,SAAyC,EACzC,GAAc;IAEd,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;IACxC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAA;IAChE,CAAC;IACD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC9D,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpD,MAAM,IAAI,SAAS,CAAC,0CAA0C,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;IACxF,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;IAClD,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,MAAM,IAAI,SAAS,CACjB,0CAA0C,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,SAAS,EAAE,CAC/E,CAAA;IACH,CAAC;IACD,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;AACjD,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,EAAU,EACV,OAAe,EACf,MAAsB,EACtB,SAAoB;IAEpB,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACvC,MAAM,SAAS,GAAG,MAAM,aAAa,CACnC,EAAE,EACF,OAAO,EACP,MAAM,CAAC,MAAM,CAAC,OAAO,EACrB,MAAM,CAAC,MAAM,CAAC,UAAU,EACxB,GAAG,CACJ,CAAA;IACD,MAAM,YAAY,GAAG,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC7D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACnC,MAAM,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC,CAAA;QAC7E,CAAC;QACD,OAAM;IACR,CAAC;IACD,MAAM,MAAM,GAA4B,EAAE,GAAG,GAAG,EAAE,CAAA;IAClD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;YAC9B,YAAY,CACV,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EACnC,UAAU,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EACnF,KAAK,CACN,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAE,CAAA;IAC/C,CAAC;IACD,MAAM,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;AACxD,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,EAAU,EACV,OAAe,EACf,MAAsB,EACtB,SAAoB;IAEpB,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACvC,MAAM,SAAS,GAAG,MAAM,aAAa,CACnC,EAAE,EACF,OAAO,EACP,MAAM,CAAC,MAAM,CAAC,OAAO,EACrB,MAAM,CAAC,MAAM,CAAC,UAAU,EACxB,GAAG,CACJ,CAAA;IACD,IAAI,CAAC,SAAS;QAAE,OAAM;IACtB,MAAM,YAAY,GAAG,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC7D,MAAM,MAAM,GAA4B,EAAE,GAAG,GAAG,EAAE,CAAA;IAClD,IAAI,cAAc,GAAkB,IAAI,CAAA;IACxC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,IAAI,GACR,YAAY,CACV,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EACnC,UAAU,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EACnF,KAAK,CACN,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAE,CAAA;QAC7C,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;QACvC,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO;YAAE,cAAc,GAAG,IAAI,CAAA;IACvD,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;QACrF,MAAM,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA;QACnD,OAAM;IACR,CAAC;IACD,MAAM,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;AACxD,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,EAAU,EACV,OAAe,EACf,MAAsB,EACtB,iBAA4B,EAC5B,aAAwB;IAExB,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;IACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC/C,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC;QAC3C,MAAM,wBAAwB,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAA;QACtE,MAAM,qBAAqB,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAA;QAC/D,OAAM;IACR,CAAC;IAED,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;IACjE,MAAM,IAAI,GAAG,qBAAqB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACzD,IACE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CACpC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAC9E,EACD,CAAC;QACD,OAAM;IACR,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,aAAa,CACnC,EAAE,EACF,OAAO,EACP,MAAM,CAAC,MAAM,CAAC,OAAO,EACrB,MAAM,CAAC,MAAM,CAAC,UAAU,EACxB,OAAO,CACR,CAAA;IACD,IAAI,CAAC,SAAS;QAAE,OAAM;IACtB,MAAM,MAAM,GAA4B,EAAE,GAAG,OAAO,EAAE,CAAA;IACtD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;YAC9B,YAAY,CACV,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EACnC,UAAU,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EACnF,KAAK,CACN;gBACD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAE;gBAC/B,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAE,CAAA;IACvC,CAAC;IACD,MAAM,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;AACxD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAmB,EAAK,EAAE,OAAkB;IAC/E,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;IACvC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjF,OAAO,EAAE,CAAA;IACX,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;IAC5C,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QAClD,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAA;IAChE,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAA;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;IACjC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAuB,CAAA;IACnD,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,UAAU,EAAE;QAC1C,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ;YAC7B,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9D,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;YACjD,CAAC;YACD,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YAC1C,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAA;YACzB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;YAC5D,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ;gBAAE,OAAO,WAAW,CAAA;YACvE,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE;gBACxC,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa;oBACvC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;oBACjE,IACE,OAAO,SAAS,KAAK,QAAQ;wBAC7B,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;wBAC7D,OAAO,MAAM,KAAK,UAAU,EAC5B,CAAC;wBACD,OAAO,MAAM,CAAA;oBACf,CAAC;oBACD,OAAO,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;wBAClC,MAAM,KAAK,GAAG,SAAS,CACrB,IAAI,CAAC,CAAC,CAAC,EACP,0BAA0B,SAAS,IAAI,SAAS,EAAE,CACnD,CAAA;wBACD,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAA;wBAC5C,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC,MAAM,CAAA;wBACrC,MAAM,QAAQ,GACZ,SAAS,KAAK,QAAQ;4BACpB,CAAC,CAAC,IAAI;4BACN,CAAC,CAAC,MAAM,aAAa,CACjB,EAAE,EACF,OAAO,EACP,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,UAAU,EACjB,KAAK,CACN,CAAA;wBACP,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;wBAC9C,MAAM,IAAI,GACR,SAAS,KAAK,QAAQ;4BACpB,CAAC,CAAC,IAAI;4BACN,CAAC,CAAC,MAAM,aAAa,CACjB,EAAE,EACF,OAAO,EACP,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,UAAU,EACjB,KAAK,CACN,CAAA;wBACP,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;4BACjC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;gCACrB,MAAM,wBAAwB,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;4BACrE,CAAC;iCAAM,IAAI,QAAQ,EAAE,CAAC;gCACpB,MAAM,wBAAwB,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;4BAC/D,CAAC;iCAAM,IAAI,IAAI,EAAE,CAAC;gCAChB,MAAM,qBAAqB,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;4BACxD,CAAC;wBACH,CAAC;oBACH,CAAC,CAAA;gBACH,CAAC;aACF,CAAC,CAAA;YACF,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;YACvC,OAAO,UAAU,CAAA;QACnB,CAAC;KACF,CAAC,CAAA;IACF,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE;QACnB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ;YAC5B,IAAI,QAAQ,KAAK,QAAQ;gBAAE,OAAO,aAAa,CAAA;YAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;YACrD,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QACjE,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
|