@ts-stack/cycle-detector 1.1.1 → 1.1.3

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 CHANGED
@@ -33,11 +33,6 @@ And then:
33
33
  npm run lint:cycles
34
34
  ```
35
35
 
36
- ### Arguments & Flags
37
-
38
- * `<entry-patterns>`: Glob patterns or paths to entry point files (e.g., `packages/*/src/index.ts`).
39
- * `-p, --project <path>`: Path to your root or fallback `tsconfig.json`.
40
-
41
36
  ## Interpreting Diagnostics
42
37
 
43
38
  When a breaking circular dependency is detected, the script identifies exactly **which file executes the token prematurely**, leaving non-blocking files clearly marked.
package/dist/index.js CHANGED
@@ -2,31 +2,14 @@
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import ts from 'typescript';
5
- // Global shared structures for maximum performance
6
- const graph = new Map();
7
- const allUniqueCycles = [];
8
- const globalDetectedCycles = new Set();
9
- const packageMetaCache = new Map();
5
+ // Performance caches that are safe to share across calls (read-only filesystem data)
10
6
  const compilerOptionsCache = new Map();
11
- // Caches for AST and analysis results to prevent bottlenecks
12
7
  const sourceFileCache = new Map();
13
8
  const topLevelUsageCache = new Map();
14
9
  const exportedHoistedFunctionsCache = new Map();
15
- let globalProjectPath;
10
+ const resolvedSourceCache = new Map(); // Performance cache for path mapping
16
11
  function parseArgs() {
17
- const args = [...process.argv.slice(2)];
18
- let projectPath;
19
- const entryPatterns = [];
20
- for (let i = 0; i < args.length; i++) {
21
- if (args[i] === '--project' || args[i] === '-p') {
22
- projectPath = args[i + 1];
23
- i++;
24
- }
25
- else {
26
- entryPatterns.push(args[i]);
27
- }
28
- }
29
- return { entryPatterns, projectPath };
12
+ return { entryPatterns: process.argv.slice(2) };
30
13
  }
31
14
  function isRuntimeImport(node) {
32
15
  if (ts.isExportDeclaration(node)) {
@@ -39,8 +22,6 @@ function isRuntimeImport(node) {
39
22
  return false;
40
23
  if (!node.importClause)
41
24
  return true; // Side-effect import
42
- if (node.importClause.phaseModifier)
43
- return false;
44
25
  if (node.importClause.name)
45
26
  return true; // Default import present
46
27
  const namedBindings = node.importClause.namedBindings;
@@ -60,7 +41,7 @@ function getCompilerOptionsForFile(filePath) {
60
41
  const cachedOptions = compilerOptionsCache.get(currentDir);
61
42
  if (cachedOptions !== undefined)
62
43
  return cachedOptions;
63
- const configPath = ts.findConfigFile(currentDir, ts.sys.fileExists, 'tsconfig.json') || globalProjectPath;
44
+ const configPath = ts.findConfigFile(currentDir, ts.sys.fileExists, 'tsconfig.json');
64
45
  if (configPath) {
65
46
  const resolvedConfigPath = path.resolve(configPath);
66
47
  const configDir = path.dirname(resolvedConfigPath);
@@ -81,121 +62,103 @@ function getCompilerOptionsForFile(filePath) {
81
62
  // Fallback
82
63
  }
83
64
  }
84
- return {};
65
+ const emptyOptions = {};
66
+ compilerOptionsCache.set(currentDir, emptyOptions);
67
+ return emptyOptions;
85
68
  }
86
- function getPackageMeta(filePath) {
87
- let currentDir = path.dirname(filePath);
88
- const visitedDirs = [];
89
- while (currentDir && currentDir !== path.parse(currentDir).root) {
90
- const cached = packageMetaCache.get(currentDir);
91
- if (cached !== undefined) {
92
- for (const d of visitedDirs)
93
- packageMetaCache.set(d, cached);
94
- return cached;
69
+ /**
70
+ * Universal resolution engine: safely maps compiled assets (.js, .d.ts) back to source files (.ts)
71
+ * Works flawlessly for standalone packages, polyrepos, and complex monorepos alike.
72
+ */
73
+ function convertToSourcePath(resolvedPath) {
74
+ const isBuildDir = new RegExp(String.raw `[\\/](dist|build|lib|out|cjs|esm|bin)[\\/]`, 'i');
75
+ // If it's already a source file and not trapped inside a known build directory, return it directly
76
+ if (/\.(ts|tsx|mts|cts)$/.test(resolvedPath) && !isBuildDir.test(resolvedPath)) {
77
+ return resolvedPath;
78
+ }
79
+ const extensions = ['.ts', '.tsx', '.mts', '.cts'];
80
+ // Strip execution/declaration extensions to get the base file signature
81
+ let baseName = resolvedPath;
82
+ if (baseName.endsWith('.d.ts'))
83
+ baseName = baseName.slice(0, -5);
84
+ else if (baseName.endsWith('.d.mts'))
85
+ baseName = baseName.slice(0, -6);
86
+ else if (baseName.endsWith('.d.cts'))
87
+ baseName = baseName.slice(0, -6);
88
+ else if (baseName.endsWith('.js'))
89
+ baseName = baseName.slice(0, -3);
90
+ else if (baseName.endsWith('.mjs'))
91
+ baseName = baseName.slice(0, -4);
92
+ else if (baseName.endsWith('.cjs'))
93
+ baseName = baseName.slice(0, -4);
94
+ else if (baseName.endsWith('.jsx'))
95
+ baseName = baseName.slice(0, -4);
96
+ // Strategy 1: Direct Extension Swap (In-place builds or matching structures)
97
+ for (const ext of extensions) {
98
+ if (fs.existsSync(baseName + ext))
99
+ return baseName + ext;
100
+ }
101
+ // Strategy 2: Adaptive Path Segment Replacement (Remaps build directories to source directories)
102
+ const buildDirs = ['dist', 'build', 'lib', 'out', 'cjs', 'esm', 'bin'];
103
+ const srcDirs = ['src', 'source', '.']; // '.' fallback for flat root architectures
104
+ for (const bDir of buildDirs) {
105
+ const regex = new RegExp(String.raw `([\\/])${bDir}([\\/])`, 'i');
106
+ if (regex.test(baseName)) {
107
+ for (const sDir of srcDirs) {
108
+ // Skip illegal mappings that loop 'lib' back onto 'lib'
109
+ if (bDir.toLowerCase() === sDir.toLowerCase())
110
+ continue;
111
+ const replacedBase = baseName.replace(regex, `$1${sDir}$2`);
112
+ for (const ext of extensions) {
113
+ if (fs.existsSync(replacedBase + ext))
114
+ return replacedBase + ext;
115
+ }
116
+ }
95
117
  }
96
- const pkgJsonPath = path.join(currentDir, 'package.json');
97
- if (fs.existsSync(pkgJsonPath)) {
98
- try {
99
- const content = fs.readFileSync(pkgJsonPath, 'utf8');
100
- const pkg = JSON.parse(content);
101
- let outDirName = 'dist';
102
- const mainField = pkg.main || pkg.types || pkg.typings || '';
103
- let exportsMain = '';
104
- if (pkg.exports) {
105
- if (typeof pkg.exports === 'string') {
106
- exportsMain = pkg.exports;
107
- }
108
- else if (typeof pkg.exports === 'object') {
109
- const dotExport = pkg.exports['.'];
110
- if (dotExport) {
111
- if (typeof dotExport === 'string') {
112
- exportsMain = dotExport;
113
- }
114
- else if (typeof dotExport === 'object') {
115
- exportsMain = dotExport.import || dotExport.require || dotExport.default || '';
116
- }
118
+ }
119
+ // Strategy 3: Boundary-driven subpath mapping via closest package.json
120
+ let currentDir = path.dirname(resolvedPath);
121
+ while (currentDir && currentDir !== path.parse(currentDir).root) {
122
+ if (fs.existsSync(path.join(currentDir, 'package.json'))) {
123
+ for (const sDir of ['src', 'source']) {
124
+ const srcDirPath = path.join(currentDir, sDir);
125
+ if (fs.existsSync(srcDirPath)) {
126
+ const relativeToPackage = path.relative(currentDir, baseName);
127
+ const pathParts = relativeToPackage.split(path.sep);
128
+ if (pathParts.length > 1) {
129
+ // Drop the first segment (which is the output folder like 'dist' or 'lib')
130
+ const subPath = pathParts.slice(1).join(path.sep);
131
+ for (const ext of extensions) {
132
+ const targetFile = path.join(srcDirPath, subPath + ext);
133
+ if (fs.existsSync(targetFile))
134
+ return targetFile;
117
135
  }
118
136
  }
119
137
  }
120
- const targetField = mainField || exportsMain;
121
- if (targetField) {
122
- const parts = path.normalize(targetField).split(path.sep);
123
- const cleanParts = parts.filter((p) => p !== '.' && p !== '..');
124
- if (cleanParts.length > 0) {
125
- outDirName = cleanParts[0];
126
- }
127
- }
128
- else {
129
- if (fs.existsSync(path.join(currentDir, 'dist')))
130
- outDirName = 'dist';
131
- else if (fs.existsSync(path.join(currentDir, 'build')))
132
- outDirName = 'build';
133
- else if (fs.existsSync(path.join(currentDir, 'out')))
134
- outDirName = 'out';
135
- }
136
- let srcDirName = 'src';
137
- if (fs.existsSync(path.join(currentDir, 'source')))
138
- srcDirName = 'source';
139
- else if (fs.existsSync(path.join(currentDir, 'lib')))
140
- srcDirName = 'lib';
141
- const meta = { pkgDir: currentDir, srcDirName, outDirName };
142
- packageMetaCache.set(currentDir, meta);
143
- for (const d of visitedDirs)
144
- packageMetaCache.set(d, meta);
145
- return meta;
146
- }
147
- catch {
148
- packageMetaCache.set(currentDir, null);
149
- for (const d of visitedDirs)
150
- packageMetaCache.set(d, null);
151
- return null;
152
138
  }
139
+ break;
153
140
  }
154
- visitedDirs.push(currentDir);
155
141
  currentDir = path.dirname(currentDir);
156
142
  }
157
- return null;
143
+ return resolvedPath;
158
144
  }
159
145
  function resolveModule(moduleName, containingFile, options) {
160
146
  const result = ts.resolveModuleName(moduleName, containingFile, options, ts.sys);
161
147
  if (!result.resolvedModule)
162
148
  return null;
163
149
  const resolvedFileName = path.resolve(result.resolvedModule.resolvedFileName);
164
- if (resolvedFileName.includes(`${path.sep}node_modules${path.sep}`))
150
+ // Run universal mapping first: dist/*.d.ts -> src/*.ts
151
+ let sourcePath = resolvedSourceCache.get(resolvedFileName);
152
+ if (sourcePath === undefined) {
153
+ sourcePath = convertToSourcePath(resolvedFileName);
154
+ resolvedSourceCache.set(resolvedFileName, sourcePath);
155
+ }
156
+ // Safety filter: Ignore true external node_modules.
157
+ // Symlinked monorepo packages will successfully map to their local paths above and bypass this check.
158
+ if (sourcePath.includes(`${path.sep}node_modules${path.sep}`)) {
165
159
  return null;
166
- const meta = getPackageMeta(resolvedFileName);
167
- if (meta) {
168
- const { pkgDir, srcDirName, outDirName } = meta;
169
- const srcDirPath = path.join(pkgDir, srcDirName);
170
- if (resolvedFileName.startsWith(srcDirPath + path.sep))
171
- return resolvedFileName;
172
- const outDirPath = path.join(pkgDir, outDirName);
173
- if (resolvedFileName.startsWith(outDirPath + path.sep) || resolvedFileName === outDirPath) {
174
- const relativeToOut = path.relative(outDirPath, resolvedFileName);
175
- let baseName = relativeToOut;
176
- if (baseName.endsWith('.d.ts'))
177
- baseName = baseName.slice(0, -5);
178
- else if (baseName.endsWith('.d.mts'))
179
- baseName = baseName.slice(0, -6);
180
- else if (baseName.endsWith('.d.cts'))
181
- baseName = baseName.slice(0, -6);
182
- else if (baseName.endsWith('.js'))
183
- baseName = baseName.slice(0, -3);
184
- else if (baseName.endsWith('.mjs'))
185
- baseName = baseName.slice(0, -4);
186
- else if (baseName.endsWith('.cjs'))
187
- baseName = baseName.slice(0, -4);
188
- else if (baseName.endsWith('.jsx'))
189
- baseName = baseName.slice(0, -4);
190
- const extensions = ['.ts', '.tsx', '.mts', '.cts'];
191
- for (const ext of extensions) {
192
- const targetSrcFile = path.join(srcDirPath, baseName + ext);
193
- if (fs.existsSync(targetSrcFile))
194
- return targetSrcFile;
195
- }
196
- }
197
160
  }
198
- return result.resolvedModule.isExternalLibraryImport ? null : resolvedFileName;
161
+ return sourcePath;
199
162
  }
200
163
  function getCanonicalCycleKey(cycle) {
201
164
  const nodes = cycle.slice(0, -1);
@@ -210,39 +173,44 @@ function getCanonicalCycleKey(cycle) {
210
173
  rotated.push(rotated[0]);
211
174
  return rotated.join('|');
212
175
  }
213
- function parseFile(filePath) {
214
- if (graph.has(filePath) || !fs.existsSync(filePath))
215
- return;
216
- graph.set(filePath, []);
217
- const options = getCompilerOptionsForFile(filePath);
218
- let sourceFile = sourceFileCache.get(filePath);
219
- if (!sourceFile) {
220
- const content = fs.readFileSync(filePath, 'utf8');
221
- sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
222
- sourceFileCache.set(filePath, sourceFile);
223
- }
224
- const imports = [];
225
- function walk(node) {
226
- if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {
227
- if (isRuntimeImport(node)) {
228
- const specifier = node.moduleSpecifier;
229
- if (specifier && ts.isStringLiteral(specifier)) {
230
- const resolved = resolveModule(specifier.text, filePath, options);
231
- if (resolved && !imports.includes(resolved))
232
- imports.push(resolved);
176
+ function parseFile(startPath, graph) {
177
+ // Iterative DFS to avoid stack overflow on deeply nested dependency trees
178
+ const queue = [startPath];
179
+ while (queue.length > 0) {
180
+ const filePath = queue.pop();
181
+ if (graph.has(filePath) || !fs.existsSync(filePath))
182
+ continue;
183
+ graph.set(filePath, []);
184
+ const options = getCompilerOptionsForFile(filePath);
185
+ let sourceFile = sourceFileCache.get(filePath);
186
+ if (!sourceFile) {
187
+ const content = fs.readFileSync(filePath, 'utf8');
188
+ sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
189
+ sourceFileCache.set(filePath, sourceFile);
190
+ }
191
+ const imports = [];
192
+ function walk(node) {
193
+ if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {
194
+ if (isRuntimeImport(node)) {
195
+ const specifier = node.moduleSpecifier;
196
+ if (specifier && ts.isStringLiteral(specifier)) {
197
+ const resolved = resolveModule(specifier.text, filePath, options);
198
+ if (resolved && !imports.includes(resolved))
199
+ imports.push(resolved);
200
+ }
233
201
  }
234
202
  }
203
+ ts.forEachChild(node, walk);
204
+ }
205
+ walk(sourceFile);
206
+ graph.set(filePath, imports);
207
+ // Push unvisited dependencies onto the queue
208
+ for (const dep of imports) {
209
+ if (!graph.has(dep))
210
+ queue.push(dep);
235
211
  }
236
- ts.forEachChild(node, walk);
237
212
  }
238
- walk(sourceFile);
239
- graph.set(filePath, imports);
240
- for (const dep of imports)
241
- parseFile(dep);
242
213
  }
243
- /**
244
- * Analyzes a file and extracts the names of all exported functions that are hoisted.
245
- */
246
214
  function getExportedHoistedFunctions(filePath) {
247
215
  if (exportedHoistedFunctionsCache.has(filePath)) {
248
216
  return exportedHoistedFunctionsCache.get(filePath);
@@ -265,7 +233,6 @@ function getExportedHoistedFunctions(filePath) {
265
233
  }
266
234
  }
267
235
  const localHoistedFuncs = new Set();
268
- // Pass 1: Find all top-level function declarations and direct export modifiers
269
236
  for (const statement of sourceFile.statements) {
270
237
  if (ts.isFunctionDeclaration(statement)) {
271
238
  if (statement.name) {
@@ -281,7 +248,6 @@ function getExportedHoistedFunctions(filePath) {
281
248
  }
282
249
  }
283
250
  }
284
- // Pass 2: Look for independent export declarations or export assignments mapping to local functions
285
251
  for (const statement of sourceFile.statements) {
286
252
  if (ts.isExportDeclaration(statement)) {
287
253
  if (!statement.moduleSpecifier && statement.exportClause && ts.isNamedExports(statement.exportClause)) {
@@ -305,9 +271,6 @@ function getExportedHoistedFunctions(filePath) {
305
271
  exportedHoistedFunctionsCache.set(filePath, hoisted);
306
272
  return hoisted;
307
273
  }
308
- /**
309
- * Checks if a specific file import creates an immediate execution (top-level) risk.
310
- */
311
274
  function hasTopLevelUsage(fromFile, toFile) {
312
275
  if (!fs.existsSync(fromFile))
313
276
  return false;
@@ -327,9 +290,7 @@ function hasTopLevelUsage(fromFile, toFile) {
327
290
  return false;
328
291
  }
329
292
  }
330
- // Get all safe hoisted exports from the target file
331
293
  const hoistedExports = getExportedHoistedFunctions(toFile);
332
- // Maps local import identifier to its original exported symbol name
333
294
  const localToExportedName = new Map();
334
295
  let namespaceImportName = null;
335
296
  let hasSideEffectOrReExport = false;
@@ -351,6 +312,8 @@ function hasTopLevelUsage(fromFile, toFile) {
351
312
  }
352
313
  else if (ts.isNamedImports(clause.namedBindings)) {
353
314
  for (const el of clause.namedBindings.elements) {
315
+ if (el.isTypeOnly)
316
+ continue;
354
317
  const exportedName = el.propertyName ? el.propertyName.text : el.name.text;
355
318
  localToExportedName.set(el.name.text, exportedName);
356
319
  }
@@ -358,6 +321,7 @@ function hasTopLevelUsage(fromFile, toFile) {
358
321
  }
359
322
  }
360
323
  else {
324
+ // Side-effect import OR export ... from '...' (re-export) — always top-level
361
325
  hasSideEffectOrReExport = true;
362
326
  }
363
327
  }
@@ -399,20 +363,16 @@ function hasTopLevelUsage(fromFile, toFile) {
399
363
  const isNamespaceReference = namespaceImportName && node.text === namespaceImportName;
400
364
  if (isImportedSymbol || isNamespaceReference) {
401
365
  const parent = node.parent;
402
- // Protection 1: Skip metadata/declarations references
403
366
  const isImportOrExportDeclarationRef = ts.isImportSpecifier(parent) ||
404
367
  ts.isImportClause(parent) ||
405
368
  ts.isNamespaceImport(parent) ||
406
369
  ts.isExportSpecifier(parent);
407
370
  if (isImportOrExportDeclarationRef)
408
371
  return;
409
- // Protection 2: Avoid object property name access False Positives (obj.foo)
410
372
  if (ts.isPropertyAccessExpression(parent) && parent.name === node)
411
373
  return;
412
- // Protection 3: Avoid object assignment keys False Positives ({ foo: 123 })
413
374
  if (ts.isPropertyAssignment(parent) && parent.name === node)
414
375
  return;
415
- // Protection 4: Avoid shadow declarations with matching names
416
376
  if ((ts.isMethodDeclaration(parent) ||
417
377
  ts.isPropertyDeclaration(parent) ||
418
378
  ts.isClassDeclaration(parent) ||
@@ -421,23 +381,18 @@ function hasTopLevelUsage(fromFile, toFile) {
421
381
  parent.name === node) {
422
382
  return;
423
383
  }
424
- // (Hoisting check 1): Direct or renamed named/default import usage
425
384
  if (isImportedSymbol) {
426
385
  const exportedName = localToExportedName.get(node.text);
427
- if (hoistedExports.has(exportedName)) {
428
- return; // Perfectly safe hoisted function call/reference!
429
- }
386
+ if (hoistedExports.has(exportedName))
387
+ return;
430
388
  }
431
- // (Hoisting check 2): Namespace import property access usage (ns.foo())
432
389
  if (isNamespaceReference) {
433
390
  if (ts.isPropertyAccessExpression(parent) && parent.expression === node) {
434
391
  const propName = parent.name.text;
435
- if (hoistedExports.has(propName)) {
436
- return; // Perfectly safe property from namespace!
437
- }
392
+ if (hoistedExports.has(propName))
393
+ return;
438
394
  }
439
395
  }
440
- // Protection 5: Type contexts checks
441
396
  let isInTypeContext = false;
442
397
  let checkParent = parent;
443
398
  while (checkParent && checkParent !== sourceFile) {
@@ -462,7 +417,7 @@ function hasTopLevelUsage(fromFile, toFile) {
462
417
  topLevelUsageCache.set(cacheKey, dangerousTopLevelUsage);
463
418
  return dangerousTopLevelUsage;
464
419
  }
465
- function canReach(start, target) {
420
+ function canReach(start, target, graph) {
466
421
  const seen = new Set();
467
422
  const stack = [start];
468
423
  while (stack.length > 0) {
@@ -479,12 +434,15 @@ function canReach(start, target) {
479
434
  return false;
480
435
  }
481
436
  function main() {
482
- const { entryPatterns, projectPath } = parseArgs();
483
- globalProjectPath = projectPath;
437
+ const { entryPatterns } = parseArgs();
484
438
  if (entryPatterns.length === 0) {
485
439
  console.error('❌ Error: Please specify at least one entry point or glob pattern.');
486
440
  process.exit(1);
487
441
  }
442
+ // All mutable state is local to each run — no cross-run contamination
443
+ const graph = new Map();
444
+ const allUniqueCycles = [];
445
+ const globalDetectedCycles = new Set();
488
446
  const entryPoints = [];
489
447
  for (const pattern of entryPatterns) {
490
448
  const matches = fs.globSync ? fs.globSync(pattern) : [pattern];
@@ -506,7 +464,7 @@ function main() {
506
464
  }
507
465
  console.log(`🔍 Found ${entryPoints.length} entry point(s) for analysis. Building graph...\n`);
508
466
  for (const entryPoint of entryPoints) {
509
- parseFile(entryPoint);
467
+ parseFile(entryPoint, graph);
510
468
  }
511
469
  const visited = new Map();
512
470
  const currentStack = [];
@@ -561,7 +519,7 @@ function main() {
561
519
  entryPointCycles.get(matchedEp).push(cycle);
562
520
  }
563
521
  else {
564
- const reachingEp = entryPoints.find((ep) => canReach(ep, firstFile));
522
+ const reachingEp = entryPoints.find((ep) => canReach(ep, firstFile, graph));
565
523
  if (reachingEp)
566
524
  entryPointCycles.get(reachingEp).push(cycle);
567
525
  else
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,YAAY,CAAC;AAI5B,qFAAqF;AACrF,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAA8B,CAAC;AACnE,MAAM,eAAe,GAAG,IAAI,GAAG,EAAyB,CAAC;AACzD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAmB,CAAC;AACtD,MAAM,6BAA6B,GAAG,IAAI,GAAG,EAAuB,CAAC;AACrE,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,qCAAqC;AAE5F,SAAS,SAAS;IAChB,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,eAAe,CAAC,IAAiD;IACxE,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO,KAAK,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;IAC1B,CAAC;IAED,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,YAAY,EAAE,aAAa;YAAE,OAAO,KAAK,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC,CAAC,qBAAqB;QAE1D,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,CAAC,yBAAyB;QAElE,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;QACtD,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,EAAE,CAAC,iBAAiB,CAAC,aAAa,CAAC;gBAAE,OAAO,IAAI,CAAC;YACrD,IAAI,EAAE,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,yBAAyB,CAAC,QAAgB;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC3D,IAAI,aAAa,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC;IAEtD,MAAM,UAAU,GAAG,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAErF,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACnD,MAAM,YAAY,GAAG,oBAAoB,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAClE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YACnD,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,EAAE,CAAC,cAAc,CAAC,kBAAkB,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1E,MAAM,YAAY,GAAG,EAAE,CAAC,0BAA0B,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACzF,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC;YAC3C,oBAAoB,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;YACtD,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;QACb,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,EAAE,CAAC;IACxB,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACnD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,YAAoB;IAC/C,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,4CAA4C,EAAE,GAAG,CAAC,CAAC;IAE3F,mGAAmG;IACnG,IAAI,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/E,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnD,wEAAwE;IACxE,IAAI,QAAQ,GAAG,YAAY,CAAC;IAC5B,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SAC5D,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SAClE,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SAClE,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SAC/D,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SAChE,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SAChE,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAErE,6EAA6E;IAC7E,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC;YAAE,OAAO,QAAQ,GAAG,GAAG,CAAC;IAC3D,CAAC;IAED,iGAAiG;IACjG,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,2CAA2C;IAEnF,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,UAAU,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;QACjE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC3B,wDAAwD;gBACxD,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE;oBAAE,SAAS;gBAExD,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC;gBAC5D,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;oBAC7B,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,GAAG,GAAG,CAAC;wBAAE,OAAO,YAAY,GAAG,GAAG,CAAC;gBACnE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5C,OAAO,UAAU,IAAI,UAAU,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;QAChE,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YACzD,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;gBACrC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9B,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;oBAC9D,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAEpD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACzB,2EAA2E;wBAC3E,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBAClD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;4BAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,GAAG,CAAC,CAAC;4BACxD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;gCAAE,OAAO,UAAU,CAAC;wBACnD,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM;QACR,CAAC;QACD,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,aAAa,CAAC,UAAkB,EAAE,cAAsB,EAAE,OAA2B;IAC5F,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IACjF,IAAI,CAAC,MAAM,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IAExC,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAE9E,uDAAuD;IACvD,IAAI,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC3D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACnD,mBAAmB,CAAC,GAAG,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC;IAED,oDAAoD;IACpD,sGAAsG;IACtG,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,eAAe,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAe;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;YAAE,MAAM,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,SAAS,CAAC,SAAiB,EAAE,KAA4B;IAChE,0EAA0E;IAC1E,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC;IAE1B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QAE9B,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,SAAS;QAC9D,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAExB,MAAM,OAAO,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;QAEpD,IAAI,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAClD,UAAU,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAClF,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,SAAS,IAAI,CAAC,IAAa;YACzB,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjE,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC;oBACvC,IAAI,SAAS,IAAI,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC/C,MAAM,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;wBAClE,IAAI,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;4BAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACtE,CAAC;gBACH,CAAC;YACH,CAAC;YACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,CAAC;QACjB,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE7B,6CAA6C;QAC7C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAAC,QAAgB;IACnD,IAAI,6BAA6B,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO,6BAA6B,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;IACtD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,6BAA6B,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAClD,UAAU,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAClF,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE5C,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC9C,IAAI,EAAE,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAC;YACxC,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;gBACnB,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7C,CAAC;YACD,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;YAC3F,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAE7F,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,UAAU;oBAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;qBAClC,IAAI,SAAS,CAAC,IAAI;oBAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC9C,IAAI,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,SAAS,CAAC,eAAe,IAAI,SAAS,CAAC,YAAY,IAAI,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;gBACtG,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;oBACjD,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;oBACxE,MAAM,YAAY,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;oBAClC,IAAI,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;wBACrC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;oBAC5B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,SAAS,CAAC,cAAc,IAAI,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvE,IAAI,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,6BAA6B,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB,EAAE,MAAc;IACxD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAE3C,MAAM,QAAQ,GAAG,GAAG,QAAQ,MAAM,MAAM,EAAE,CAAC;IAC3C,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;IAE/E,MAAM,OAAO,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAEpD,IAAI,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAClD,UAAU,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAClF,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtD,IAAI,mBAAmB,GAAkB,IAAI,CAAC;IAC9C,IAAI,uBAAuB,GAAG,KAAK,CAAC;IAEpC,SAAS,WAAW,CAAC,IAAa;QAChC,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;YACjE,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC;gBACvC,IAAI,SAAS,IAAI,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC/C,MAAM,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAClE,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;wBACxB,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;4BACtD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;4BACjC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gCAChB,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;4BACvD,CAAC;4BACD,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gCACzB,IAAI,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;oCAC/C,mBAAmB,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;gCACvD,CAAC;qCAAM,IAAI,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;oCACnD,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;wCAC/C,IAAI,EAAE,CAAC,UAAU;4CAAE,SAAS;wCAE5B,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;wCAC3E,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;oCACtD,CAAC;gCACH,CAAC;4BACH,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,6EAA6E;4BAC7E,uBAAuB,GAAG,IAAI,CAAC;wBACjC,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACrC,CAAC;IAED,WAAW,CAAC,UAAU,CAAC,CAAC;IAExB,IAAI,uBAAuB,EAAE,CAAC;QAC5B,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,mBAAmB,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3D,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,sBAAsB,GAAG,KAAK,CAAC;IAEnC,SAAS,cAAc,CAAC,IAAa,EAAE,iBAA0B;QAC/D,IAAI,sBAAsB;YAAE,OAAO;QAEnC,IAAI,gBAAgB,GAAG,iBAAiB,CAAC;QAEzC,IACE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;YAC9B,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAC7B,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;YACxB,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAC5B,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC;YACjC,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC;YACjC,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,EACjC,CAAC;YACD,gBAAgB,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,IAAI,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;YACrF,IAAI,CAAC,QAAQ;gBAAE,gBAAgB,GAAG,IAAI,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,MAAM,oBAAoB,GAAG,mBAAmB,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,CAAC;YAEtF,IAAI,gBAAgB,IAAI,oBAAoB,EAAE,CAAC;gBAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;gBAE3B,MAAM,8BAA8B,GAClC,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC;oBAC5B,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC;oBACzB,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC;oBAC5B,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBAE/B,IAAI,8BAA8B;oBAAE,OAAO;gBAC3C,IAAI,EAAE,CAAC,0BAA0B,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;oBAAE,OAAO;gBAC1E,IAAI,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;oBAAE,OAAO;gBACpE,IACE,CAAC,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC;oBAC7B,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC;oBAChC,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC;oBAC7B,EAAE,CAAC,sBAAsB,CAAC,MAAM,CAAC;oBACjC,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;oBACnC,MAAM,CAAC,IAAI,KAAK,IAAI,EACpB,CAAC;oBACD,OAAO;gBACT,CAAC;gBAED,IAAI,gBAAgB,EAAE,CAAC;oBACrB,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAE,CAAC;oBACzD,IAAI,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;wBAAE,OAAO;gBAC/C,CAAC;gBAED,IAAI,oBAAoB,EAAE,CAAC;oBACzB,IAAI,EAAE,CAAC,0BAA0B,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;wBACxE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;wBAClC,IAAI,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;4BAAE,OAAO;oBAC3C,CAAC;gBACH,CAAC;gBAED,IAAI,eAAe,GAAG,KAAK,CAAC;gBAC5B,IAAI,WAAW,GAAwB,MAAM,CAAC;gBAC9C,OAAO,WAAW,IAAI,WAAW,KAAK,UAAU,EAAE,CAAC;oBACjD,IACE,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;wBAC1B,EAAE,CAAC,mBAAmB,CAAC,WAAW,CAAC;wBACnC,EAAE,CAAC,sBAAsB,CAAC,WAAW,CAAC;wBACtC,EAAE,CAAC,sBAAsB,CAAC,WAAW,CAAC,EACtC,CAAC;wBACD,eAAe,GAAG,IAAI,CAAC;wBACvB,MAAM;oBACR,CAAC;oBACD,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC;gBACnC,CAAC;gBAED,IAAI,CAAC,eAAe,EAAE,CAAC;oBACrB,sBAAsB,GAAG,IAAI,CAAC;oBAC9B,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QAED,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAClC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;IACzD,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,MAAc,EAAE,KAA4B;IAC3E,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;IAEtB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QAC7B,IAAI,OAAO,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QACpC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,SAAS;QAChC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAElB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACtC,KAAK,MAAM,GAAG,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,IAAI;IACX,MAAM,EAAE,aAAa,EAAE,GAAG,SAAS,EAAE,CAAC;IAEtC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,sEAAsE;IACtE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC1C,MAAM,eAAe,GAAe,EAAE,CAAC;IACvC,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/C,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAE/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAEnC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACnE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBAClD,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;YACzD,CAAC;YAED,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/D,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,wEAAwE,CAAC,CAAC;QACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,WAAW,CAAC,MAAM,mDAAmD,CAAC,CAAC;IAE/F,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC7C,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,SAAS,UAAU,CAAC,IAAY;QAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC9B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAExB,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACpC,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAChD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAErB,MAAM,GAAG,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;gBACxC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC9B,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;iBAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBAClB,UAAU,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,YAAY,CAAC,GAAG,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,cAAc,GAAe,EAAE,CAAC;IAEtC,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,cAAc,GAAG,IAAI,CAAC;gBACtB,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,cAAc;YAAE,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAsB,CAAC;IACvD,KAAK,MAAM,EAAE,IAAI,WAAW;QAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAE3D,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC/B,OAAO,SAAS,CAAC,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,KAAK,EAAE,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,IAAI,SAAS,EAAE,CAAC;YACd,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;YAC5E,IAAI,UAAU;gBAAE,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;gBACzD,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAEtD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,eAAe,GAAG,IAAI,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,KAAK,aAAa,YAAY,MAAM,CAAC,MAAM,kCAAkC,CAAC,CAAC;YAE7F,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACtC,MAAM,QAAQ,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBAClE,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;oBACxD,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,kBAAkB,CAAC;oBACrE,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,aAAa,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,IAAI,eAAe,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ts-stack/cycle-detector",
3
3
  "type": "module",
4
- "version": "1.1.1",
4
+ "version": "1.1.3",
5
5
  "bin": {
6
6
  "cycle-detector": "./dist/index.js"
7
7
  },
@@ -21,7 +21,7 @@
21
21
  },
22
22
  "scripts": {
23
23
  "start": "npm run build && node dist/index.js",
24
- "test": "npm run build-test && npm run esm-jest",
24
+ "test": "npm run build-test && npm run esm-jest --",
25
25
  "esm-jest": "node --experimental-vm-modules --no-warnings=ExperimentalWarning node_modules/jest/bin/jest.js",
26
26
  "build": "tsc -b tsconfig.build.json",
27
27
  "build-test": "tsc -b tsconfig.unit.json",
@@ -40,14 +40,15 @@
40
40
  },
41
41
  "devDependencies": {
42
42
  "@eslint/js": "^10.0.1",
43
- "@types/jest": "^29.5.14",
43
+ "@types/jest": "^30.0.0",
44
44
  "@types/node": "^26.0.0",
45
45
  "eslint": "^10.5.0",
46
- "jest": "^29.7.0",
46
+ "jest": "^30.4.2",
47
47
  "nodemon": "^3.1.14",
48
48
  "prettier": "^3.8.4",
49
49
  "rimraf": "^5.0.10",
50
50
  "ts-node": "^10.9.2",
51
+ "type-fest": "^5.7.0",
51
52
  "typescript": "^5.9.3",
52
53
  "typescript-eslint": "^8.62.0"
53
54
  },
package/src/index.ts CHANGED
@@ -6,36 +6,15 @@ import ts from 'typescript';
6
6
 
7
7
  type NodeState = 'VISITING' | 'VISITED';
8
8
 
9
- // Global shared structures for maximum performance
10
- const graph = new Map<string, string[]>();
11
- const allUniqueCycles: string[][] = [];
12
- const globalDetectedCycles = new Set<string>();
13
-
14
- const packageMetaCache = new Map<string, { pkgDir: string; srcDirName: string; outDirName: string } | null>();
9
+ // Performance caches that are safe to share across calls (read-only filesystem data)
15
10
  const compilerOptionsCache = new Map<string, ts.CompilerOptions>();
16
-
17
- // Caches for AST and analysis results to prevent bottlenecks
18
11
  const sourceFileCache = new Map<string, ts.SourceFile>();
19
12
  const topLevelUsageCache = new Map<string, boolean>();
20
13
  const exportedHoistedFunctionsCache = new Map<string, Set<string>>();
21
-
22
- let globalProjectPath: string | undefined;
14
+ const resolvedSourceCache = new Map<string, string>(); // Performance cache for path mapping
23
15
 
24
16
  function parseArgs() {
25
- const args = [...process.argv.slice(2)];
26
- let projectPath: string | undefined;
27
- const entryPatterns: string[] = [];
28
-
29
- for (let i = 0; i < args.length; i++) {
30
- if (args[i] === '--project' || args[i] === '-p') {
31
- projectPath = args[i + 1];
32
- i++;
33
- } else {
34
- entryPatterns.push(args[i]);
35
- }
36
- }
37
-
38
- return { entryPatterns, projectPath };
17
+ return { entryPatterns: process.argv.slice(2) };
39
18
  }
40
19
 
41
20
  function isRuntimeImport(node: ts.ImportDeclaration | ts.ExportDeclaration): boolean {
@@ -47,7 +26,6 @@ function isRuntimeImport(node: ts.ImportDeclaration | ts.ExportDeclaration): boo
47
26
  if (ts.isImportDeclaration(node)) {
48
27
  if (node.importClause?.phaseModifier) return false;
49
28
  if (!node.importClause) return true; // Side-effect import
50
- if (node.importClause.phaseModifier) return false;
51
29
 
52
30
  if (node.importClause.name) return true; // Default import present
53
31
 
@@ -69,7 +47,7 @@ function getCompilerOptionsForFile(filePath: string): ts.CompilerOptions {
69
47
  const cachedOptions = compilerOptionsCache.get(currentDir);
70
48
  if (cachedOptions !== undefined) return cachedOptions;
71
49
 
72
- const configPath = ts.findConfigFile(currentDir, ts.sys.fileExists, 'tsconfig.json') || globalProjectPath;
50
+ const configPath = ts.findConfigFile(currentDir, ts.sys.fileExists, 'tsconfig.json');
73
51
 
74
52
  if (configPath) {
75
53
  const resolvedConfigPath = path.resolve(configPath);
@@ -92,78 +70,85 @@ function getCompilerOptionsForFile(filePath: string): ts.CompilerOptions {
92
70
  }
93
71
  }
94
72
 
95
- return {};
73
+ const emptyOptions = {};
74
+ compilerOptionsCache.set(currentDir, emptyOptions);
75
+ return emptyOptions;
96
76
  }
97
77
 
98
- function getPackageMeta(filePath: string) {
99
- let currentDir = path.dirname(filePath);
100
- const visitedDirs: string[] = [];
78
+ /**
79
+ * Universal resolution engine: safely maps compiled assets (.js, .d.ts) back to source files (.ts)
80
+ * Works flawlessly for standalone packages, polyrepos, and complex monorepos alike.
81
+ */
82
+ function convertToSourcePath(resolvedPath: string): string {
83
+ const isBuildDir = new RegExp(String.raw`[\\/](dist|build|lib|out|cjs|esm|bin)[\\/]`, 'i');
101
84
 
102
- while (currentDir && currentDir !== path.parse(currentDir).root) {
103
- const cached = packageMetaCache.get(currentDir);
104
- if (cached !== undefined) {
105
- for (const d of visitedDirs) packageMetaCache.set(d, cached);
106
- return cached;
107
- }
85
+ // If it's already a source file and not trapped inside a known build directory, return it directly
86
+ if (/\.(ts|tsx|mts|cts)$/.test(resolvedPath) && !isBuildDir.test(resolvedPath)) {
87
+ return resolvedPath;
88
+ }
108
89
 
109
- const pkgJsonPath = path.join(currentDir, 'package.json');
110
- if (fs.existsSync(pkgJsonPath)) {
111
- try {
112
- const content = fs.readFileSync(pkgJsonPath, 'utf8');
113
- const pkg = JSON.parse(content);
114
-
115
- let outDirName = 'dist';
116
- const mainField = pkg.main || pkg.types || pkg.typings || '';
117
-
118
- let exportsMain = '';
119
- if (pkg.exports) {
120
- if (typeof pkg.exports === 'string') {
121
- exportsMain = pkg.exports;
122
- } else if (typeof pkg.exports === 'object') {
123
- const dotExport = pkg.exports['.'];
124
- if (dotExport) {
125
- if (typeof dotExport === 'string') {
126
- exportsMain = dotExport;
127
- } else if (typeof dotExport === 'object') {
128
- exportsMain = dotExport.import || dotExport.require || dotExport.default || '';
129
- }
130
- }
131
- }
90
+ const extensions = ['.ts', '.tsx', '.mts', '.cts'];
91
+
92
+ // Strip execution/declaration extensions to get the base file signature
93
+ let baseName = resolvedPath;
94
+ if (baseName.endsWith('.d.ts')) baseName = baseName.slice(0, -5);
95
+ else if (baseName.endsWith('.d.mts')) baseName = baseName.slice(0, -6);
96
+ else if (baseName.endsWith('.d.cts')) baseName = baseName.slice(0, -6);
97
+ else if (baseName.endsWith('.js')) baseName = baseName.slice(0, -3);
98
+ else if (baseName.endsWith('.mjs')) baseName = baseName.slice(0, -4);
99
+ else if (baseName.endsWith('.cjs')) baseName = baseName.slice(0, -4);
100
+ else if (baseName.endsWith('.jsx')) baseName = baseName.slice(0, -4);
101
+
102
+ // Strategy 1: Direct Extension Swap (In-place builds or matching structures)
103
+ for (const ext of extensions) {
104
+ if (fs.existsSync(baseName + ext)) return baseName + ext;
105
+ }
106
+
107
+ // Strategy 2: Adaptive Path Segment Replacement (Remaps build directories to source directories)
108
+ const buildDirs = ['dist', 'build', 'lib', 'out', 'cjs', 'esm', 'bin'];
109
+ const srcDirs = ['src', 'source', '.']; // '.' fallback for flat root architectures
110
+
111
+ for (const bDir of buildDirs) {
112
+ const regex = new RegExp(String.raw`([\\/])${bDir}([\\/])`, 'i');
113
+ if (regex.test(baseName)) {
114
+ for (const sDir of srcDirs) {
115
+ // Skip illegal mappings that loop 'lib' back onto 'lib'
116
+ if (bDir.toLowerCase() === sDir.toLowerCase()) continue;
117
+
118
+ const replacedBase = baseName.replace(regex, `$1${sDir}$2`);
119
+ for (const ext of extensions) {
120
+ if (fs.existsSync(replacedBase + ext)) return replacedBase + ext;
132
121
  }
122
+ }
123
+ }
124
+ }
133
125
 
134
- const targetField = mainField || exportsMain;
135
- if (targetField) {
136
- const parts = path.normalize(targetField).split(path.sep);
137
- const cleanParts = parts.filter((p) => p !== '.' && p !== '..');
138
- if (cleanParts.length > 0) {
139
- outDirName = cleanParts[0];
126
+ // Strategy 3: Boundary-driven subpath mapping via closest package.json
127
+ let currentDir = path.dirname(resolvedPath);
128
+ while (currentDir && currentDir !== path.parse(currentDir).root) {
129
+ if (fs.existsSync(path.join(currentDir, 'package.json'))) {
130
+ for (const sDir of ['src', 'source']) {
131
+ const srcDirPath = path.join(currentDir, sDir);
132
+ if (fs.existsSync(srcDirPath)) {
133
+ const relativeToPackage = path.relative(currentDir, baseName);
134
+ const pathParts = relativeToPackage.split(path.sep);
135
+
136
+ if (pathParts.length > 1) {
137
+ // Drop the first segment (which is the output folder like 'dist' or 'lib')
138
+ const subPath = pathParts.slice(1).join(path.sep);
139
+ for (const ext of extensions) {
140
+ const targetFile = path.join(srcDirPath, subPath + ext);
141
+ if (fs.existsSync(targetFile)) return targetFile;
142
+ }
140
143
  }
141
- } else {
142
- if (fs.existsSync(path.join(currentDir, 'dist'))) outDirName = 'dist';
143
- else if (fs.existsSync(path.join(currentDir, 'build'))) outDirName = 'build';
144
- else if (fs.existsSync(path.join(currentDir, 'out'))) outDirName = 'out';
145
144
  }
146
-
147
- let srcDirName = 'src';
148
- if (fs.existsSync(path.join(currentDir, 'source'))) srcDirName = 'source';
149
- else if (fs.existsSync(path.join(currentDir, 'lib'))) srcDirName = 'lib';
150
-
151
- const meta = { pkgDir: currentDir, srcDirName, outDirName };
152
- packageMetaCache.set(currentDir, meta);
153
- for (const d of visitedDirs) packageMetaCache.set(d, meta);
154
- return meta;
155
- } catch {
156
- packageMetaCache.set(currentDir, null);
157
- for (const d of visitedDirs) packageMetaCache.set(d, null);
158
- return null;
159
145
  }
146
+ break;
160
147
  }
161
-
162
- visitedDirs.push(currentDir);
163
148
  currentDir = path.dirname(currentDir);
164
149
  }
165
150
 
166
- return null;
151
+ return resolvedPath;
167
152
  }
168
153
 
169
154
  function resolveModule(moduleName: string, containingFile: string, options: ts.CompilerOptions): string | null {
@@ -171,37 +156,21 @@ function resolveModule(moduleName: string, containingFile: string, options: ts.C
171
156
  if (!result.resolvedModule) return null;
172
157
 
173
158
  const resolvedFileName = path.resolve(result.resolvedModule.resolvedFileName);
174
- if (resolvedFileName.includes(`${path.sep}node_modules${path.sep}`)) return null;
175
-
176
- const meta = getPackageMeta(resolvedFileName);
177
- if (meta) {
178
- const { pkgDir, srcDirName, outDirName } = meta;
179
- const srcDirPath = path.join(pkgDir, srcDirName);
180
-
181
- if (resolvedFileName.startsWith(srcDirPath + path.sep)) return resolvedFileName;
182
-
183
- const outDirPath = path.join(pkgDir, outDirName);
184
- if (resolvedFileName.startsWith(outDirPath + path.sep) || resolvedFileName === outDirPath) {
185
- const relativeToOut = path.relative(outDirPath, resolvedFileName);
186
- let baseName = relativeToOut;
187
-
188
- if (baseName.endsWith('.d.ts')) baseName = baseName.slice(0, -5);
189
- else if (baseName.endsWith('.d.mts')) baseName = baseName.slice(0, -6);
190
- else if (baseName.endsWith('.d.cts')) baseName = baseName.slice(0, -6);
191
- else if (baseName.endsWith('.js')) baseName = baseName.slice(0, -3);
192
- else if (baseName.endsWith('.mjs')) baseName = baseName.slice(0, -4);
193
- else if (baseName.endsWith('.cjs')) baseName = baseName.slice(0, -4);
194
- else if (baseName.endsWith('.jsx')) baseName = baseName.slice(0, -4);
195
-
196
- const extensions = ['.ts', '.tsx', '.mts', '.cts'];
197
- for (const ext of extensions) {
198
- const targetSrcFile = path.join(srcDirPath, baseName + ext);
199
- if (fs.existsSync(targetSrcFile)) return targetSrcFile;
200
- }
201
- }
159
+
160
+ // Run universal mapping first: dist/*.d.ts -> src/*.ts
161
+ let sourcePath = resolvedSourceCache.get(resolvedFileName);
162
+ if (sourcePath === undefined) {
163
+ sourcePath = convertToSourcePath(resolvedFileName);
164
+ resolvedSourceCache.set(resolvedFileName, sourcePath);
165
+ }
166
+
167
+ // Safety filter: Ignore true external node_modules.
168
+ // Symlinked monorepo packages will successfully map to their local paths above and bypass this check.
169
+ if (sourcePath.includes(`${path.sep}node_modules${path.sep}`)) {
170
+ return null;
202
171
  }
203
172
 
204
- return result.resolvedModule.isExternalLibraryImport ? null : resolvedFileName;
173
+ return sourcePath;
205
174
  }
206
175
 
207
176
  function getCanonicalCycleKey(cycle: string[]): string {
@@ -218,43 +187,50 @@ function getCanonicalCycleKey(cycle: string[]): string {
218
187
  return rotated.join('|');
219
188
  }
220
189
 
221
- function parseFile(filePath: string) {
222
- if (graph.has(filePath) || !fs.existsSync(filePath)) return;
223
- graph.set(filePath, []);
190
+ function parseFile(startPath: string, graph: Map<string, string[]>) {
191
+ // Iterative DFS to avoid stack overflow on deeply nested dependency trees
192
+ const queue = [startPath];
224
193
 
225
- const options = getCompilerOptionsForFile(filePath);
194
+ while (queue.length > 0) {
195
+ const filePath = queue.pop()!;
226
196
 
227
- let sourceFile = sourceFileCache.get(filePath);
228
- if (!sourceFile) {
229
- const content = fs.readFileSync(filePath, 'utf8');
230
- sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
231
- sourceFileCache.set(filePath, sourceFile);
232
- }
197
+ if (graph.has(filePath) || !fs.existsSync(filePath)) continue;
198
+ graph.set(filePath, []);
233
199
 
234
- const imports: string[] = [];
200
+ const options = getCompilerOptionsForFile(filePath);
235
201
 
236
- function walk(node: ts.Node) {
237
- if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {
238
- if (isRuntimeImport(node)) {
239
- const specifier = node.moduleSpecifier;
240
- if (specifier && ts.isStringLiteral(specifier)) {
241
- const resolved = resolveModule(specifier.text, filePath, options);
242
- if (resolved && !imports.includes(resolved)) imports.push(resolved);
202
+ let sourceFile = sourceFileCache.get(filePath);
203
+ if (!sourceFile) {
204
+ const content = fs.readFileSync(filePath, 'utf8');
205
+ sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
206
+ sourceFileCache.set(filePath, sourceFile);
207
+ }
208
+
209
+ const imports: string[] = [];
210
+
211
+ function walk(node: ts.Node) {
212
+ if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {
213
+ if (isRuntimeImport(node)) {
214
+ const specifier = node.moduleSpecifier;
215
+ if (specifier && ts.isStringLiteral(specifier)) {
216
+ const resolved = resolveModule(specifier.text, filePath, options);
217
+ if (resolved && !imports.includes(resolved)) imports.push(resolved);
218
+ }
243
219
  }
244
220
  }
221
+ ts.forEachChild(node, walk);
245
222
  }
246
- ts.forEachChild(node, walk);
247
- }
248
223
 
249
- walk(sourceFile);
250
- graph.set(filePath, imports);
224
+ walk(sourceFile);
225
+ graph.set(filePath, imports);
251
226
 
252
- for (const dep of imports) parseFile(dep);
227
+ // Push unvisited dependencies onto the queue
228
+ for (const dep of imports) {
229
+ if (!graph.has(dep)) queue.push(dep);
230
+ }
231
+ }
253
232
  }
254
233
 
255
- /**
256
- * Analyzes a file and extracts the names of all exported functions that are hoisted.
257
- */
258
234
  function getExportedHoistedFunctions(filePath: string): Set<string> {
259
235
  if (exportedHoistedFunctionsCache.has(filePath)) {
260
236
  return exportedHoistedFunctionsCache.get(filePath)!;
@@ -280,7 +256,6 @@ function getExportedHoistedFunctions(filePath: string): Set<string> {
280
256
 
281
257
  const localHoistedFuncs = new Set<string>();
282
258
 
283
- // Pass 1: Find all top-level function declarations and direct export modifiers
284
259
  for (const statement of sourceFile.statements) {
285
260
  if (ts.isFunctionDeclaration(statement)) {
286
261
  if (statement.name) {
@@ -296,7 +271,6 @@ function getExportedHoistedFunctions(filePath: string): Set<string> {
296
271
  }
297
272
  }
298
273
 
299
- // Pass 2: Look for independent export declarations or export assignments mapping to local functions
300
274
  for (const statement of sourceFile.statements) {
301
275
  if (ts.isExportDeclaration(statement)) {
302
276
  if (!statement.moduleSpecifier && statement.exportClause && ts.isNamedExports(statement.exportClause)) {
@@ -321,9 +295,6 @@ function getExportedHoistedFunctions(filePath: string): Set<string> {
321
295
  return hoisted;
322
296
  }
323
297
 
324
- /**
325
- * Checks if a specific file import creates an immediate execution (top-level) risk.
326
- */
327
298
  function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
328
299
  if (!fs.existsSync(fromFile)) return false;
329
300
 
@@ -344,10 +315,7 @@ function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
344
315
  }
345
316
  }
346
317
 
347
- // Get all safe hoisted exports from the target file
348
318
  const hoistedExports = getExportedHoistedFunctions(toFile);
349
-
350
- // Maps local import identifier to its original exported symbol name
351
319
  const localToExportedName = new Map<string, string>();
352
320
  let namespaceImportName: string | null = null;
353
321
  let hasSideEffectOrReExport = false;
@@ -369,12 +337,15 @@ function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
369
337
  namespaceImportName = clause.namedBindings.name.text;
370
338
  } else if (ts.isNamedImports(clause.namedBindings)) {
371
339
  for (const el of clause.namedBindings.elements) {
340
+ if (el.isTypeOnly) continue;
341
+
372
342
  const exportedName = el.propertyName ? el.propertyName.text : el.name.text;
373
343
  localToExportedName.set(el.name.text, exportedName);
374
344
  }
375
345
  }
376
346
  }
377
347
  } else {
348
+ // Side-effect import OR export ... from '...' (re-export) — always top-level
378
349
  hasSideEffectOrReExport = true;
379
350
  }
380
351
  }
@@ -426,7 +397,6 @@ function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
426
397
  if (isImportedSymbol || isNamespaceReference) {
427
398
  const parent = node.parent;
428
399
 
429
- // Protection 1: Skip metadata/declarations references
430
400
  const isImportOrExportDeclarationRef =
431
401
  ts.isImportSpecifier(parent) ||
432
402
  ts.isImportClause(parent) ||
@@ -434,14 +404,8 @@ function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
434
404
  ts.isExportSpecifier(parent);
435
405
 
436
406
  if (isImportOrExportDeclarationRef) return;
437
-
438
- // Protection 2: Avoid object property name access False Positives (obj.foo)
439
407
  if (ts.isPropertyAccessExpression(parent) && parent.name === node) return;
440
-
441
- // Protection 3: Avoid object assignment keys False Positives ({ foo: 123 })
442
408
  if (ts.isPropertyAssignment(parent) && parent.name === node) return;
443
-
444
- // Protection 4: Avoid shadow declarations with matching names
445
409
  if (
446
410
  (ts.isMethodDeclaration(parent) ||
447
411
  ts.isPropertyDeclaration(parent) ||
@@ -453,25 +417,18 @@ function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
453
417
  return;
454
418
  }
455
419
 
456
- // (Hoisting check 1): Direct or renamed named/default import usage
457
420
  if (isImportedSymbol) {
458
421
  const exportedName = localToExportedName.get(node.text)!;
459
- if (hoistedExports.has(exportedName)) {
460
- return; // Perfectly safe hoisted function call/reference!
461
- }
422
+ if (hoistedExports.has(exportedName)) return;
462
423
  }
463
424
 
464
- // (Hoisting check 2): Namespace import property access usage (ns.foo())
465
425
  if (isNamespaceReference) {
466
426
  if (ts.isPropertyAccessExpression(parent) && parent.expression === node) {
467
427
  const propName = parent.name.text;
468
- if (hoistedExports.has(propName)) {
469
- return; // Perfectly safe property from namespace!
470
- }
428
+ if (hoistedExports.has(propName)) return;
471
429
  }
472
430
  }
473
431
 
474
- // Protection 5: Type contexts checks
475
432
  let isInTypeContext = false;
476
433
  let checkParent: ts.Node | undefined = parent;
477
434
  while (checkParent && checkParent !== sourceFile) {
@@ -502,7 +459,7 @@ function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
502
459
  return dangerousTopLevelUsage;
503
460
  }
504
461
 
505
- function canReach(start: string, target: string): boolean {
462
+ function canReach(start: string, target: string, graph: Map<string, string[]>): boolean {
506
463
  const seen = new Set<string>();
507
464
  const stack = [start];
508
465
 
@@ -519,14 +476,18 @@ function canReach(start: string, target: string): boolean {
519
476
  }
520
477
 
521
478
  function main() {
522
- const { entryPatterns, projectPath } = parseArgs();
523
- globalProjectPath = projectPath;
479
+ const { entryPatterns } = parseArgs();
524
480
 
525
481
  if (entryPatterns.length === 0) {
526
482
  console.error('❌ Error: Please specify at least one entry point or glob pattern.');
527
483
  process.exit(1);
528
484
  }
529
485
 
486
+ // All mutable state is local to each run — no cross-run contamination
487
+ const graph = new Map<string, string[]>();
488
+ const allUniqueCycles: string[][] = [];
489
+ const globalDetectedCycles = new Set<string>();
490
+
530
491
  const entryPoints: string[] = [];
531
492
 
532
493
  for (const pattern of entryPatterns) {
@@ -555,7 +516,7 @@ function main() {
555
516
  console.log(`🔍 Found ${entryPoints.length} entry point(s) for analysis. Building graph...\n`);
556
517
 
557
518
  for (const entryPoint of entryPoints) {
558
- parseFile(entryPoint);
519
+ parseFile(entryPoint, graph);
559
520
  }
560
521
 
561
522
  const visited = new Map<string, NodeState>();
@@ -616,7 +577,7 @@ function main() {
616
577
  if (matchedEp) {
617
578
  entryPointCycles.get(matchedEp)!.push(cycle);
618
579
  } else {
619
- const reachingEp = entryPoints.find((ep) => canReach(ep, firstFile));
580
+ const reachingEp = entryPoints.find((ep) => canReach(ep, firstFile, graph));
620
581
  if (reachingEp) entryPointCycles.get(reachingEp)!.push(cycle);
621
582
  else entryPointCycles.get(entryPoints[0])!.push(cycle);
622
583
  }