@adminiumjs/schema-import 0.1.0-rc.1

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 (78) hide show
  1. package/LICENSE +661 -0
  2. package/dist/builder.d.ts +112 -0
  3. package/dist/builder.d.ts.map +1 -0
  4. package/dist/builder.js +291 -0
  5. package/dist/builder.js.map +1 -0
  6. package/dist/check-enum.d.ts +5 -0
  7. package/dist/check-enum.d.ts.map +1 -0
  8. package/dist/check-enum.js +40 -0
  9. package/dist/check-enum.js.map +1 -0
  10. package/dist/detect.d.ts +13 -0
  11. package/dist/detect.d.ts.map +1 -0
  12. package/dist/detect.js +47 -0
  13. package/dist/detect.js.map +1 -0
  14. package/dist/errors.d.ts +10 -0
  15. package/dist/errors.d.ts.map +1 -0
  16. package/dist/errors.js +12 -0
  17. package/dist/errors.js.map +1 -0
  18. package/dist/index.d.ts +14 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +14 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/parse.d.ts +3 -0
  23. package/dist/parse.d.ts.map +1 -0
  24. package/dist/parse.js +59 -0
  25. package/dist/parse.js.map +1 -0
  26. package/dist/parsers/django.d.ts +13 -0
  27. package/dist/parsers/django.d.ts.map +1 -0
  28. package/dist/parsers/django.js +489 -0
  29. package/dist/parsers/django.js.map +1 -0
  30. package/dist/parsers/drizzle.d.ts +13 -0
  31. package/dist/parsers/drizzle.d.ts.map +1 -0
  32. package/dist/parsers/drizzle.js +395 -0
  33. package/dist/parsers/drizzle.js.map +1 -0
  34. package/dist/parsers/json.d.ts +8 -0
  35. package/dist/parsers/json.d.ts.map +1 -0
  36. package/dist/parsers/json.js +31 -0
  37. package/dist/parsers/json.js.map +1 -0
  38. package/dist/parsers/prisma.d.ts +11 -0
  39. package/dist/parsers/prisma.d.ts.map +1 -0
  40. package/dist/parsers/prisma.js +402 -0
  41. package/dist/parsers/prisma.js.map +1 -0
  42. package/dist/parsers/rails.d.ts +13 -0
  43. package/dist/parsers/rails.d.ts.map +1 -0
  44. package/dist/parsers/rails.js +387 -0
  45. package/dist/parsers/rails.js.map +1 -0
  46. package/dist/parsers/sequelize.d.ts +12 -0
  47. package/dist/parsers/sequelize.d.ts.map +1 -0
  48. package/dist/parsers/sequelize.js +277 -0
  49. package/dist/parsers/sequelize.js.map +1 -0
  50. package/dist/parsers/sql-cursor.d.ts +40 -0
  51. package/dist/parsers/sql-cursor.d.ts.map +1 -0
  52. package/dist/parsers/sql-cursor.js +203 -0
  53. package/dist/parsers/sql-cursor.js.map +1 -0
  54. package/dist/parsers/sql.d.ts +17 -0
  55. package/dist/parsers/sql.d.ts.map +1 -0
  56. package/dist/parsers/sql.js +794 -0
  57. package/dist/parsers/sql.js.map +1 -0
  58. package/dist/parsers/typeorm.d.ts +13 -0
  59. package/dist/parsers/typeorm.d.ts.map +1 -0
  60. package/dist/parsers/typeorm.js +511 -0
  61. package/dist/parsers/typeorm.js.map +1 -0
  62. package/dist/text.d.ts +54 -0
  63. package/dist/text.d.ts.map +1 -0
  64. package/dist/text.js +254 -0
  65. package/dist/text.js.map +1 -0
  66. package/dist/type-map.d.ts +28 -0
  67. package/dist/type-map.d.ts.map +1 -0
  68. package/dist/type-map.js +171 -0
  69. package/dist/type-map.js.map +1 -0
  70. package/dist/types.d.ts +32 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +22 -0
  73. package/dist/types.js.map +1 -0
  74. package/dist/warnings.d.ts +17 -0
  75. package/dist/warnings.d.ts.map +1 -0
  76. package/dist/warnings.js +34 -0
  77. package/dist/warnings.js.map +1 -0
  78. package/package.json +29 -0
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Intermediate model builder shared by all parsers. Parsers register table /
3
+ * column / enum / relation DRAFTS with loose (possibly unqualified, possibly
4
+ * dangling) references; `finalize()` resolves them, drops anything dangling
5
+ * with a warning (an importable file must never fail because one FK points at
6
+ * a table that is not in the file), synthesizes `Relation` entries from
7
+ * column-level references, computes stats, and validates the result through
8
+ * `parseDatabaseModel` so referential integrity is guaranteed at the boundary.
9
+ */
10
+ import { type AdapterCapabilities, type Cardinality, type ColumnDefault, type DatabaseModel, type Dialect, type EnumDef, type FkAction, type LogicalType } from '@adminium/engine';
11
+ import { type Format } from './types.js';
12
+ import type { WarningList } from './warnings.js';
13
+ export interface ReferenceDraft {
14
+ /** Target table name — may be unqualified or schema-qualified. */
15
+ table: string;
16
+ /** Target column; defaults to the target's primary key (or `id`). */
17
+ column?: string | undefined;
18
+ onDelete?: FkAction | null | undefined;
19
+ onUpdate?: FkAction | null | undefined;
20
+ /** Force cardinality (OneToOne decorators etc.); inferred otherwise. */
21
+ cardinality?: Cardinality | undefined;
22
+ }
23
+ export interface ColumnDraft {
24
+ name: string;
25
+ dbType?: string | undefined;
26
+ logicalType?: LogicalType | undefined;
27
+ nullable?: boolean | undefined;
28
+ default?: ColumnDefault | undefined;
29
+ isPrimaryKey?: boolean | undefined;
30
+ isUnique?: boolean | undefined;
31
+ isGenerated?: boolean | undefined;
32
+ /** EnumDef id; validated at finalize. */
33
+ enumRef?: string | null | undefined;
34
+ maxLength?: number | null | undefined;
35
+ numericPrecision?: number | null | undefined;
36
+ numericScale?: number | null | undefined;
37
+ isArray?: boolean | undefined;
38
+ comment?: string | null | undefined;
39
+ references?: ReferenceDraft | null | undefined;
40
+ }
41
+ export interface IndexDraft {
42
+ name: string;
43
+ columns?: string[] | undefined;
44
+ expression?: string | null | undefined;
45
+ unique?: boolean | undefined;
46
+ primary?: boolean | undefined;
47
+ method?: string | null | undefined;
48
+ partial?: boolean | undefined;
49
+ }
50
+ export interface TableDraft {
51
+ name: string;
52
+ schema?: string | undefined;
53
+ kind?: 'table' | 'view' | 'materialized-view' | undefined;
54
+ comment?: string | null | undefined;
55
+ columns: ColumnDraft[];
56
+ primaryKey: string[];
57
+ uniques: {
58
+ name: string | null;
59
+ columns: string[];
60
+ }[];
61
+ checks: {
62
+ name: string | null;
63
+ expression: string;
64
+ }[];
65
+ indexes: IndexDraft[];
66
+ }
67
+ export interface RelationDraft {
68
+ kind: 'declared-fk' | 'inferred-join-table';
69
+ cardinality: Cardinality;
70
+ from: {
71
+ table: string;
72
+ columns: string[];
73
+ };
74
+ to: {
75
+ table: string;
76
+ columns: string[];
77
+ };
78
+ through?: {
79
+ table: string;
80
+ fromColumns: string[];
81
+ toColumns: string[];
82
+ } | undefined;
83
+ onDelete?: FkAction | null | undefined;
84
+ onUpdate?: FkAction | null | undefined;
85
+ confidence?: number | undefined;
86
+ }
87
+ export interface FinalizeOptions {
88
+ format: Format;
89
+ dialect: Dialect;
90
+ name: string;
91
+ capabilities?: Partial<AdapterCapabilities> | undefined;
92
+ }
93
+ export declare class ModelBuilder {
94
+ private readonly warnings;
95
+ private readonly tables;
96
+ private readonly enums;
97
+ private readonly relationDrafts;
98
+ constructor(warnings: WarningList);
99
+ addTable(draft: Partial<TableDraft> & {
100
+ name: string;
101
+ }): TableDraft;
102
+ /** Look a draft table up by (possibly qualified) name. */
103
+ getTable(name: string): TableDraft | undefined;
104
+ /** All table drafts registered so far (late passes over parsed content). */
105
+ allTables(): readonly TableDraft[];
106
+ addEnum(def: EnumDef): void;
107
+ getEnum(id: string): EnumDef | undefined;
108
+ /** Explicit relation (composite FK, many-to-many). Column-level FKs are synthesized from `references` drafts instead. */
109
+ addRelation(draft: RelationDraft): void;
110
+ finalize(opts: FinalizeOptions): DatabaseModel;
111
+ }
112
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,291 @@
1
+ /**
2
+ * Intermediate model builder shared by all parsers. Parsers register table /
3
+ * column / enum / relation DRAFTS with loose (possibly unqualified, possibly
4
+ * dangling) references; `finalize()` resolves them, drops anything dangling
5
+ * with a warning (an importable file must never fail because one FK points at
6
+ * a table that is not in the file), synthesizes `Relation` entries from
7
+ * column-level references, computes stats, and validates the result through
8
+ * `parseDatabaseModel` so referential integrity is guaranteed at the boundary.
9
+ */
10
+ import { parseDatabaseModel, } from '@adminium/engine';
11
+ import { FORMAT_TO_IR } from './types.js';
12
+ export class ModelBuilder {
13
+ warnings;
14
+ tables = [];
15
+ enums = new Map();
16
+ relationDrafts = [];
17
+ constructor(warnings) {
18
+ this.warnings = warnings;
19
+ }
20
+ addTable(draft) {
21
+ const table = {
22
+ name: draft.name,
23
+ schema: draft.schema,
24
+ kind: draft.kind,
25
+ comment: draft.comment ?? null,
26
+ columns: draft.columns ?? [],
27
+ primaryKey: draft.primaryKey ?? [],
28
+ uniques: draft.uniques ?? [],
29
+ checks: draft.checks ?? [],
30
+ indexes: draft.indexes ?? [],
31
+ };
32
+ this.tables.push(table);
33
+ return table;
34
+ }
35
+ /** Look a draft table up by (possibly qualified) name. */
36
+ getTable(name) {
37
+ const dot = name.lastIndexOf('.');
38
+ const schema = dot === -1 ? null : name.slice(0, dot);
39
+ const bare = dot === -1 ? name : name.slice(dot + 1);
40
+ return this.tables.find((t) => (t.name === bare || t.name.toLowerCase() === bare.toLowerCase()) &&
41
+ (schema === null || (t.schema ?? 'public') === schema));
42
+ }
43
+ /** All table drafts registered so far (late passes over parsed content). */
44
+ allTables() {
45
+ return this.tables;
46
+ }
47
+ addEnum(def) {
48
+ if (!this.enums.has(def.id))
49
+ this.enums.set(def.id, def);
50
+ }
51
+ getEnum(id) {
52
+ return this.enums.get(id);
53
+ }
54
+ /** Explicit relation (composite FK, many-to-many). Column-level FKs are synthesized from `references` drafts instead. */
55
+ addRelation(draft) {
56
+ this.relationDrafts.push(draft);
57
+ }
58
+ finalize(opts) {
59
+ const tableId = (t) => `${t.schema ?? 'public'}.${t.name}`;
60
+ // Drop duplicate table declarations (dumps sometimes re-CREATE) and
61
+ // column-less drafts (the IR requires at least one column per table).
62
+ const seen = new Set();
63
+ const tables = this.tables.filter((t) => {
64
+ const id = tableId(t);
65
+ if (seen.has(id)) {
66
+ this.warnings.add('duplicate-table', `duplicate definition of table "${id}" ignored`, id);
67
+ return false;
68
+ }
69
+ if (t.columns.length === 0) {
70
+ this.warnings.add('empty-table', `table "${id}" has no parseable columns and was dropped`, id);
71
+ return false;
72
+ }
73
+ seen.add(id);
74
+ return true;
75
+ });
76
+ // Keep the lookup index consistent with the surviving set so dropped
77
+ // tables can no longer be resolved as FK/relation targets.
78
+ this.tables.length = 0;
79
+ this.tables.push(...tables);
80
+ for (const table of tables) {
81
+ const id = tableId(table);
82
+ const colNames = new Set(table.columns.map((c) => c.name));
83
+ // Reconcile primaryKey list <-> per-column flags.
84
+ table.primaryKey = table.primaryKey.filter((c) => {
85
+ if (!colNames.has(c)) {
86
+ this.warnings.add('unknown-pk-column', `primary key column "${c}" not found on "${id}"`, id);
87
+ return false;
88
+ }
89
+ return true;
90
+ });
91
+ for (const col of table.columns) {
92
+ if (col.isPrimaryKey === true && !table.primaryKey.includes(col.name)) {
93
+ table.primaryKey.push(col.name);
94
+ }
95
+ }
96
+ for (const col of table.columns) {
97
+ if (table.primaryKey.includes(col.name)) {
98
+ col.isPrimaryKey = true;
99
+ col.nullable = false;
100
+ }
101
+ }
102
+ table.uniques = table.uniques.filter((u) => u.columns.every((c) => colNames.has(c)));
103
+ for (const u of table.uniques) {
104
+ if (u.columns.length === 1) {
105
+ const col = table.columns.find((c) => c.name === u.columns[0]);
106
+ if (col)
107
+ col.isUnique = true;
108
+ }
109
+ }
110
+ table.indexes = table.indexes.filter((ix) => (ix.columns ?? []).every((c) => colNames.has(c)) || ix.expression != null);
111
+ // Enum refs must resolve.
112
+ for (const col of table.columns) {
113
+ if (col.enumRef != null && !this.enums.has(col.enumRef)) {
114
+ this.warnings.add('unknown-enum', `enum "${col.enumRef}" for ${id}.${col.name} not found`, id);
115
+ col.enumRef = null;
116
+ }
117
+ }
118
+ }
119
+ // Resolve column-level references → FK relations + IR mirror.
120
+ const relations = [];
121
+ const relationIds = new Set();
122
+ const pushRelation = (rel) => {
123
+ if (relationIds.has(rel.id))
124
+ return;
125
+ relationIds.add(rel.id);
126
+ relations.push({
127
+ id: rel.id,
128
+ kind: rel.kind,
129
+ cardinality: rel.cardinality,
130
+ from: rel.from,
131
+ to: rel.to,
132
+ through: rel.through ?? null,
133
+ onDelete: rel.onDelete ?? null,
134
+ onUpdate: rel.onUpdate ?? null,
135
+ selfReferential: rel.from.tableId === rel.to.tableId,
136
+ confidence: rel.confidence ?? 1,
137
+ });
138
+ };
139
+ const resolveEndpoint = (table, columns, context) => {
140
+ const target = this.getTable(table);
141
+ if (!target) {
142
+ this.warnings.add('unresolved-reference', `${context}: table "${table}" is not part of the import`);
143
+ return null;
144
+ }
145
+ const known = new Set(target.columns.map((c) => c.name));
146
+ for (const col of columns) {
147
+ if (!known.has(col)) {
148
+ this.warnings.add('unresolved-reference', `${context}: column "${col}" not found on "${tableId(target)}"`);
149
+ return null;
150
+ }
151
+ }
152
+ return { table: target, id: tableId(target) };
153
+ };
154
+ for (const table of tables) {
155
+ const fromId = tableId(table);
156
+ for (const col of table.columns) {
157
+ const ref = col.references;
158
+ if (ref == null)
159
+ continue;
160
+ const target = this.getTable(ref.table);
161
+ if (!target) {
162
+ this.warnings.add('unresolved-reference', `foreign key ${fromId}.${col.name}: table "${ref.table}" is not part of the import`, fromId);
163
+ col.references = null;
164
+ continue;
165
+ }
166
+ const toColumn = ref.column ?? target.primaryKey[0] ?? 'id';
167
+ if (!target.columns.some((c) => c.name === toColumn)) {
168
+ this.warnings.add('unresolved-reference', `foreign key ${fromId}.${col.name}: column "${toColumn}" not found on "${tableId(target)}"`, fromId);
169
+ col.references = null;
170
+ continue;
171
+ }
172
+ const toId = tableId(target);
173
+ const soleKey = col.isUnique === true || (table.primaryKey.length === 1 && table.primaryKey[0] === col.name);
174
+ pushRelation({
175
+ id: `fk:${fromId}.${col.name}->${toId}.${toColumn}`,
176
+ kind: 'declared-fk',
177
+ cardinality: ref.cardinality ?? (soleKey ? 'one-to-one' : 'one-to-many'),
178
+ from: { tableId: fromId, columns: [col.name] },
179
+ to: { tableId: toId, columns: [toColumn] },
180
+ onDelete: ref.onDelete ?? null,
181
+ onUpdate: ref.onUpdate ?? null,
182
+ });
183
+ // Rewrite the draft into the resolved IR mirror shape via a marker.
184
+ col.references = { table: toId, column: toColumn };
185
+ }
186
+ }
187
+ for (const draft of this.relationDrafts) {
188
+ const from = resolveEndpoint(draft.from.table, draft.from.columns, `relation from "${draft.from.table}"`);
189
+ const to = resolveEndpoint(draft.to.table, draft.to.columns, `relation to "${draft.to.table}"`);
190
+ if (!from || !to)
191
+ continue;
192
+ let through = null;
193
+ if (draft.through) {
194
+ const t = resolveEndpoint(draft.through.table, [...draft.through.fromColumns, ...draft.through.toColumns], `relation through "${draft.through.table}"`);
195
+ if (!t)
196
+ continue;
197
+ through = {
198
+ tableId: t.id,
199
+ fromColumns: draft.through.fromColumns,
200
+ toColumns: draft.through.toColumns,
201
+ };
202
+ }
203
+ const label = draft.kind === 'inferred-join-table' ? 'm2m' : 'fk';
204
+ pushRelation({
205
+ id: `${label}:${from.id}(${draft.from.columns.join('+')})->${to.id}(${draft.to.columns.join('+')})`,
206
+ kind: draft.kind,
207
+ cardinality: draft.cardinality,
208
+ from: { tableId: from.id, columns: draft.from.columns },
209
+ to: { tableId: to.id, columns: draft.to.columns },
210
+ through,
211
+ onDelete: draft.onDelete ?? null,
212
+ onUpdate: draft.onUpdate ?? null,
213
+ confidence: draft.confidence ?? 1,
214
+ });
215
+ // Mirror single-column declared FKs onto the column when not already set.
216
+ if (draft.kind === 'declared-fk' && draft.from.columns.length === 1) {
217
+ const col = from.table.columns.find((c) => c.name === draft.from.columns[0]);
218
+ if (col && col.references == null) {
219
+ col.references = { table: to.id, column: draft.to.columns[0] };
220
+ }
221
+ }
222
+ }
223
+ const tableInputs = tables.map((table) => {
224
+ const id = tableId(table);
225
+ return {
226
+ id,
227
+ schema: table.schema ?? 'public',
228
+ name: table.name,
229
+ kind: table.kind ?? 'table',
230
+ comment: table.comment ?? null,
231
+ columns: table.columns.map((col, i) => {
232
+ return {
233
+ name: col.name,
234
+ ordinal: i + 1,
235
+ dbType: col.dbType ?? 'text',
236
+ logicalType: col.logicalType ?? 'text',
237
+ nullable: col.nullable ?? true,
238
+ default: col.default ?? null,
239
+ isPrimaryKey: col.isPrimaryKey ?? false,
240
+ isUnique: col.isUnique ?? false,
241
+ isGenerated: col.isGenerated ?? false,
242
+ enumRef: col.enumRef ?? null,
243
+ maxLength: col.maxLength ?? null,
244
+ numericPrecision: col.numericPrecision ?? null,
245
+ numericScale: col.numericScale ?? null,
246
+ isArray: col.isArray ?? false,
247
+ comment: col.comment ?? null,
248
+ references: col.references == null
249
+ ? null
250
+ : { tableId: col.references.table, column: col.references.column },
251
+ semantics: null,
252
+ };
253
+ }),
254
+ primaryKey: table.primaryKey,
255
+ uniques: table.uniques,
256
+ checks: table.checks,
257
+ indexes: table.indexes.map((ix) => ({
258
+ name: ix.name,
259
+ columns: ix.columns ?? [],
260
+ expression: ix.expression ?? null,
261
+ unique: ix.unique ?? false,
262
+ primary: ix.primary ?? false,
263
+ method: ix.method ?? null,
264
+ partial: ix.partial ?? false,
265
+ })),
266
+ };
267
+ });
268
+ const enums = [...this.enums.values()];
269
+ const columnCount = tables.reduce((n, t) => n + t.columns.length, 0);
270
+ return parseDatabaseModel({
271
+ irVersion: 1,
272
+ dialect: opts.dialect,
273
+ source: { kind: 'import', format: FORMAT_TO_IR[opts.format] },
274
+ name: opts.name,
275
+ defaultSchema: 'public',
276
+ schemas: tables.length === 0 ? ['public'] : [...new Set(tables.map((t) => t.schema ?? 'public'))].sort(),
277
+ tables: tableInputs,
278
+ enums,
279
+ relations,
280
+ capabilities: { ...(opts.capabilities ?? {}) },
281
+ stats: {
282
+ tableCount: tables.length,
283
+ columnCount,
284
+ relationCount: relations.length,
285
+ durationMs: 0,
286
+ },
287
+ warnings: this.warnings.toModelWarnings(),
288
+ });
289
+ }
290
+ }
291
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EACL,kBAAkB,GASnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAe,MAAM,YAAY,CAAC;AAyEvD,MAAM,OAAO,YAAY;IAKM;IAJZ,MAAM,GAAiB,EAAE,CAAC;IAC1B,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IACnC,cAAc,GAAoB,EAAE,CAAC;IAEtD,YAA6B,QAAqB;QAArB,aAAQ,GAAR,QAAQ,CAAa;IAAG,CAAC;IAEtD,QAAQ,CAAC,KAA6C;QACpD,MAAM,KAAK,GAAe;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;YAC9B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;YAC5B,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;YAClC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;YAC5B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;SAC7B,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,0DAA0D;IAC1D,QAAQ,CAAC,IAAY;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACrB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YAChE,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,MAAM,CAAC,CACzD,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,GAAY;QAClB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,yHAAyH;IACzH,WAAW,CAAC,KAAoB;QAC9B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,QAAQ,CAAC,IAAqB;QAC5B,MAAM,OAAO,GAAG,CAAC,CAAa,EAAU,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAE/E,oEAAoE;QACpE,sEAAsE;QACtE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACtC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACjB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,EAAE,kCAAkC,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;gBAC1F,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,EAAE,4CAA4C,EAAE,EAAE,CAAC,CAAC;gBAC/F,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,qEAAqE;QACrE,2DAA2D;QAC3D,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QAE5B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAE3D,kDAAkD;YAClD,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC/C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,EAAE,uBAAuB,CAAC,mBAAmB,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC7F,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YACH,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChC,IAAI,GAAG,CAAC,YAAY,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBACtE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChC,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC;oBACxB,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACvB,CAAC;YACH,CAAC;YAED,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrF,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC9B,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC/D,IAAI,GAAG;wBAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAC/B,CAAC;YACH,CAAC;YACD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAClC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,IAAI,IAAI,CAClF,CAAC;YAEF,0BAA0B;YAC1B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChC,IAAI,GAAG,CAAC,OAAO,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,SAAS,GAAG,CAAC,OAAO,SAAS,EAAE,IAAI,GAAG,CAAC,IAAI,YAAY,EAAE,EAAE,CAAC,CAAC;oBAC/F,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,MAAM,SAAS,GAA8B,EAAE,CAAC;QAChD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,MAAM,YAAY,GAAG,CAAC,GAUrB,EAAQ,EAAE;YACT,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO;YACpC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACxB,SAAS,CAAC,IAAI,CAAC;gBACb,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;gBAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI;gBAC9B,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI;gBAC9B,eAAe,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC,OAAO;gBACpD,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC;aAChC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,eAAe,GAAG,CACtB,KAAa,EACb,OAAiB,EACjB,OAAe,EAC2B,EAAE;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,sBAAsB,EAAE,GAAG,OAAO,YAAY,KAAK,6BAA6B,CAAC,CAAC;gBACpG,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACzD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACpB,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,sBAAsB,EACtB,GAAG,OAAO,aAAa,GAAG,mBAAmB,OAAO,CAAC,MAAM,CAAC,GAAG,CAChE,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,CAAC,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC;gBAC3B,IAAI,GAAG,IAAI,IAAI;oBAAE,SAAS;gBAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACxC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,sBAAsB,EACtB,eAAe,MAAM,IAAI,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,KAAK,6BAA6B,EACnF,MAAM,CACP,CAAC;oBACF,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;oBACtB,SAAS;gBACX,CAAC;gBACD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;gBAC5D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;oBACrD,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,sBAAsB,EACtB,eAAe,MAAM,IAAI,GAAG,CAAC,IAAI,aAAa,QAAQ,mBAAmB,OAAO,CAAC,MAAM,CAAC,GAAG,EAC3F,MAAM,CACP,CAAC;oBACF,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;oBACtB,SAAS;gBACX,CAAC;gBACD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC7B,MAAM,OAAO,GACX,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC/F,YAAY,CAAC;oBACX,EAAE,EAAE,MAAM,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,QAAQ,EAAE;oBACnD,IAAI,EAAE,aAAa;oBACnB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;oBACxE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBAC9C,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE;oBAC1C,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI;oBAC9B,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI;iBAC/B,CAAC,CAAC;gBACH,oEAAoE;gBACpE,GAAG,CAAC,UAAU,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;YACrD,CAAC;QACH,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YAC1G,MAAM,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;YAChG,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;gBAAE,SAAS;YAC3B,IAAI,OAAO,GAA2E,IAAI,CAAC;YAC3F,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,CAAC,GAAG,eAAe,CACvB,KAAK,CAAC,OAAO,CAAC,KAAK,EACnB,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAC1D,qBAAqB,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,CAC5C,CAAC;gBACF,IAAI,CAAC,CAAC;oBAAE,SAAS;gBACjB,OAAO,GAAG;oBACR,OAAO,EAAE,CAAC,CAAC,EAAE;oBACb,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW;oBACtC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS;iBACnC,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YAClE,YAAY,CAAC;gBACX,EAAE,EAAE,GAAG,KAAK,IAAI,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;gBACnG,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE;gBACvD,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE;gBACjD,OAAO;gBACP,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;gBAChC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;gBAChC,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,0EAA0E;YAC1E,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7E,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;oBAClC,GAAG,CAAC,UAAU,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAW,EAAE,CAAC;gBAC3E,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACvC,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1B,OAAO;gBACL,EAAE;gBACF,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,QAAQ;gBAChC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,OAAO;gBAC3B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;gBAC9B,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;oBACpC,OAAO;wBACL,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,OAAO,EAAE,CAAC,GAAG,CAAC;wBACd,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,MAAM;wBAC5B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,MAAM;wBACtC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI;wBAC9B,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;wBAC5B,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,KAAK;wBACvC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,KAAK;wBAC/B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,KAAK;wBACrC,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;wBAC5B,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI;wBAChC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,IAAI,IAAI;wBAC9C,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI;wBACtC,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,KAAK;wBAC7B,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;wBAC5B,UAAU,EACR,GAAG,CAAC,UAAU,IAAI,IAAI;4BACpB,CAAC,CAAC,IAAI;4BACN,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,MAAgB,EAAE;wBAChF,SAAS,EAAE,IAAI;qBAChB,CAAC;gBACJ,CAAC,CAAC;gBACF,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBAClC,IAAI,EAAE,EAAE,CAAC,IAAI;oBACb,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE;oBACzB,UAAU,EAAE,EAAE,CAAC,UAAU,IAAI,IAAI;oBACjC,MAAM,EAAE,EAAE,CAAC,MAAM,IAAI,KAAK;oBAC1B,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK;oBAC5B,MAAM,EAAE,EAAE,CAAC,MAAM,IAAI,IAAI;oBACzB,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK;iBAC7B,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACvC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAErE,OAAO,kBAAkB,CAAC;YACxB,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;YAC7D,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,aAAa,EAAE,QAAQ;YACvB,OAAO,EACL,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YACjG,MAAM,EAAE,WAAW;YACnB,KAAK;YACL,SAAS;YACT,YAAY,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE;YAC9C,KAAK,EAAE;gBACL,UAAU,EAAE,MAAM,CAAC,MAAM;gBACzB,WAAW;gBACX,aAAa,EAAE,SAAS,CAAC,MAAM;gBAC/B,UAAU,EAAE,CAAC;aACd;YACD,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE;SAC1C,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export declare function extractCheckEnum(expression: string): {
2
+ column: string;
3
+ values: string[];
4
+ } | null;
5
+ //# sourceMappingURL=check-enum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-enum.d.ts","sourceRoot":"","sources":["../src/check-enum.ts"],"names":[],"mappings":"AAUA,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CA8BhG"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * CHECK-constraint → enum synthesis shared by the SQL and Rails parsers.
3
+ * Recognizes `col IN ('a','b')` (any dialect, quoted or bare identifiers) and
4
+ * the pg_dump spelling `((col)::text = ANY ((ARRAY['a'::character varying,
5
+ * …])::text[]))`.
6
+ */
7
+ import { collectStrings, findBalanced } from './text.js';
8
+ const SQL_SCAN = { dollarQuotes: true, lineComments: ['--'], blockComments: true };
9
+ export function extractCheckEnum(expression) {
10
+ let expr = expression.trim();
11
+ while (expr.startsWith('(') && findBalanced(expr, 0, SQL_SCAN) === expr.length - 1) {
12
+ expr = expr.slice(1, -1).trim();
13
+ }
14
+ const colMatch = /^\(*\s*(?:"((?:[^"]|"")+)"|`((?:[^`]|``)+)`|\[([^\]]+)\]|([A-Za-z_][A-Za-z0-9_$]*))\s*\)*\s*(?:::[A-Za-z_][A-Za-z0-9_ ]*(\[\])?)?\s*(.*)$/s.exec(expr);
15
+ if (!colMatch)
16
+ return null;
17
+ const column = (colMatch[1] ?? colMatch[2] ?? colMatch[3] ?? colMatch[4]);
18
+ const tail = (colMatch[6] ?? '').trim();
19
+ if (/^IN\s*\(/i.test(tail)) {
20
+ const open = tail.indexOf('(');
21
+ const close = findBalanced(tail, open, SQL_SCAN);
22
+ if (close === -1)
23
+ return null;
24
+ const values = collectStrings(tail.slice(open + 1, close));
25
+ return values.length > 0 ? { column, values } : null;
26
+ }
27
+ if (/^=\s*ANY\s*\(/i.test(tail)) {
28
+ const arrayStart = tail.search(/ARRAY\s*\[/i);
29
+ if (arrayStart === -1)
30
+ return null;
31
+ const open = tail.indexOf('[', arrayStart);
32
+ const close = findBalanced(tail, open, SQL_SCAN);
33
+ if (close === -1)
34
+ return null;
35
+ const values = collectStrings(tail.slice(open + 1, close));
36
+ return values.length > 0 ? { column, values } : null;
37
+ }
38
+ return null;
39
+ }
40
+ //# sourceMappingURL=check-enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-enum.js","sourceRoot":"","sources":["../src/check-enum.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzD,MAAM,QAAQ,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,IAAI,EAAW,CAAC;AAE5F,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,IAAI,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnF,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IACD,MAAM,QAAQ,GACZ,4IAA4I,CAAC,IAAI,CAC/I,IAAI,CACL,CAAC;IACJ,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAW,CAAC;IACpF,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAExC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACjD,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3D,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,CAAC;IACD,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC9C,IAAI,UAAU,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACjD,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3D,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Format auto-detection — ordered heuristics over the raw content
3
+ * (05-introspection-engine.md §5.1). Cheap by design: regex probes plus one
4
+ * speculative JSON.parse. `detectFormat` returns the best guess (first match
5
+ * in priority order); `detectCandidates` returns every matching format so the
6
+ * caller can warn about ambiguity.
7
+ */
8
+ import type { Format } from './types.js';
9
+ /** All formats whose heuristic fires, in priority order. */
10
+ export declare function detectCandidates(content: string): Format[];
11
+ /** Best guess (highest-priority candidate), or null when nothing matches. */
12
+ export declare function detectFormat(content: string): Format | null;
13
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AA4CzC,4DAA4D;AAC5D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAE1D;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE3D"}
package/dist/detect.js ADDED
@@ -0,0 +1,47 @@
1
+ function looksLikeJsonIr(content) {
2
+ const trimmed = content.trim();
3
+ if (!trimmed.startsWith('{'))
4
+ return false;
5
+ try {
6
+ const value = JSON.parse(trimmed);
7
+ return (typeof value === 'object' &&
8
+ value !== null &&
9
+ !Array.isArray(value) &&
10
+ ('irVersion' in value || 'tables' in value));
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ }
16
+ const PROBES = [
17
+ ['json', looksLikeJsonIr],
18
+ [
19
+ 'prisma',
20
+ (c) => /(^|\n)\s*datasource\s+\w+\s*\{/.test(c) ||
21
+ /(^|\n)\s*generator\s+client\s*\{/.test(c) ||
22
+ /(^|\n)model\s+\w+\s*\{/.test(c),
23
+ ],
24
+ ['rails', (c) => /ActiveRecord::Schema/.test(c) || /(^|\n)\s*create_table\s+["':]/.test(c)],
25
+ ['django', (c) => /models\.Model\b/.test(c) || /models\.\w+Field\s*\(/.test(c)],
26
+ ['drizzle', (c) => /\b(pgTable|mysqlTable|sqliteTable)\s*\(/.test(c)],
27
+ [
28
+ 'typeorm',
29
+ (c) => /@Entity\s*\(/.test(c) || (/@Column\s*\(/.test(c) && /\bclass\s+\w+/.test(c)),
30
+ ],
31
+ [
32
+ 'sequelize',
33
+ (c) => /\bsequelize\.define\s*\(/.test(c) ||
34
+ /\bDataTypes\.\w+/.test(c) ||
35
+ (/\bextends\s+Model\b/.test(c) && /\.init\s*\(/.test(c)),
36
+ ],
37
+ ['sql', (c) => /\bCREATE\s+TABLE\b/i.test(c)],
38
+ ];
39
+ /** All formats whose heuristic fires, in priority order. */
40
+ export function detectCandidates(content) {
41
+ return PROBES.filter(([, probe]) => probe(content)).map(([format]) => format);
42
+ }
43
+ /** Best guess (highest-priority candidate), or null when nothing matches. */
44
+ export function detectFormat(content) {
45
+ return detectCandidates(content)[0] ?? null;
46
+ }
47
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AASA,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,KAAK,IAAI;YACd,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACrB,CAAC,WAAW,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAC,CAC5C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,MAAM,GAAsD;IAChE,CAAC,MAAM,EAAE,eAAe,CAAC;IACzB;QACE,QAAQ;QACR,CAAC,CAAC,EAAE,EAAE,CACJ,gCAAgC,CAAC,IAAI,CAAC,CAAC,CAAC;YACxC,kCAAkC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1C,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;KACnC;IACD,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,+BAA+B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/E,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,yCAAyC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrE;QACE,SAAS;QACT,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACrF;IACD;QACE,WAAW;QACX,CAAC,CAAC,EAAE,EAAE,CACJ,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;YAClC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1B,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAC3D;IACD,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CAC9C,CAAC;AAEF,4DAA4D;AAC5D,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;AAChF,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,10 @@
1
+ /** Thrown for fatal import problems (undetectable format, unparseable JSON, invalid IR). */
2
+ export declare class SchemaImportError extends Error {
3
+ /** Optional detail lines (e.g. Zod issue paths) already embedded in `message`. */
4
+ readonly details: readonly string[];
5
+ readonly name = "SchemaImportError";
6
+ constructor(message: string,
7
+ /** Optional detail lines (e.g. Zod issue paths) already embedded in `message`. */
8
+ details?: readonly string[]);
9
+ }
10
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,qBAAa,iBAAkB,SAAQ,KAAK;IAKxC,kFAAkF;IAClF,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE;IALrC,SAAkB,IAAI,uBAAuB;gBAG3C,OAAO,EAAE,MAAM;IACf,kFAAkF;IACzE,OAAO,GAAE,SAAS,MAAM,EAAO;CAI3C"}
package/dist/errors.js ADDED
@@ -0,0 +1,12 @@
1
+ /** Thrown for fatal import problems (undetectable format, unparseable JSON, invalid IR). */
2
+ export class SchemaImportError extends Error {
3
+ details;
4
+ name = 'SchemaImportError';
5
+ constructor(message,
6
+ /** Optional detail lines (e.g. Zod issue paths) already embedded in `message`. */
7
+ details = []) {
8
+ super(message);
9
+ this.details = details;
10
+ }
11
+ }
12
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAM/B;IALO,IAAI,GAAG,mBAAmB,CAAC;IAE7C,YACE,OAAe;IACf,kFAAkF;IACzE,UAA6B,EAAE;QAExC,KAAK,CAAC,OAAO,CAAC,CAAC;QAFN,YAAO,GAAP,OAAO,CAAwB;IAG1C,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @adminium/schema-import — schema-file parsers producing the engine's
3
+ * DatabaseModel IR (05-introspection-engine.md §5): SQL DDL / pg_dump /
4
+ * mysqldump, Prisma, Drizzle, TypeORM, Sequelize, Rails schema.rb, Django
5
+ * models.py, and the public JSON IR (which is simply the DatabaseModel
6
+ * schema itself). Setup never reads rows — these parsers see schema text
7
+ * only.
8
+ */
9
+ export declare const PACKAGE_NAME = "@adminium/schema-import";
10
+ export { parseSchemaFile } from './parse.js';
11
+ export { detectFormat, detectCandidates } from './detect.js';
12
+ export { SchemaImportError } from './errors.js';
13
+ export { FORMATS, FORMAT_TO_IR, type Format, type ParseSchemaFileOptions, type ParseSchemaFileResult, } from './types.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,4BAA4B,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,OAAO,EACP,YAAY,EACZ,KAAK,MAAM,EACX,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @adminium/schema-import — schema-file parsers producing the engine's
3
+ * DatabaseModel IR (05-introspection-engine.md §5): SQL DDL / pg_dump /
4
+ * mysqldump, Prisma, Drizzle, TypeORM, Sequelize, Rails schema.rb, Django
5
+ * models.py, and the public JSON IR (which is simply the DatabaseModel
6
+ * schema itself). Setup never reads rows — these parsers see schema text
7
+ * only.
8
+ */
9
+ export const PACKAGE_NAME = '@adminium/schema-import';
10
+ export { parseSchemaFile } from './parse.js';
11
+ export { detectFormat, detectCandidates } from './detect.js';
12
+ export { SchemaImportError } from './errors.js';
13
+ export { FORMATS, FORMAT_TO_IR, } from './types.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,yBAAyB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,OAAO,EACP,YAAY,GAIb,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type ParseSchemaFileOptions, type ParseSchemaFileResult } from './types.js';
2
+ export declare function parseSchemaFile(content: string, opts?: ParseSchemaFileOptions): ParseSchemaFileResult;
3
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAwB,KAAK,sBAAsB,EAAE,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAgB3G,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,sBAA2B,GAChC,qBAAqB,CA6CvB"}