@grafema/util 0.3.16 → 0.3.18

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.
@@ -0,0 +1,390 @@
1
+ /**
2
+ * ManifestGenerator — generates manifest.yaml from a Grafema graph.
3
+ *
4
+ * Reads MODULE, EXPORT, EXTERNAL_MODULE, FUNCTION, CLASS nodes from the graph
5
+ * and assembles a Manifest object describing the package's export surface.
6
+ *
7
+ * Effects are looked up from the effects-db (builtins + packages) and
8
+ * propagated transitively via the call graph.
9
+ */
10
+ import { readFileSync, existsSync, readdirSync } from 'fs';
11
+ import { join } from 'path';
12
+ import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
13
+ import { GRAFEMA_VERSION } from '../version.js';
14
+ const SCHEMA_VERSION = 1;
15
+ const VALID_EFFECTS = new Set([
16
+ 'PURE', 'MUTATION', 'IO', 'THROW', 'ASYNC', 'NONDETERMINISTIC', 'UNKNOWN',
17
+ ]);
18
+ export class ManifestGenerator {
19
+ backend;
20
+ options;
21
+ effectsDb;
22
+ effectsCache = new Map();
23
+ constructor(backend, options) {
24
+ this.backend = backend;
25
+ this.options = options;
26
+ this.effectsDb = { runtimes: {}, packages: {} };
27
+ }
28
+ async generate() {
29
+ this.loadEffectsDB();
30
+ const exports = await this.collectExports();
31
+ await this.enrichEffects(exports);
32
+ const imports = await this.collectImports();
33
+ const totalInternal = await this.countInternalSymbols();
34
+ const manifest = {
35
+ schema_version: SCHEMA_VERSION,
36
+ analyzer_version: GRAFEMA_VERSION,
37
+ authored: false,
38
+ confidence: this.computeConfidence(exports),
39
+ generated: new Date().toISOString(),
40
+ package: {
41
+ purl: this.options.purl,
42
+ source_type: this.options.sourceType ?? 'source',
43
+ },
44
+ exports,
45
+ imports,
46
+ capabilities: {
47
+ total_exports: exports.length,
48
+ total_internal_symbols: totalInternal,
49
+ has_graph: existsSync(join(this.options.grafemaDir, 'graph.rfdb')),
50
+ },
51
+ access: {
52
+ local: './graph.rfdb',
53
+ },
54
+ language: 'typescript',
55
+ language_specific: {
56
+ module_system: 'esm',
57
+ },
58
+ };
59
+ return manifest;
60
+ }
61
+ /** Serialize manifest to YAML string */
62
+ static toYaml(manifest) {
63
+ return stringifyYaml(manifest, {
64
+ lineWidth: 120,
65
+ defaultKeyType: 'PLAIN',
66
+ defaultStringType: 'PLAIN',
67
+ });
68
+ }
69
+ // ── Effects DB loading ─────────────────────────────────────
70
+ loadEffectsDB() {
71
+ const dbPath = this.options.effectsDbPath;
72
+ if (!dbPath)
73
+ return;
74
+ // Load runtime builtins
75
+ const nodeYaml = join(dbPath, 'runtimes', 'node.yaml');
76
+ if (existsSync(nodeYaml)) {
77
+ const raw = parseYaml(readFileSync(nodeYaml, 'utf-8'));
78
+ this.effectsDb.runtimes = raw;
79
+ }
80
+ // Load package effects
81
+ const pkgDir = join(dbPath, 'packages');
82
+ if (existsSync(pkgDir)) {
83
+ for (const file of readdirSync(pkgDir)) {
84
+ if (!file.endsWith('.yaml'))
85
+ continue;
86
+ const raw = parseYaml(readFileSync(join(pkgDir, file), 'utf-8'));
87
+ if (raw && typeof raw === 'object') {
88
+ for (const [pkg, fns] of Object.entries(raw)) {
89
+ this.effectsDb.packages[pkg] = fns;
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }
95
+ /** Look up effects for a builtin or external function */
96
+ lookupEffects(module, fn) {
97
+ // Check runtime builtins (node:fs → readFileSync)
98
+ const nodeModule = `node:${module}`;
99
+ if (this.effectsDb.runtimes[nodeModule]?.[fn]) {
100
+ return this.effectsDb.runtimes[nodeModule][fn];
101
+ }
102
+ // Also check without node: prefix
103
+ if (this.effectsDb.runtimes[module]?.[fn]) {
104
+ return this.effectsDb.runtimes[module][fn];
105
+ }
106
+ // Check package effects
107
+ if (this.effectsDb.packages[module]?.[fn]) {
108
+ return this.effectsDb.packages[module][fn];
109
+ }
110
+ return null;
111
+ }
112
+ // ── Export collection ──────────────────────────────────────
113
+ /** Definition node types we look up for exported symbols */
114
+ static DEF_TYPES = ['FUNCTION', 'CLASS', 'CONSTANT', 'INTERFACE'];
115
+ async collectExports() {
116
+ const seen = new Set();
117
+ const exports = [];
118
+ const entryFile = this.options.entryFile;
119
+ if (entryFile) {
120
+ // Graph-based approach:
121
+ // EXPORT(named) --EXPORTS--> EXPORT_BINDING(name, source) --> definition in source file
122
+ await this.collectExportsViaBindings(entryFile, exports, seen, new Set());
123
+ }
124
+ else {
125
+ // Fallback: all exported definitions from the package
126
+ const prefix = this.options.packagePrefix ?? '';
127
+ for (const type of ManifestGenerator.DEF_TYPES) {
128
+ for await (const node of this.backend.queryNodes({ type: type })) {
129
+ if (prefix && !node.file?.startsWith(prefix))
130
+ continue;
131
+ if (!node.exported)
132
+ continue;
133
+ if (!node.name || node.name.startsWith('<'))
134
+ continue;
135
+ if (seen.has(node.name))
136
+ continue;
137
+ seen.add(node.name);
138
+ await this.addExportFromDefinition(node, exports);
139
+ }
140
+ }
141
+ }
142
+ exports.sort((a, b) => a.name.localeCompare(b.name));
143
+ return exports;
144
+ }
145
+ /** Collect exports by traversing EXPORT → EXPORT_BINDING graph edges from entry file */
146
+ async collectExportsViaBindings(file, exports, seen, visitedFiles) {
147
+ if (visitedFiles.has(file))
148
+ return;
149
+ visitedFiles.add(file);
150
+ for await (const exportNode of this.backend.queryNodes({ type: 'EXPORT', file })) {
151
+ // Star re-exports: follow RE_EXPORTS edge to source module
152
+ if (exportNode.name?.startsWith('*:') || exportNode.name === '*') {
153
+ const reExportEdges = await this.backend.getOutgoingEdges(exportNode.id, ['RE_EXPORTS']);
154
+ for (const edge of reExportEdges) {
155
+ const targetModule = await this.backend.getNode(edge.dst);
156
+ if (targetModule?.file) {
157
+ await this.collectExportsViaBindings(targetModule.file, exports, seen, visitedFiles);
158
+ }
159
+ }
160
+ continue;
161
+ }
162
+ // Named exports: follow EXPORTS edges to EXPORT_BINDING nodes
163
+ const bindingEdges = await this.backend.getOutgoingEdges(exportNode.id, ['EXPORTS']);
164
+ for (const edge of bindingEdges) {
165
+ const binding = await this.backend.getNode(edge.dst);
166
+ if (!binding?.name || seen.has(binding.name))
167
+ continue;
168
+ seen.add(binding.name);
169
+ // Resolve the definition node from the source file
170
+ const source = binding.source;
171
+ const defNode = source
172
+ ? await this.findDefinition(binding.name, source, file)
173
+ : await this.findDefinitionInFile(binding.name, file);
174
+ if (defNode) {
175
+ await this.addExportFromDefinition(defNode, exports);
176
+ }
177
+ else {
178
+ // Type-only export or unresolvable — add as TYPE/VARIABLE
179
+ exports.push({
180
+ name: binding.name,
181
+ kind: 'TYPE',
182
+ semanticId: binding.id,
183
+ effects: ['PURE'],
184
+ });
185
+ }
186
+ }
187
+ }
188
+ }
189
+ /** Find a definition node by name, resolving source path relative to the importing file.
190
+ * Follows barrel re-export chains: if the source file is a barrel (index.ts),
191
+ * looks for EXPORT_BINDING nodes there and follows their source recursively. */
192
+ async findDefinition(name, source, fromFile, depth = 0) {
193
+ if (depth > 5)
194
+ return null;
195
+ const resolved = this.resolveSourcePath(source, fromFile);
196
+ // Direct definition in resolved file
197
+ const def = await this.findDefinitionInFile(name, resolved);
198
+ if (def)
199
+ return def;
200
+ // Follow barrel re-export chain via EXPORT_BINDING
201
+ for await (const binding of this.backend.queryNodes({
202
+ type: 'EXPORT_BINDING', name, file: resolved,
203
+ })) {
204
+ const nextSource = binding.source;
205
+ if (nextSource) {
206
+ return this.findDefinition(name, nextSource, resolved, depth + 1);
207
+ }
208
+ }
209
+ return null;
210
+ }
211
+ /** Resolve a relative source path to a graph-relative file path */
212
+ resolveSourcePath(source, fromFile) {
213
+ const dir = fromFile.substring(0, fromFile.lastIndexOf('/'));
214
+ let resolved = source.startsWith('.') ? `${dir}/${source}` : source;
215
+ resolved = resolved.replace(/\/\.\//g, '/');
216
+ if (resolved.endsWith('.js')) {
217
+ resolved = resolved.replace(/\.js$/, '.ts');
218
+ }
219
+ return resolved;
220
+ }
221
+ /** Find a FUNCTION/CLASS/CONSTANT/INTERFACE node by name in a specific file */
222
+ async findDefinitionInFile(name, file) {
223
+ for (const type of ManifestGenerator.DEF_TYPES) {
224
+ for await (const node of this.backend.queryNodes({ type: type, name, file })) {
225
+ return node;
226
+ }
227
+ }
228
+ return null;
229
+ }
230
+ /** Build a ManifestExport entry from a definition node */
231
+ async addExportFromDefinition(node, exports) {
232
+ const kind = this.nodeTypeToExportKind(node.type);
233
+ const entry = {
234
+ name: node.name ?? '<unknown>',
235
+ kind,
236
+ semanticId: node.id,
237
+ effects: ['PURE'],
238
+ };
239
+ if (kind === 'FUNCTION' || kind === 'CLASS') {
240
+ const params = node.params;
241
+ if (params && params.length > 0) {
242
+ entry.params = params.map(p => ({ name: p, flow: 'IN' }));
243
+ }
244
+ entry.returns = { flow: 'OUT' };
245
+ }
246
+ exports.push(entry);
247
+ }
248
+ /** Map node type → ExportKind */
249
+ nodeTypeToExportKind(type) {
250
+ switch (type) {
251
+ case 'FUNCTION': return 'FUNCTION';
252
+ case 'CLASS': return 'CLASS';
253
+ case 'CONSTANT': return 'CONSTANT';
254
+ case 'INTERFACE': return 'INTERFACE';
255
+ default: return 'VARIABLE';
256
+ }
257
+ }
258
+ // ── Effect computation ─────────────────────────────────────
259
+ /** Enrich all exports with computed effects (transitive call graph analysis) */
260
+ async enrichEffects(exports) {
261
+ for (const entry of exports) {
262
+ if (entry.kind !== 'FUNCTION' && entry.kind !== 'CLASS')
263
+ continue;
264
+ const effects = new Set();
265
+ const visited = new Set();
266
+ await this.collectEffectsTransitively(entry.semanticId, effects, visited);
267
+ const computed = [...effects].filter(e => e !== 'PURE');
268
+ if (computed.length > 0) {
269
+ entry.effects = computed;
270
+ }
271
+ }
272
+ }
273
+ async collectEffectsTransitively(nodeId, effects, visited, depth = 0) {
274
+ if (visited.has(nodeId) || depth > 20)
275
+ return;
276
+ visited.add(nodeId);
277
+ // Get outgoing CALLS edges
278
+ const callEdges = await this.backend.getOutgoingEdges(nodeId, ['CALLS']);
279
+ for (const edge of callEdges) {
280
+ const targetNode = await this.backend.getNode(edge.dst);
281
+ if (!targetNode)
282
+ continue;
283
+ // Check if target is an external call → look up in effects-db
284
+ if (targetNode.type === 'EXTERNAL_MODULE' || targetNode.type === 'GLOBAL_DEFINITION') {
285
+ const [module, fn] = this.parseCallTarget(targetNode);
286
+ if (module && fn) {
287
+ const knownEffects = this.lookupEffects(module, fn);
288
+ if (knownEffects) {
289
+ for (const e of knownEffects) {
290
+ if (VALID_EFFECTS.has(e) && e !== 'PURE')
291
+ effects.add(e);
292
+ }
293
+ }
294
+ else {
295
+ effects.add('UNKNOWN');
296
+ }
297
+ }
298
+ continue;
299
+ }
300
+ // Recurse into internal calls
301
+ await this.collectEffectsTransitively(edge.dst, effects, visited, depth + 1);
302
+ }
303
+ // Check node's own properties for async/throw
304
+ const node = await this.backend.getNode(nodeId);
305
+ if (node) {
306
+ const meta = node;
307
+ if (meta.async === true)
308
+ effects.add('ASYNC');
309
+ const cf = meta.controlFlow;
310
+ if (cf?.hasThrow)
311
+ effects.add('THROW');
312
+ if (cf?.canReject)
313
+ effects.add('THROW');
314
+ }
315
+ }
316
+ parseCallTarget(node) {
317
+ // Parse semantic ID like "EXTERNAL_MODULE:fs" or call name like "fs.readFileSync"
318
+ const name = node.name ?? '';
319
+ if (name.includes('.')) {
320
+ const parts = name.split('.');
321
+ return [parts[0], parts.slice(1).join('.')];
322
+ }
323
+ return [name, null];
324
+ }
325
+ // ── Import collection ──────────────────────────────────────
326
+ async collectImports() {
327
+ const importMap = new Map();
328
+ const prefix = this.options.packagePrefix ?? '';
329
+ for await (const node of this.backend.queryNodes({ type: 'IMPORT' })) {
330
+ if (prefix && !node.file?.startsWith(prefix))
331
+ continue;
332
+ const source = node.source;
333
+ if (!source)
334
+ continue;
335
+ // Skip relative imports (internal modules)
336
+ if (source.startsWith('.') || source.startsWith('/'))
337
+ continue;
338
+ const purl = this.sourceToPurl(source);
339
+ if (!importMap.has(purl)) {
340
+ importMap.set(purl, new Set());
341
+ }
342
+ const importName = node.name ?? '*';
343
+ importMap.get(purl).add(importName);
344
+ }
345
+ return [...importMap.entries()]
346
+ .map(([purl, symbols]) => ({
347
+ purl,
348
+ symbols: [...symbols].sort(),
349
+ }))
350
+ .sort((a, b) => a.purl.localeCompare(b.purl));
351
+ }
352
+ sourceToPurl(source) {
353
+ // Node builtins: node:fs, node:path, etc.
354
+ if (source.startsWith('node:')) {
355
+ const mod = source.replace('node:', '');
356
+ return `pkg:npm/node@*#${mod}`;
357
+ }
358
+ // Scoped packages: @scope/name or @scope/name/path → pkg:npm/@scope/name
359
+ if (source.startsWith('@')) {
360
+ const parts = source.split('/');
361
+ const pkg = `${parts[0]}/${parts[1]}`;
362
+ return `pkg:npm/${pkg}`;
363
+ }
364
+ // Regular packages: name or name/path → pkg:npm/name
365
+ const pkg = source.split('/')[0];
366
+ return `pkg:npm/${pkg}`;
367
+ }
368
+ // ── Helpers ────────────────────────────────────────────────
369
+ async countInternalSymbols() {
370
+ const prefix = this.options.packagePrefix ?? '';
371
+ let count = 0;
372
+ for (const type of ['FUNCTION', 'CLASS', 'VARIABLE', 'CONSTANT', 'INTERFACE']) {
373
+ for await (const node of this.backend.queryNodes({ type: type })) {
374
+ if (prefix && !node.file?.startsWith(prefix))
375
+ continue;
376
+ count++;
377
+ }
378
+ }
379
+ return count;
380
+ }
381
+ computeConfidence(exports) {
382
+ if (exports.length === 0)
383
+ return 0;
384
+ const unknownCount = exports.filter(e => e.effects.includes('UNKNOWN')).length;
385
+ // confidence = 1.0 - (unknown_ratio * 0.5)
386
+ const unknownRatio = unknownCount / exports.length;
387
+ return Math.round((1.0 - unknownRatio * 0.5) * 100) / 100;
388
+ }
389
+ }
390
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/manifest/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { ManifestGenerator } from './generator.js';
2
+ export { ManifestResolver } from './resolver.js';
3
+ export type { ResolveResult, ManifestSummary } from './resolver.js';
4
+ export type { Manifest, ManifestExport, ManifestImport, ManifestParam, ManifestCapabilities, ManifestPackage, ManifestAccess, ManifestLanguageSpecific, EffectType, FlowType, ExportKind, } from './types.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/manifest/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACpE,YAAY,EACV,QAAQ,EACR,cAAc,EACd,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,wBAAwB,EACxB,UAAU,EACV,QAAQ,EACR,UAAU,GACX,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { ManifestGenerator } from './generator.js';
2
+ export { ManifestResolver } from './resolver.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/manifest/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * ManifestResolver — resolves cross-package imports via manifest.yaml files.
3
+ *
4
+ * Given an import like `import { GraphBackend } from '@grafema/util'`,
5
+ * the resolver loads @grafema/util's manifest.yaml and returns the
6
+ * ManifestExport entry for GraphBackend (kind, effects, semanticId).
7
+ *
8
+ * This is the read-side complement to ManifestGenerator (write-side).
9
+ *
10
+ * Usage:
11
+ * const resolver = new ManifestResolver();
12
+ * resolver.loadFromWorkspace('/project', ['packages/util', 'packages/types']);
13
+ * resolver.loadFromNodeModules('/project/node_modules');
14
+ *
15
+ * const result = resolver.resolve('@grafema/util', 'GraphBackend');
16
+ * // → { name: 'GraphBackend', kind: 'CLASS', effects: ['PURE'], semanticId: '...' }
17
+ */
18
+ import type { Manifest, ManifestExport } from './types.js';
19
+ export interface ResolveResult {
20
+ /** The matched export entry */
21
+ export: ManifestExport;
22
+ /** Package purl this export belongs to */
23
+ packagePurl: string;
24
+ /** Confidence of the source manifest */
25
+ confidence: number;
26
+ /** Whether the manifest has a full graph available */
27
+ hasGraph: boolean;
28
+ }
29
+ export declare class ManifestResolver {
30
+ /** package name → loaded Manifest */
31
+ private manifests;
32
+ /** package name → Map<export name → ManifestExport> (index for O(1) lookup) */
33
+ private exportIndex;
34
+ /** Number of loaded manifests */
35
+ get size(): number;
36
+ /** All loaded package names */
37
+ get packages(): string[];
38
+ /**
39
+ * Load a single manifest from a YAML file path.
40
+ * The package name is extracted from the manifest's purl field.
41
+ */
42
+ loadFromFile(filePath: string): Manifest | null;
43
+ /**
44
+ * Load manifests from workspace packages.
45
+ * Scans each directory for manifest.yaml.
46
+ *
47
+ * @param rootDir Project root directory
48
+ * @param packageDirs Relative paths to package directories (e.g., ['packages/util', 'packages/types'])
49
+ */
50
+ loadFromWorkspace(rootDir: string, packageDirs: string[]): number;
51
+ /**
52
+ * Auto-discover and load manifests from node_modules.
53
+ * Scans node_modules for packages containing manifest.yaml.
54
+ * Optionally scoped to specific package names.
55
+ *
56
+ * @param nodeModulesDir Path to node_modules directory
57
+ * @param packageNames Optional list of package names to load (e.g., ['@grafema/util']). If omitted, scans all.
58
+ */
59
+ loadFromNodeModules(nodeModulesDir: string, packageNames?: string[]): number;
60
+ /**
61
+ * Register a manifest directly (e.g., from in-memory generation).
62
+ */
63
+ register(packageName: string, manifest: Manifest): void;
64
+ /**
65
+ * Resolve an import: given package name and symbol, return the export info.
66
+ *
67
+ * @param source Import source (e.g., '@grafema/util', 'graphql-yoga')
68
+ * @param symbolName Exported symbol name (e.g., 'GraphBackend')
69
+ * @returns ResolveResult or null if not found
70
+ */
71
+ resolve(source: string, symbolName: string): ResolveResult | null;
72
+ /**
73
+ * Resolve all symbols from a specific import source.
74
+ * Returns a map of symbol name → ManifestExport for all known exports.
75
+ *
76
+ * Useful for: `import * as utils from '@grafema/util'`
77
+ */
78
+ resolveAll(source: string): Map<string, ManifestExport> | null;
79
+ /**
80
+ * Get the full manifest for a package.
81
+ */
82
+ getManifest(packageName: string): Manifest | null;
83
+ /**
84
+ * Check if a package has a loaded manifest.
85
+ */
86
+ has(packageName: string): boolean;
87
+ /**
88
+ * Get the effects for an imported symbol.
89
+ * Shorthand for resolve() when you only need effects.
90
+ */
91
+ getEffects(source: string, symbolName: string): string[] | null;
92
+ /**
93
+ * Build a dependency graph from loaded manifests.
94
+ * Returns: Map<packageName → Set<dependencyPackageName>>
95
+ */
96
+ buildDependencyGraph(): Map<string, Set<string>>;
97
+ /**
98
+ * Get summary stats for all loaded manifests.
99
+ */
100
+ getSummary(): ManifestSummary[];
101
+ }
102
+ export interface ManifestSummary {
103
+ packageName: string;
104
+ purl: string;
105
+ totalExports: number;
106
+ totalImports: number;
107
+ confidence: number;
108
+ hasGraph: boolean;
109
+ exportsByKind: Record<string, number>;
110
+ }
111
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/manifest/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,+BAA+B;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,gBAAgB;IAC3B,qCAAqC;IACrC,OAAO,CAAC,SAAS,CAA+B;IAChD,+EAA+E;IAC/E,OAAO,CAAC,WAAW,CAAkD;IAErE,iCAAiC;IACjC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,+BAA+B;IAC/B,IAAI,QAAQ,IAAI,MAAM,EAAE,CAEvB;IAED;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAgB/C;;;;;;OAMG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM;IASjE;;;;;;;OAOG;IACH,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM;IAa5E;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAWvD;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAgBjE;;;;;OAKG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI;IAI9D;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAIjD;;OAEG;IACH,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIjC;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAI/D;;;OAGG;IACH,oBAAoB,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAiBhD;;OAEG;IACH,UAAU,IAAI,eAAe,EAAE;CAehC;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC"}