workflow-agent-cli 2.22.10 → 2.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -214,6 +214,7 @@ async function recordSuccessfulFixes(cwd, result) {
214
214
  frameworkVersion
215
215
  );
216
216
  console.log(chalk.dim(` \u2713 Recorded: ${patternName}`));
217
+ console.log(chalk.dim(` Path: .workflow/patterns/fixes/${newPattern.id}.json`));
217
218
  }
218
219
  }
219
220
  }
@@ -235,4 +236,4 @@ async function recordSuccessfulFixes(cwd, result) {
235
236
  export {
236
237
  verifyCommand
237
238
  };
238
- //# sourceMappingURL=chunk-3ARRW423.js.map
239
+ //# sourceMappingURL=chunk-D36IFZUZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands/verify.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport {\n runAllChecks,\n hasUncommittedChanges,\n stageAllChanges,\n type RunAllChecksResult,\n} from \"../../utils/check-runner.js\";\nimport { execa } from \"execa\";\nimport {\n PatternStore,\n TelemetryCollector,\n ContributorManager,\n type FixPattern,\n} from \"@hawkinside_out/workflow-improvement-tracker\";\n\ninterface VerifyOptions {\n fix?: boolean;\n maxRetries?: string;\n commit?: boolean;\n dryRun?: boolean;\n learn?: boolean;\n}\n\n/**\n * Verify command - Run all quality checks with fix-and-revalidate pattern\n *\n * Pattern: Run check → If fails, fix → Re-run ALL checks from start\n * This ensures fixes don't introduce new issues in earlier checks.\n */\nexport async function verifyCommand(options: VerifyOptions) {\n const cwd = process.cwd();\n const maxRetries = options.maxRetries ? parseInt(options.maxRetries, 10) : 10;\n const autoFix = options.fix ?? false;\n const shouldCommit = options.commit ?? false;\n const dryRun = options.dryRun ?? false;\n const learnFromFixes = options.learn ?? false;\n\n console.log(chalk.bold.cyan(\"\\n🔍 Workflow Agent Quality Verification\\n\"));\n\n if (dryRun) {\n console.log(chalk.yellow(\"📋 DRY-RUN MODE: No changes will be applied\\n\"));\n }\n\n console.log(chalk.dim(` Auto-fix: ${autoFix ? \"enabled\" : \"disabled\"}`));\n console.log(chalk.dim(` Max retries: ${maxRetries}`));\n console.log(chalk.dim(` Commit on success: ${shouldCommit ? \"yes\" : \"no\"}`));\n console.log(chalk.dim(` Dry-run: ${dryRun ? \"yes\" : \"no\"}`));\n console.log(\n chalk.dim(` Learn from fixes: ${learnFromFixes ? \"yes\" : \"no\"}`),\n );\n\n const startTime = Date.now();\n\n const result = await runAllChecks(cwd, {\n maxRetries,\n autoFix,\n dryRun,\n });\n\n const totalTime = ((Date.now() - startTime) / 1000).toFixed(2);\n\n console.log(`\\n${\"━\".repeat(50)}`);\n\n if (result.success) {\n console.log(chalk.bold.green(\"\\n✅ ALL QUALITY CHECKS PASSED!\\n\"));\n console.log(chalk.dim(` Total time: ${totalTime}s`));\n console.log(chalk.dim(` Validation cycles: ${result.totalAttempts}`));\n console.log(chalk.dim(` Fixes applied: ${result.fixesApplied}`));\n\n // Auto-record successful fix patterns if learning is enabled\n if (learnFromFixes && result.fixesApplied > 0 && !dryRun) {\n await recordSuccessfulFixes(cwd, result);\n }\n\n // Handle commit if requested\n if (shouldCommit) {\n const hasChanges = await hasUncommittedChanges(cwd);\n\n if (hasChanges) {\n console.log(chalk.cyan(\"\\n📦 Staging and committing changes...\\n\"));\n\n const staged = await stageAllChanges(cwd);\n if (!staged) {\n console.log(chalk.red(\"❌ Failed to stage changes\"));\n process.exit(1);\n }\n\n try {\n await execa(\n \"git\",\n [\"commit\", \"-m\", \"chore: auto-fix quality issues\"],\n { cwd },\n );\n console.log(chalk.green(\"✅ Changes committed successfully\"));\n } catch (error) {\n console.log(chalk.red(\"❌ Failed to commit changes\"));\n console.log(chalk.dim((error as Error).message));\n process.exit(1);\n }\n } else {\n console.log(chalk.dim(\"\\n No changes to commit.\"));\n }\n }\n\n console.log(chalk.cyan(\"\\n💡 Next steps:\\n\"));\n console.log(chalk.dim(\" 1. git add .\"));\n console.log(\n chalk.dim(' 2. git commit -m \"<type>(<scope>): <description>\"'),\n );\n console.log(chalk.dim(\" 3. git push origin <branch-name>\"));\n console.log(\"\");\n\n process.exit(0);\n } else {\n console.log(chalk.bold.red(\"\\n❌ QUALITY CHECKS FAILED\\n\"));\n console.log(chalk.dim(` Total time: ${totalTime}s`));\n console.log(chalk.dim(` Validation cycles: ${result.totalAttempts}`));\n console.log(chalk.dim(` Fixes applied: ${result.fixesApplied}`));\n\n if (result.pendingFixes && result.pendingFixes.length > 0) {\n console.log(chalk.yellow(\"\\n📋 Pending fixes (dry-run):\"));\n for (const fix of result.pendingFixes) {\n console.log(chalk.dim(` • ${fix.check.displayName}: ${fix.command}`));\n }\n }\n\n console.log(\n chalk.yellow(\"\\n⚠️ Please fix the errors above and run again.\"),\n );\n console.log(\n chalk.dim(\" Run with --fix to auto-fix lint and format issues.\"),\n );\n console.log(\"\");\n\n process.exit(1);\n }\n}\n\n// ============================================\n// Auto-Record Learning Pattern\n// ============================================\n\n/**\n * Record successful fix patterns for learning\n * Called after verify succeeds with auto-fixes applied\n */\nasync function recordSuccessfulFixes(\n cwd: string,\n result: RunAllChecksResult,\n): Promise<void> {\n try {\n // Check if telemetry is enabled\n const contributorManager = new ContributorManager(cwd);\n const telemetryEnabled = await contributorManager.isTelemetryEnabled();\n\n if (!telemetryEnabled) {\n // Silently skip if telemetry is disabled\n return;\n }\n\n const store = new PatternStore(cwd);\n const telemetry = new TelemetryCollector(cwd);\n\n // Get package.json to determine framework\n let framework = \"unknown\";\n let frameworkVersion = \"0.0.0\";\n\n try {\n const fs = await import(\"node:fs\");\n const path = await import(\"node:path\");\n const packageJsonPath = path.join(cwd, \"package.json\");\n const packageJson = JSON.parse(\n await fs.promises.readFile(packageJsonPath, \"utf-8\"),\n );\n\n // Detect framework from dependencies\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n if (deps[\"next\"]) {\n framework = \"next\";\n frameworkVersion = deps[\"next\"].replace(/[\\^~]/, \"\");\n } else if (deps[\"react\"]) {\n framework = \"react\";\n frameworkVersion = deps[\"react\"].replace(/[\\^~]/, \"\");\n } else if (deps[\"vue\"]) {\n framework = \"vue\";\n frameworkVersion = deps[\"vue\"].replace(/[\\^~]/, \"\");\n } else if (deps[\"express\"]) {\n framework = \"express\";\n frameworkVersion = deps[\"express\"].replace(/[\\^~]/, \"\");\n }\n } catch {\n // Ignore package.json read errors\n }\n\n // Record telemetry for each fix applied\n if (result.appliedFixes && result.appliedFixes.length > 0) {\n console.log(\n chalk.cyan(\"\\n📚 Recording successful fixes for learning...\\n\"),\n );\n\n for (const fix of result.appliedFixes) {\n // Create or find existing pattern for this fix type\n const patternName = `Auto-fix: ${fix.displayName}`;\n const patternId = crypto.randomUUID();\n\n // Check if we already have a pattern for this fix type\n const existingPatterns = await store.listFixPatterns({\n tags: [{ category: \"tool\", name: fix.checkName }],\n });\n\n if (\n existingPatterns.success &&\n existingPatterns.data &&\n existingPatterns.data.length > 0\n ) {\n // Update metrics on existing pattern\n const existingPattern = existingPatterns.data[0];\n await store.updateFixMetrics(existingPattern.id, true);\n await telemetry.recordSuccess(\n existingPattern.id,\n \"fix\",\n framework,\n frameworkVersion,\n );\n console.log(chalk.dim(` ✓ Updated: ${existingPattern.name}`));\n } else {\n // Create new pattern\n const now = new Date().toISOString();\n const newPattern: FixPattern = {\n id: patternId,\n name: patternName,\n description: `Auto-fix pattern for ${fix.displayName} using command: ${fix.command}`,\n category: \"config\",\n tags: [\n { category: \"tool\", name: fix.checkName },\n { category: \"framework\", name: framework },\n ],\n trigger: {\n errorPattern: fix.checkName,\n errorMessage: `${fix.checkName} check failed`,\n filePattern: \"**/*\",\n },\n solution: {\n type: \"command\",\n steps: [\n {\n order: 1,\n action: \"run\",\n target: fix.command,\n description: `Run ${fix.command}`,\n },\n ],\n },\n compatibility: {\n framework,\n frameworkVersion: `>=${frameworkVersion}`,\n runtime: \"node\",\n runtimeVersion: \">=18.0.0\",\n dependencies: [],\n },\n metrics: {\n applications: 1,\n successes: 1,\n failures: 0,\n successRate: 100,\n lastUsed: now,\n lastSuccessful: now,\n },\n source: \"verify-fix\",\n isPrivate: true,\n createdAt: now,\n updatedAt: now,\n };\n\n const saveResult = await store.saveFixPattern(newPattern);\n if (saveResult.success) {\n await telemetry.recordSuccess(\n patternId,\n \"fix\",\n framework,\n frameworkVersion,\n );\n console.log(chalk.dim(` ✓ Recorded: ${patternName}`));\n }\n }\n }\n\n console.log(\n chalk.dim(`\\n Use 'workflow learn:list' to see recorded patterns.`),\n );\n }\n } catch (error) {\n // Don't fail the verify command if learning fails\n console.log(\n chalk.dim(\n `\\n Note: Could not record learning patterns: ${(error as Error).message}`,\n ),\n );\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/cli/commands/verify.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport {\n runAllChecks,\n hasUncommittedChanges,\n stageAllChanges,\n type RunAllChecksResult,\n} from \"../../utils/check-runner.js\";\nimport { execa } from \"execa\";\nimport {\n PatternStore,\n TelemetryCollector,\n ContributorManager,\n type FixPattern,\n} from \"@hawkinside_out/workflow-improvement-tracker\";\n\ninterface VerifyOptions {\n fix?: boolean;\n maxRetries?: string;\n commit?: boolean;\n dryRun?: boolean;\n learn?: boolean;\n}\n\n/**\n * Verify command - Run all quality checks with fix-and-revalidate pattern\n *\n * Pattern: Run check → If fails, fix → Re-run ALL checks from start\n * This ensures fixes don't introduce new issues in earlier checks.\n */\nexport async function verifyCommand(options: VerifyOptions) {\n const cwd = process.cwd();\n const maxRetries = options.maxRetries ? parseInt(options.maxRetries, 10) : 10;\n const autoFix = options.fix ?? false;\n const shouldCommit = options.commit ?? false;\n const dryRun = options.dryRun ?? false;\n const learnFromFixes = options.learn ?? false;\n\n console.log(chalk.bold.cyan(\"\\n🔍 Workflow Agent Quality Verification\\n\"));\n\n if (dryRun) {\n console.log(chalk.yellow(\"📋 DRY-RUN MODE: No changes will be applied\\n\"));\n }\n\n console.log(chalk.dim(` Auto-fix: ${autoFix ? \"enabled\" : \"disabled\"}`));\n console.log(chalk.dim(` Max retries: ${maxRetries}`));\n console.log(chalk.dim(` Commit on success: ${shouldCommit ? \"yes\" : \"no\"}`));\n console.log(chalk.dim(` Dry-run: ${dryRun ? \"yes\" : \"no\"}`));\n console.log(\n chalk.dim(` Learn from fixes: ${learnFromFixes ? \"yes\" : \"no\"}`),\n );\n\n const startTime = Date.now();\n\n const result = await runAllChecks(cwd, {\n maxRetries,\n autoFix,\n dryRun,\n });\n\n const totalTime = ((Date.now() - startTime) / 1000).toFixed(2);\n\n console.log(`\\n${\"━\".repeat(50)}`);\n\n if (result.success) {\n console.log(chalk.bold.green(\"\\n✅ ALL QUALITY CHECKS PASSED!\\n\"));\n console.log(chalk.dim(` Total time: ${totalTime}s`));\n console.log(chalk.dim(` Validation cycles: ${result.totalAttempts}`));\n console.log(chalk.dim(` Fixes applied: ${result.fixesApplied}`));\n\n // Auto-record successful fix patterns if learning is enabled\n if (learnFromFixes && result.fixesApplied > 0 && !dryRun) {\n await recordSuccessfulFixes(cwd, result);\n }\n\n // Handle commit if requested\n if (shouldCommit) {\n const hasChanges = await hasUncommittedChanges(cwd);\n\n if (hasChanges) {\n console.log(chalk.cyan(\"\\n📦 Staging and committing changes...\\n\"));\n\n const staged = await stageAllChanges(cwd);\n if (!staged) {\n console.log(chalk.red(\"❌ Failed to stage changes\"));\n process.exit(1);\n }\n\n try {\n await execa(\n \"git\",\n [\"commit\", \"-m\", \"chore: auto-fix quality issues\"],\n { cwd },\n );\n console.log(chalk.green(\"✅ Changes committed successfully\"));\n } catch (error) {\n console.log(chalk.red(\"❌ Failed to commit changes\"));\n console.log(chalk.dim((error as Error).message));\n process.exit(1);\n }\n } else {\n console.log(chalk.dim(\"\\n No changes to commit.\"));\n }\n }\n\n console.log(chalk.cyan(\"\\n💡 Next steps:\\n\"));\n console.log(chalk.dim(\" 1. git add .\"));\n console.log(\n chalk.dim(' 2. git commit -m \"<type>(<scope>): <description>\"'),\n );\n console.log(chalk.dim(\" 3. git push origin <branch-name>\"));\n console.log(\"\");\n\n process.exit(0);\n } else {\n console.log(chalk.bold.red(\"\\n❌ QUALITY CHECKS FAILED\\n\"));\n console.log(chalk.dim(` Total time: ${totalTime}s`));\n console.log(chalk.dim(` Validation cycles: ${result.totalAttempts}`));\n console.log(chalk.dim(` Fixes applied: ${result.fixesApplied}`));\n\n if (result.pendingFixes && result.pendingFixes.length > 0) {\n console.log(chalk.yellow(\"\\n📋 Pending fixes (dry-run):\"));\n for (const fix of result.pendingFixes) {\n console.log(chalk.dim(` • ${fix.check.displayName}: ${fix.command}`));\n }\n }\n\n console.log(\n chalk.yellow(\"\\n⚠️ Please fix the errors above and run again.\"),\n );\n console.log(\n chalk.dim(\" Run with --fix to auto-fix lint and format issues.\"),\n );\n console.log(\"\");\n\n process.exit(1);\n }\n}\n\n// ============================================\n// Auto-Record Learning Pattern\n// ============================================\n\n/**\n * Record successful fix patterns for learning\n * Called after verify succeeds with auto-fixes applied\n */\nasync function recordSuccessfulFixes(\n cwd: string,\n result: RunAllChecksResult,\n): Promise<void> {\n try {\n // Check if telemetry is enabled\n const contributorManager = new ContributorManager(cwd);\n const telemetryEnabled = await contributorManager.isTelemetryEnabled();\n\n if (!telemetryEnabled) {\n // Silently skip if telemetry is disabled\n return;\n }\n\n const store = new PatternStore(cwd);\n const telemetry = new TelemetryCollector(cwd);\n\n // Get package.json to determine framework\n let framework = \"unknown\";\n let frameworkVersion = \"0.0.0\";\n\n try {\n const fs = await import(\"node:fs\");\n const path = await import(\"node:path\");\n const packageJsonPath = path.join(cwd, \"package.json\");\n const packageJson = JSON.parse(\n await fs.promises.readFile(packageJsonPath, \"utf-8\"),\n );\n\n // Detect framework from dependencies\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n if (deps[\"next\"]) {\n framework = \"next\";\n frameworkVersion = deps[\"next\"].replace(/[\\^~]/, \"\");\n } else if (deps[\"react\"]) {\n framework = \"react\";\n frameworkVersion = deps[\"react\"].replace(/[\\^~]/, \"\");\n } else if (deps[\"vue\"]) {\n framework = \"vue\";\n frameworkVersion = deps[\"vue\"].replace(/[\\^~]/, \"\");\n } else if (deps[\"express\"]) {\n framework = \"express\";\n frameworkVersion = deps[\"express\"].replace(/[\\^~]/, \"\");\n }\n } catch {\n // Ignore package.json read errors\n }\n\n // Record telemetry for each fix applied\n if (result.appliedFixes && result.appliedFixes.length > 0) {\n console.log(\n chalk.cyan(\"\\n📚 Recording successful fixes for learning...\\n\"),\n );\n\n for (const fix of result.appliedFixes) {\n // Create or find existing pattern for this fix type\n const patternName = `Auto-fix: ${fix.displayName}`;\n const patternId = crypto.randomUUID();\n\n // Check if we already have a pattern for this fix type\n const existingPatterns = await store.listFixPatterns({\n tags: [{ category: \"tool\", name: fix.checkName }],\n });\n\n if (\n existingPatterns.success &&\n existingPatterns.data &&\n existingPatterns.data.length > 0\n ) {\n // Update metrics on existing pattern\n const existingPattern = existingPatterns.data[0];\n await store.updateFixMetrics(existingPattern.id, true);\n await telemetry.recordSuccess(\n existingPattern.id,\n \"fix\",\n framework,\n frameworkVersion,\n );\n console.log(chalk.dim(` ✓ Updated: ${existingPattern.name}`));\n } else {\n // Create new pattern\n const now = new Date().toISOString();\n const newPattern: FixPattern = {\n id: patternId,\n name: patternName,\n description: `Auto-fix pattern for ${fix.displayName} using command: ${fix.command}`,\n category: \"config\",\n tags: [\n { category: \"tool\", name: fix.checkName },\n { category: \"framework\", name: framework },\n ],\n trigger: {\n errorPattern: fix.checkName,\n errorMessage: `${fix.checkName} check failed`,\n filePattern: \"**/*\",\n },\n solution: {\n type: \"command\",\n steps: [\n {\n order: 1,\n action: \"run\",\n target: fix.command,\n description: `Run ${fix.command}`,\n },\n ],\n },\n compatibility: {\n framework,\n frameworkVersion: `>=${frameworkVersion}`,\n runtime: \"node\",\n runtimeVersion: \">=18.0.0\",\n dependencies: [],\n },\n metrics: {\n applications: 1,\n successes: 1,\n failures: 0,\n successRate: 100,\n lastUsed: now,\n lastSuccessful: now,\n },\n source: \"verify-fix\",\n isPrivate: true,\n createdAt: now,\n updatedAt: now,\n };\n\n const saveResult = await store.saveFixPattern(newPattern);\n if (saveResult.success) {\n await telemetry.recordSuccess(\n patternId,\n \"fix\",\n framework,\n frameworkVersion,\n );\n console.log(chalk.dim(` ✓ Recorded: ${patternName}`));\n console.log(chalk.dim(` Path: .workflow/patterns/fixes/${newPattern.id}.json`));\n }\n }\n }\n\n console.log(\n chalk.dim(`\\n Use 'workflow learn:list' to see recorded patterns.`),\n );\n }\n } catch (error) {\n // Don't fail the verify command if learning fails\n console.log(\n chalk.dim(\n `\\n Note: Could not record learning patterns: ${(error as Error).message}`,\n ),\n );\n }\n}\n"],"mappings":"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","names":[]}
@@ -512,13 +512,19 @@ async function syncCommand(options) {
512
512
  for (const pulled of pullResult.patterns) {
513
513
  try {
514
514
  if (pulled.type === "fix" && pulled.data) {
515
- await store.saveFixPattern(pulled.data);
515
+ const fixData = pulled.data;
516
+ await store.saveFixPattern(fixData);
517
+ console.log(chalk.dim(` \u2713 ${fixData.name} (fix)`));
516
518
  savedCount++;
517
519
  } else if (pulled.type === "blueprint" && pulled.data) {
518
- await store.saveBlueprint(pulled.data);
520
+ const blueprintData = pulled.data;
521
+ await store.saveBlueprint(blueprintData);
522
+ console.log(chalk.dim(` \u2713 ${blueprintData.name} (blueprint)`));
519
523
  savedCount++;
520
524
  } else if (pulled.type === "solution" && pulled.data) {
521
- await store.saveSolution(pulled.data);
525
+ const solutionData = pulled.data;
526
+ await store.saveSolution(solutionData);
527
+ console.log(chalk.dim(` \u2713 ${solutionData.name} (solution)`));
522
528
  savedCount++;
523
529
  }
524
530
  } catch {
@@ -573,4 +579,4 @@ async function syncCommand(options) {
573
579
  export {
574
580
  syncCommand
575
581
  };
576
- //# sourceMappingURL=chunk-MMPXQG3O.js.map
582
+ //# sourceMappingURL=chunk-M6RHIUSM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/sync.ts","../src/sync/registry-client.ts"],"sourcesContent":["/**\n * Unified Sync Command\n *\n * Orchestrates syncing of patterns and solutions with the registry.\n * Combines functionality from learn:sync and solution sync.\n *\n * Usage:\n * workflow sync # Interactive sync (prompts for direction)\n * workflow sync --push # Push local patterns to registry\n * workflow sync --pull # Pull patterns from registry\n * workflow sync --solutions # Include solution patterns\n * workflow sync --learn # Include learning patterns (default)\n * workflow sync --scopes # Sync custom scope packages\n * workflow sync --all # Sync everything\n * workflow sync --dry-run # Preview without syncing\n */\n\nimport * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport {\n PatternStore,\n PatternAnonymizer,\n ContributorManager,\n type FixPattern,\n type Blueprint,\n type SolutionPattern,\n} from \"@hawkinside_out/workflow-improvement-tracker\";\nimport {\n RegistryClient,\n RateLimitedException,\n RegistryError,\n} from \"../../sync/registry-client.js\";\n\nexport interface UnifiedSyncOptions {\n push?: boolean;\n pull?: boolean;\n solutions?: boolean;\n learn?: boolean;\n scopes?: boolean;\n all?: boolean;\n dryRun?: boolean;\n enableSync?: boolean;\n disableSync?: boolean;\n includePrivate?: boolean;\n}\n\nfunction getWorkspacePath(): string {\n return process.cwd();\n}\n\n/**\n * Unified sync command that orchestrates all sync operations\n */\nexport async function syncCommand(options: UnifiedSyncOptions): Promise<void> {\n const cwd = getWorkspacePath();\n const contributorManager = new ContributorManager(cwd);\n\n p.intro(chalk.bgBlue(\" workflow sync \"));\n\n // Handle --enable-sync option\n if (options.enableSync) {\n const enableResult = await contributorManager.enableSync();\n if (enableResult.success) {\n console.log(chalk.green(\"\\n✅ Sync enabled!\"));\n console.log(chalk.dim(\" Your anonymized patterns can now be shared with the community.\\n\"));\n } else {\n console.log(chalk.red(`\\n❌ Failed to enable sync: ${enableResult.error}\\n`));\n process.exit(1);\n }\n // If only --enable-sync was passed, exit after enabling\n if (!options.push && !options.pull && !options.all && !options.solutions && !options.scopes) {\n p.outro(chalk.green(\"Sync enabled\"));\n return;\n }\n }\n\n // Handle --disable-sync option\n if (options.disableSync) {\n const disableResult = await contributorManager.disableSync();\n if (disableResult.success) {\n console.log(chalk.green(\"\\n✅ Sync disabled!\"));\n console.log(chalk.dim(\" Your patterns will no longer be shared.\\n\"));\n } else {\n console.log(chalk.red(`\\n❌ Failed to disable sync: ${disableResult.error}\\n`));\n process.exit(1);\n }\n p.outro(chalk.green(\"Sync disabled\"));\n return;\n }\n\n // Check if sync is enabled\n const config = await contributorManager.getConfig();\n if (!config.success || !config.data?.syncOptIn) {\n console.log(chalk.yellow(\"\\n⚠️ Sync is not enabled.\\n\"));\n console.log(chalk.dim(\" To enable sync, run:\"));\n console.log(chalk.dim(\" workflow learn config --enable-sync\\n\"));\n console.log(\n chalk.dim(\n \" This allows you to share anonymized patterns with the community.\",\n ),\n );\n p.outro(chalk.yellow(\"Sync not enabled\"));\n process.exit(0);\n }\n\n // Determine what to sync\n const syncLearn = options.learn || options.all || (!options.solutions && !options.scopes);\n const syncSolutions = options.solutions || options.all;\n const syncScopes = options.scopes || options.all;\n\n // Determine direction\n let direction: \"push\" | \"pull\" | \"both\" = \"both\";\n if (options.push && !options.pull) {\n direction = \"push\";\n } else if (options.pull && !options.push) {\n direction = \"pull\";\n } else if (!options.push && !options.pull) {\n // Interactive mode - ask user\n const choice = await p.select({\n message: \"Sync direction:\",\n options: [\n { value: \"push\", label: \"📤 Push - Upload local patterns to registry\" },\n { value: \"pull\", label: \"📥 Pull - Download patterns from registry\" },\n { value: \"both\", label: \"🔄 Both - Push then pull\" },\n ],\n });\n\n if (p.isCancel(choice)) {\n p.cancel(\"Sync cancelled\");\n process.exit(0);\n }\n direction = choice as \"push\" | \"pull\" | \"both\";\n }\n\n if (options.dryRun) {\n console.log(chalk.yellow(\"\\n📋 DRY-RUN MODE: No changes will be synced\\n\"));\n }\n\n // Show what will be synced\n console.log(chalk.cyan(\"\\n📦 Syncing:\"));\n if (syncLearn) console.log(chalk.dim(\" • Learning patterns (fixes, blueprints)\"));\n if (syncSolutions) console.log(chalk.dim(\" • Solution patterns\"));\n if (syncScopes) console.log(chalk.dim(\" • Custom scopes\"));\n console.log(chalk.dim(` • Direction: ${direction === \"both\" ? \"push + pull\" : direction}`));\n if (options.includePrivate) console.log(chalk.dim(\" • Including private patterns\"));\n console.log(\"\");\n\n const store = new PatternStore(cwd);\n await store.initialize();\n const anonymizer = new PatternAnonymizer();\n\n // Get patterns to sync\n // If --include-private is set, get all patterns; otherwise filter to public only\n const syncData = await store.getPatternsForSync();\n let fixes = syncData.fixes ?? [];\n let blueprints = syncData.blueprints ?? [];\n let solutions = syncData.solutions ?? [];\n\n // Get stats for all patterns to show why some might be excluded\n const stats = await store.getStats();\n const totalLocalFixes = stats.totalFixes;\n const totalLocalBlueprints = stats.totalBlueprints;\n const totalLocalSolutions = stats.totalSolutions;\n const privateFixes = stats.privateFixes;\n const privateBlueprints = stats.privateBlueprints;\n const privateSolutions = stats.privateSolutions;\n\n // If --include-private, we need to get all patterns including private ones\n if (options.includePrivate) {\n const allFixes = await store.listFixPatterns({ includeDeprecated: false });\n const allBlueprints = await store.listBlueprints({ includeDeprecated: false });\n const allSolutions = await store.listSolutions({ includeDeprecated: false });\n fixes = allFixes.data ?? [];\n blueprints = allBlueprints.data ?? [];\n solutions = allSolutions.data ?? [];\n }\n\n // Filter based on options\n const patternsToSync: Array<{\n pattern: FixPattern | Blueprint | SolutionPattern;\n type: \"fix\" | \"blueprint\" | \"solution\";\n originalId: string;\n }> = [];\n\n if (syncLearn) {\n const publicCount = fixes.length;\n const privateCount = privateFixes;\n \n if (options.includePrivate) {\n console.log(chalk.dim(` Found ${publicCount} fixes, ${blueprints.length} blueprints to sync (including private)`));\n } else if (publicCount === 0 && privateCount > 0) {\n console.log(chalk.yellow(` Found 0 fixes ready to sync (${privateCount} are private)`));\n console.log(chalk.dim(` Use --include-private to include them, or run 'workflow learn migrate --public'`));\n } else {\n console.log(chalk.dim(` Found ${publicCount} fixes, ${blueprints.length} blueprints ready to sync`));\n }\n\n for (const fix of fixes) {\n const result = anonymizer.anonymizeFixPattern(fix);\n if (result.success && result.data) {\n patternsToSync.push({\n pattern: result.data,\n type: \"fix\",\n originalId: fix.id,\n });\n }\n }\n\n for (const bp of blueprints) {\n const result = anonymizer.anonymizeBlueprint(bp);\n if (result.success && result.data) {\n patternsToSync.push({\n pattern: result.data,\n type: \"blueprint\",\n originalId: bp.id,\n });\n }\n }\n }\n\n if (syncSolutions) {\n const publicCount = solutions.length;\n const privateCount = privateSolutions;\n \n if (options.includePrivate) {\n console.log(chalk.dim(` Found ${publicCount} solutions to sync (including private)`));\n } else if (publicCount === 0 && privateCount > 0 && !options.dryRun) {\n console.log(chalk.yellow(` Found 0 solutions ready to sync (${privateCount} are private)`));\n \n // Prompt user to migrate solutions to public\n const shouldMigrate = await p.confirm({\n message: `Would you like to make your ${privateCount} solution(s) public for sync?`,\n });\n \n if (p.isCancel(shouldMigrate) || !shouldMigrate) {\n console.log(chalk.dim(` Skipping private solutions. Use --include-private to force include them.`));\n } else {\n // Migrate all private solutions to public\n const allSolutions = await store.listSolutions({ includeDeprecated: false });\n for (const sol of allSolutions.data ?? []) {\n if (sol.isPrivate) {\n const updated = { ...sol, isPrivate: false, updatedAt: new Date().toISOString() };\n await store.saveSolution(updated);\n solutions.push(updated);\n }\n }\n console.log(chalk.green(` ✓ Migrated ${privateCount} solutions to public`));\n }\n } else if (publicCount === 0 && privateCount > 0) {\n // Dry run mode - just show the message\n console.log(chalk.yellow(` Found 0 solutions ready to sync (${privateCount} are private)`));\n console.log(chalk.dim(` Use --include-private to include them, or run 'workflow solution migrate --public'`));\n } else if (publicCount === 0 && privateCount === 0) {\n // No solutions at all - check for validation errors\n const validationErrors = store.getValidationErrors();\n const solutionErrors = validationErrors.filter((e) => e.type === \"solution\");\n if (solutionErrors.length > 0) {\n console.log(chalk.yellow(` Found 0 solutions (${solutionErrors.length} failed schema validation)`));\n for (const err of solutionErrors) {\n console.log(chalk.dim(` • ${err.file}: ${err.error}`));\n if (err.details) {\n for (const detail of err.details.slice(0, 3)) {\n console.log(chalk.dim(` - ${detail}`));\n }\n if (err.details.length > 3) {\n console.log(chalk.dim(` ... and ${err.details.length - 3} more issues`));\n }\n }\n }\n } else {\n console.log(chalk.dim(` Found 0 solutions to sync`));\n }\n } else {\n console.log(chalk.dim(` Found ${publicCount} solutions ready to sync`));\n }\n\n for (const solution of solutions) {\n const result = anonymizer.anonymizeSolution(solution);\n if (result.success && result.data) {\n patternsToSync.push({\n pattern: result.data,\n type: \"solution\",\n originalId: solution.id,\n });\n }\n }\n }\n\n if (syncScopes) {\n // TODO: Implement scope sync when scope registry is available\n console.log(chalk.dim(\" Scope sync: Coming soon\"));\n }\n\n // PUSH operation\n if (direction === \"push\" || direction === \"both\") {\n console.log(chalk.cyan(\"\\n📤 Pushing patterns...\\n\"));\n\n if (patternsToSync.length === 0) {\n console.log(chalk.yellow(\" No patterns to push\\n\"));\n } else {\n const fixCount = patternsToSync.filter((p) => p.type === \"fix\").length;\n const bpCount = patternsToSync.filter((p) => p.type === \"blueprint\").length;\n const solutionCount = patternsToSync.filter((p) => p.type === \"solution\").length;\n\n console.log(\n chalk.dim(\n ` Ready to push: ${fixCount} fixes, ${bpCount} blueprints, ${solutionCount} solutions`,\n ),\n );\n\n if (options.dryRun) {\n console.log(chalk.yellow(\"\\n [DRY-RUN] Would push patterns to registry\"));\n } else {\n // Get contributor ID\n const contributorResult = await contributorManager.getOrCreateId();\n if (!contributorResult.success || !contributorResult.data) {\n console.log(chalk.red(\"\\n ❌ Failed to get contributor ID\"));\n process.exit(1);\n }\n\n // Push to registry\n const registryClient = new RegistryClient();\n\n try {\n console.log(chalk.dim(\"\\n Connecting to registry...\"));\n\n const pushResult = await registryClient.push(\n patternsToSync.map((p) => ({\n pattern: p.pattern,\n type: p.type,\n })),\n contributorResult.data,\n );\n\n // Mark pushed patterns as synced\n if (pushResult.pushed > 0) {\n const pushedFixIds = patternsToSync\n .filter((p) => p.type === \"fix\")\n .map((p) => p.originalId);\n const pushedBpIds = patternsToSync\n .filter((p) => p.type === \"blueprint\")\n .map((p) => p.originalId);\n const pushedSolutionIds = patternsToSync\n .filter((p) => p.type === \"solution\")\n .map((p) => p.originalId);\n\n if (pushedFixIds.length > 0) {\n await store.markAsSynced(pushedFixIds, \"fix\");\n }\n if (pushedBpIds.length > 0) {\n await store.markAsSynced(pushedBpIds, \"blueprint\");\n }\n if (pushedSolutionIds.length > 0) {\n await store.markAsSynced(pushedSolutionIds, \"solution\");\n }\n }\n\n console.log(\n chalk.green(`\\n ✅ Pushed ${pushResult.pushed} patterns to registry`),\n );\n\n if (pushResult.skipped > 0) {\n console.log(\n chalk.dim(` (${pushResult.skipped} already existed)`),\n );\n }\n\n if (pushResult.errors && pushResult.errors.length > 0) {\n console.log(chalk.yellow(`\\n ⚠️ Some patterns had errors:`));\n for (const err of pushResult.errors) {\n console.log(chalk.dim(` - ${err}`));\n }\n }\n\n console.log(\n chalk.dim(\n `\\n Rate limit: ${pushResult.rateLimit.remaining} patterns remaining this hour`,\n ),\n );\n } catch (error) {\n if (error instanceof RateLimitedException) {\n console.log(chalk.red(\"\\n ❌ Rate limit exceeded\"));\n console.log(\n chalk.dim(\n ` Try again in ${error.getTimeUntilReset()}`,\n ),\n );\n } else if (error instanceof RegistryError) {\n console.log(chalk.red(`\\n ❌ Registry error: ${error.message}`));\n } else {\n console.log(\n chalk.red(\n `\\n ❌ Failed to push: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n }\n process.exit(1);\n }\n }\n }\n }\n\n // PULL operation\n if (direction === \"pull\" || direction === \"both\") {\n console.log(chalk.cyan(\"\\n📥 Pulling patterns from registry...\\n\"));\n\n if (options.dryRun) {\n console.log(chalk.yellow(\" [DRY-RUN] Would pull patterns from registry\"));\n } else {\n const registryClient = new RegistryClient();\n\n try {\n console.log(chalk.dim(\" Connecting to registry...\"));\n\n // Pull patterns based on sync options - need to call separately for each type\n const pullTypes: (\"fix\" | \"blueprint\" | \"solution\")[] = [];\n if (syncLearn) {\n pullTypes.push(\"fix\", \"blueprint\");\n }\n if (syncSolutions) {\n pullTypes.push(\"solution\");\n }\n\n let totalPatterns = 0;\n let savedCount = 0;\n const typeCounts: Record<string, number> = {};\n\n for (const pullType of pullTypes) {\n const pullResult = await registryClient.pull({\n type: pullType,\n });\n\n typeCounts[pullType] = pullResult.patterns.length;\n totalPatterns += pullResult.patterns.length;\n\n for (const pulled of pullResult.patterns) {\n try {\n if (pulled.type === \"fix\" && pulled.data) {\n const fixData = pulled.data as FixPattern;\n await store.saveFixPattern(fixData);\n console.log(chalk.dim(` ✓ ${fixData.name} (fix)`));\n savedCount++;\n } else if (pulled.type === \"blueprint\" && pulled.data) {\n const blueprintData = pulled.data as Blueprint;\n await store.saveBlueprint(blueprintData);\n console.log(chalk.dim(` ✓ ${blueprintData.name} (blueprint)`));\n savedCount++;\n } else if (pulled.type === \"solution\" && pulled.data) {\n const solutionData = pulled.data as SolutionPattern;\n await store.saveSolution(solutionData);\n console.log(chalk.dim(` ✓ ${solutionData.name} (solution)`));\n savedCount++;\n }\n } catch {\n // Pattern might already exist - silently skip\n }\n }\n }\n\n // Show registry stats\n if (syncSolutions && typeCounts[\"solution\"] !== undefined) {\n console.log(chalk.dim(` Registry has ${typeCounts[\"solution\"]} solution(s) available`));\n }\n if (syncLearn) {\n const fixCount = typeCounts[\"fix\"] ?? 0;\n const bpCount = typeCounts[\"blueprint\"] ?? 0;\n console.log(chalk.dim(` Registry has ${fixCount} fix(es), ${bpCount} blueprint(s) available`));\n }\n\n if (totalPatterns === 0) {\n console.log(chalk.dim(\" No new patterns to pull\"));\n } else {\n console.log(\n chalk.green(`\\n ✅ Pulled ${savedCount} new patterns from registry`),\n );\n if (savedCount < totalPatterns) {\n console.log(chalk.dim(` (${totalPatterns - savedCount} already existed locally)`));\n }\n }\n } catch (error) {\n if (error instanceof RateLimitedException) {\n console.log(chalk.red(\"\\n ❌ Rate limit exceeded\"));\n console.log(\n chalk.dim(\n ` Try again in ${error.getTimeUntilReset()}`,\n ),\n );\n } else if (error instanceof RegistryError) {\n console.log(chalk.red(`\\n ❌ Registry error: ${error.message}`));\n } else {\n console.log(\n chalk.red(\n `\\n ❌ Failed to pull: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n }\n process.exit(1);\n }\n }\n }\n\n p.outro(chalk.green(\"Sync complete!\"));\n}\n","/**\n * Registry Client for pattern sync\n *\n * HTTP client for pushing patterns to and pulling patterns from\n * the community pattern registry.\n */\n\nimport type { FixPattern, Blueprint, SolutionPattern } from \"@hawkinside_out/workflow-improvement-tracker\";\n\n// Default registry URL\nconst DEFAULT_REGISTRY_URL = \"https://registry-api-rust.vercel.app\";\n\n/**\n * Pattern payload for push/pull operations\n */\nexport interface RegistryPattern {\n id: string;\n type: \"fix\" | \"blueprint\" | \"solution\";\n data: Record<string, unknown>;\n hash?: string;\n createdAt?: string;\n}\n\n/**\n * Push response from registry\n */\nexport interface PushResponse {\n status: \"ok\" | \"error\";\n pushed: number;\n skipped: number;\n errors?: string[];\n rateLimit: {\n remaining: number;\n resetAt: string | null;\n };\n}\n\n/**\n * Pull response from registry\n */\nexport interface PullResponse {\n patterns: RegistryPattern[];\n pagination: {\n offset: number;\n limit: number;\n total: number;\n hasMore: boolean;\n };\n}\n\n/**\n * Rate limit error details\n */\nexport interface RateLimitError {\n message: string;\n resetAt: string | null;\n remaining: number;\n}\n\n/**\n * Registry client options\n */\nexport interface RegistryClientOptions {\n /**\n * Base URL of the registry API\n * Defaults to https://patterns.workflow-agent.dev\n * Can be overridden via WORKFLOW_REGISTRY_URL env var\n */\n baseUrl?: string;\n\n /**\n * Request timeout in milliseconds\n * Defaults to 30000 (30 seconds)\n */\n timeout?: number;\n\n /**\n * Number of retry attempts for failed requests\n * Defaults to 3\n */\n retries?: number;\n}\n\n/**\n * Registry Client\n *\n * Handles HTTP communication with the pattern registry API\n */\nexport class RegistryClient {\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly retries: number;\n\n constructor(options: RegistryClientOptions = {}) {\n // Priority: options > env var > default\n this.baseUrl =\n options.baseUrl ||\n process.env.WORKFLOW_REGISTRY_URL ||\n DEFAULT_REGISTRY_URL;\n\n // Ensure no trailing slash\n this.baseUrl = this.baseUrl.replace(/\\/$/, \"\");\n\n this.timeout = options.timeout ?? 30000;\n this.retries = options.retries ?? 3;\n }\n\n /**\n * Push patterns to the registry\n *\n * @param patterns - Array of anonymized patterns to push\n * @param contributorId - Anonymous contributor ID\n * @returns Push result with count of pushed/skipped patterns\n * @throws Error if rate limited or push fails\n */\n async push(\n patterns: Array<{\n pattern: FixPattern | Blueprint | SolutionPattern;\n type: \"fix\" | \"blueprint\" | \"solution\";\n hash?: string;\n }>,\n contributorId: string,\n ): Promise<PushResponse> {\n const payload = {\n patterns: patterns.map((p) => ({\n id: p.pattern.id,\n type: p.type,\n data: p.pattern as unknown as Record<string, unknown>,\n hash: p.hash,\n })),\n };\n\n const response = await this.request<PushResponse>(\n \"/api/patterns/push\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-contributor-id\": contributorId,\n },\n body: JSON.stringify(payload),\n },\n );\n\n return response;\n }\n\n /**\n * Pull patterns from the registry\n *\n * @param options - Pull options\n * @returns Array of patterns from the registry\n */\n async pull(options: {\n type?: \"fix\" | \"blueprint\" | \"solution\";\n limit?: number;\n offset?: number;\n since?: string;\n } = {}): Promise<PullResponse> {\n const params = new URLSearchParams();\n\n if (options.type) {\n params.set(\"type\", options.type);\n }\n if (options.limit) {\n params.set(\"limit\", options.limit.toString());\n }\n if (options.offset) {\n params.set(\"offset\", options.offset.toString());\n }\n if (options.since) {\n params.set(\"since\", options.since);\n }\n\n const queryString = params.toString();\n const url = `/api/patterns/pull${queryString ? `?${queryString}` : \"\"}`;\n\n return this.request<PullResponse>(url, {\n method: \"GET\",\n });\n }\n\n /**\n * Get a single pattern by ID\n *\n * @param patternId - UUID of the pattern\n * @returns Pattern data or null if not found\n */\n async getPattern(patternId: string): Promise<RegistryPattern | null> {\n try {\n return await this.request<RegistryPattern>(`/api/patterns/${patternId}`, {\n method: \"GET\",\n });\n } catch (error) {\n if (error instanceof RegistryError && error.statusCode === 404) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Check if the registry is available\n */\n async healthCheck(): Promise<boolean> {\n try {\n await this.request<{ status: string }>(\"/api/health\", {\n method: \"GET\",\n });\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Make an HTTP request to the registry\n */\n private async request<T>(\n path: string,\n options: RequestInit,\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= this.retries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 429) {\n // Rate limited\n const body = await response.json() as { message?: string; resetAt?: string | null; remaining?: number };\n throw new RateLimitedException(\n body.message || \"Rate limit exceeded\",\n body.resetAt ?? null,\n body.remaining ?? 0,\n );\n }\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({})) as { error?: string };\n throw new RegistryError(\n body.error || `Request failed with status ${response.status}`,\n response.status,\n body,\n );\n }\n\n return await response.json() as T;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Don't retry rate limit errors\n if (error instanceof RateLimitedException) {\n throw error;\n }\n\n // Don't retry on 4xx errors (except timeout)\n if (\n error instanceof RegistryError &&\n error.statusCode >= 400 &&\n error.statusCode < 500\n ) {\n throw error;\n }\n\n // Wait before retrying (exponential backoff)\n if (attempt < this.retries) {\n await new Promise((resolve) =>\n setTimeout(resolve, Math.pow(2, attempt) * 1000)\n );\n }\n }\n }\n\n throw lastError ?? new Error(\"Request failed after retries\");\n }\n}\n\n/**\n * Registry API error\n */\nexport class RegistryError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly body?: unknown,\n ) {\n super(message);\n this.name = \"RegistryError\";\n }\n}\n\n/**\n * Rate limit exceeded error\n */\nexport class RateLimitedException extends Error {\n constructor(\n message: string,\n public readonly resetAt: string | null,\n public readonly remaining: number,\n ) {\n super(message);\n this.name = \"RateLimitedException\";\n }\n\n /**\n * Get human-readable time until rate limit resets\n */\n getTimeUntilReset(): string {\n if (!this.resetAt) {\n return \"unknown\";\n }\n\n const resetTime = new Date(this.resetAt).getTime();\n const now = Date.now();\n const diffMs = resetTime - now;\n\n if (diffMs <= 0) {\n return \"now\";\n }\n\n const minutes = Math.ceil(diffMs / 60000);\n if (minutes < 60) {\n return `${minutes} minute${minutes === 1 ? \"\" : \"s\"}`;\n }\n\n const hours = Math.ceil(minutes / 60);\n return `${hours} hour${hours === 1 ? \"\" : \"s\"}`;\n }\n}\n"],"mappings":";AAiBA,YAAY,OAAO;AACnB,OAAO,WAAW;AAClB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;;;AChBP,IAAM,uBAAuB;AA8EtB,IAAM,iBAAN,MAAqB;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,UAAiC,CAAC,GAAG;AAE/C,SAAK,UACH,QAAQ,WACR,QAAQ,IAAI,yBACZ;AAGF,SAAK,UAAU,KAAK,QAAQ,QAAQ,OAAO,EAAE;AAE7C,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,UAAU,QAAQ,WAAW;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,KACJ,UAKA,eACuB;AACvB,UAAM,UAAU;AAAA,MACd,UAAU,SAAS,IAAI,CAACA,QAAO;AAAA,QAC7B,IAAIA,GAAE,QAAQ;AAAA,QACd,MAAMA,GAAE;AAAA,QACR,MAAMA,GAAE;AAAA,QACR,MAAMA,GAAE;AAAA,MACV,EAAE;AAAA,IACJ;AAEA,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,oBAAoB;AAAA,QACtB;AAAA,QACA,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK,UAKP,CAAC,GAA0B;AAC7B,UAAM,SAAS,IAAI,gBAAgB;AAEnC,QAAI,QAAQ,MAAM;AAChB,aAAO,IAAI,QAAQ,QAAQ,IAAI;AAAA,IACjC;AACA,QAAI,QAAQ,OAAO;AACjB,aAAO,IAAI,SAAS,QAAQ,MAAM,SAAS,CAAC;AAAA,IAC9C;AACA,QAAI,QAAQ,QAAQ;AAClB,aAAO,IAAI,UAAU,QAAQ,OAAO,SAAS,CAAC;AAAA,IAChD;AACA,QAAI,QAAQ,OAAO;AACjB,aAAO,IAAI,SAAS,QAAQ,KAAK;AAAA,IACnC;AAEA,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,MAAM,qBAAqB,cAAc,IAAI,WAAW,KAAK,EAAE;AAErE,WAAO,KAAK,QAAsB,KAAK;AAAA,MACrC,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW,WAAoD;AACnE,QAAI;AACF,aAAO,MAAM,KAAK,QAAyB,iBAAiB,SAAS,IAAI;AAAA,QACvE,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,iBAAiB,iBAAiB,MAAM,eAAe,KAAK;AAC9D,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAgC;AACpC,QAAI;AACF,YAAM,KAAK,QAA4B,eAAe;AAAA,QACpD,QAAQ;AAAA,MACV,CAAC;AACD,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,QACZ,MACA,SACY;AACZ,UAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI;AAClC,QAAI,YAA0B;AAE9B,aAAS,UAAU,GAAG,WAAW,KAAK,SAAS,WAAW;AACxD,UAAI;AACF,cAAM,aAAa,IAAI,gBAAgB;AACvC,cAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,OAAO;AAEnE,cAAM,WAAW,MAAM,MAAM,KAAK;AAAA,UAChC,GAAG;AAAA,UACH,QAAQ,WAAW;AAAA,QACrB,CAAC;AAED,qBAAa,SAAS;AAEtB,YAAI,SAAS,WAAW,KAAK;AAE3B,gBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,gBAAM,IAAI;AAAA,YACR,KAAK,WAAW;AAAA,YAChB,KAAK,WAAW;AAAA,YAChB,KAAK,aAAa;AAAA,UACpB;AAAA,QACF;AAEA,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACnD,gBAAM,IAAI;AAAA,YACR,KAAK,SAAS,8BAA8B,SAAS,MAAM;AAAA,YAC3D,SAAS;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAEA,eAAO,MAAM,SAAS,KAAK;AAAA,MAC7B,SAAS,OAAO;AACd,oBAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAGpE,YAAI,iBAAiB,sBAAsB;AACzC,gBAAM;AAAA,QACR;AAGA,YACE,iBAAiB,iBACjB,MAAM,cAAc,OACpB,MAAM,aAAa,KACnB;AACA,gBAAM;AAAA,QACR;AAGA,YAAI,UAAU,KAAK,SAAS;AAC1B,gBAAM,IAAI;AAAA,YAAQ,CAAC,YACjB,WAAW,SAAS,KAAK,IAAI,GAAG,OAAO,IAAI,GAAI;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAa,IAAI,MAAM,8BAA8B;AAAA,EAC7D;AACF;AAKO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACvC,YACE,SACgB,YACA,MAChB;AACA,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,uBAAN,cAAmC,MAAM;AAAA,EAC9C,YACE,SACgB,SACA,WAChB;AACA,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,oBAA4B;AAC1B,QAAI,CAAC,KAAK,SAAS;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,IAAI,KAAK,KAAK,OAAO,EAAE,QAAQ;AACjD,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,SAAS,YAAY;AAE3B,QAAI,UAAU,GAAG;AACf,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,KAAK,KAAK,SAAS,GAAK;AACxC,QAAI,UAAU,IAAI;AAChB,aAAO,GAAG,OAAO,UAAU,YAAY,IAAI,KAAK,GAAG;AAAA,IACrD;AAEA,UAAM,QAAQ,KAAK,KAAK,UAAU,EAAE;AACpC,WAAO,GAAG,KAAK,QAAQ,UAAU,IAAI,KAAK,GAAG;AAAA,EAC/C;AACF;;;ADpSA,SAAS,mBAA2B;AAClC,SAAO,QAAQ,IAAI;AACrB;AAKA,eAAsB,YAAY,SAA4C;AAC5E,QAAM,MAAM,iBAAiB;AAC7B,QAAM,qBAAqB,IAAI,mBAAmB,GAAG;AAErD,EAAE,QAAM,MAAM,OAAO,iBAAiB,CAAC;AAGvC,MAAI,QAAQ,YAAY;AACtB,UAAM,eAAe,MAAM,mBAAmB,WAAW;AACzD,QAAI,aAAa,SAAS;AACxB,cAAQ,IAAI,MAAM,MAAM,wBAAmB,CAAC;AAC5C,cAAQ,IAAI,MAAM,IAAI,oEAAoE,CAAC;AAAA,IAC7F,OAAO;AACL,cAAQ,IAAI,MAAM,IAAI;AAAA,gCAA8B,aAAa,KAAK;AAAA,CAAI,CAAC;AAC3E,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,CAAC,QAAQ,QAAQ,CAAC,QAAQ,QAAQ,CAAC,QAAQ,OAAO,CAAC,QAAQ,aAAa,CAAC,QAAQ,QAAQ;AAC3F,MAAE,QAAM,MAAM,MAAM,cAAc,CAAC;AACnC;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,aAAa;AACvB,UAAM,gBAAgB,MAAM,mBAAmB,YAAY;AAC3D,QAAI,cAAc,SAAS;AACzB,cAAQ,IAAI,MAAM,MAAM,yBAAoB,CAAC;AAC7C,cAAQ,IAAI,MAAM,IAAI,6CAA6C,CAAC;AAAA,IACtE,OAAO;AACL,cAAQ,IAAI,MAAM,IAAI;AAAA,iCAA+B,cAAc,KAAK;AAAA,CAAI,CAAC;AAC7E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,IAAE,QAAM,MAAM,MAAM,eAAe,CAAC;AACpC;AAAA,EACF;AAGA,QAAM,SAAS,MAAM,mBAAmB,UAAU;AAClD,MAAI,CAAC,OAAO,WAAW,CAAC,OAAO,MAAM,WAAW;AAC9C,YAAQ,IAAI,MAAM,OAAO,uCAA6B,CAAC;AACvD,YAAQ,IAAI,MAAM,IAAI,wBAAwB,CAAC;AAC/C,YAAQ,IAAI,MAAM,IAAI,2CAA2C,CAAC;AAClE,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AACA,IAAE,QAAM,MAAM,OAAO,kBAAkB,CAAC;AACxC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,YAAY,QAAQ,SAAS,QAAQ,OAAQ,CAAC,QAAQ,aAAa,CAAC,QAAQ;AAClF,QAAM,gBAAgB,QAAQ,aAAa,QAAQ;AACnD,QAAM,aAAa,QAAQ,UAAU,QAAQ;AAG7C,MAAI,YAAsC;AAC1C,MAAI,QAAQ,QAAQ,CAAC,QAAQ,MAAM;AACjC,gBAAY;AAAA,EACd,WAAW,QAAQ,QAAQ,CAAC,QAAQ,MAAM;AACxC,gBAAY;AAAA,EACd,WAAW,CAAC,QAAQ,QAAQ,CAAC,QAAQ,MAAM;AAEzC,UAAM,SAAS,MAAQ,SAAO;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,OAAO,QAAQ,OAAO,qDAA8C;AAAA,QACtE,EAAE,OAAO,QAAQ,OAAO,mDAA4C;AAAA,QACpE,EAAE,OAAO,QAAQ,OAAO,kCAA2B;AAAA,MACrD;AAAA,IACF,CAAC;AAED,QAAM,WAAS,MAAM,GAAG;AACtB,MAAE,SAAO,gBAAgB;AACzB,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,gBAAY;AAAA,EACd;AAEA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,MAAM,OAAO,uDAAgD,CAAC;AAAA,EAC5E;AAGA,UAAQ,IAAI,MAAM,KAAK,sBAAe,CAAC;AACvC,MAAI,UAAW,SAAQ,IAAI,MAAM,IAAI,gDAA2C,CAAC;AACjF,MAAI,cAAe,SAAQ,IAAI,MAAM,IAAI,4BAAuB,CAAC;AACjE,MAAI,WAAY,SAAQ,IAAI,MAAM,IAAI,wBAAmB,CAAC;AAC1D,UAAQ,IAAI,MAAM,IAAI,uBAAkB,cAAc,SAAS,gBAAgB,SAAS,EAAE,CAAC;AAC3F,MAAI,QAAQ,eAAgB,SAAQ,IAAI,MAAM,IAAI,qCAAgC,CAAC;AACnF,UAAQ,IAAI,EAAE;AAEd,QAAM,QAAQ,IAAI,aAAa,GAAG;AAClC,QAAM,MAAM,WAAW;AACvB,QAAM,aAAa,IAAI,kBAAkB;AAIzC,QAAM,WAAW,MAAM,MAAM,mBAAmB;AAChD,MAAI,QAAQ,SAAS,SAAS,CAAC;AAC/B,MAAI,aAAa,SAAS,cAAc,CAAC;AACzC,MAAI,YAAY,SAAS,aAAa,CAAC;AAGvC,QAAM,QAAQ,MAAM,MAAM,SAAS;AACnC,QAAM,kBAAkB,MAAM;AAC9B,QAAM,uBAAuB,MAAM;AACnC,QAAM,sBAAsB,MAAM;AAClC,QAAM,eAAe,MAAM;AAC3B,QAAM,oBAAoB,MAAM;AAChC,QAAM,mBAAmB,MAAM;AAG/B,MAAI,QAAQ,gBAAgB;AAC1B,UAAM,WAAW,MAAM,MAAM,gBAAgB,EAAE,mBAAmB,MAAM,CAAC;AACzE,UAAM,gBAAgB,MAAM,MAAM,eAAe,EAAE,mBAAmB,MAAM,CAAC;AAC7E,UAAM,eAAe,MAAM,MAAM,cAAc,EAAE,mBAAmB,MAAM,CAAC;AAC3E,YAAQ,SAAS,QAAQ,CAAC;AAC1B,iBAAa,cAAc,QAAQ,CAAC;AACpC,gBAAY,aAAa,QAAQ,CAAC;AAAA,EACpC;AAGA,QAAM,iBAID,CAAC;AAEN,MAAI,WAAW;AACb,UAAM,cAAc,MAAM;AAC1B,UAAM,eAAe;AAErB,QAAI,QAAQ,gBAAgB;AAC1B,cAAQ,IAAI,MAAM,IAAI,WAAW,WAAW,WAAW,WAAW,MAAM,yCAAyC,CAAC;AAAA,IACpH,WAAW,gBAAgB,KAAK,eAAe,GAAG;AAChD,cAAQ,IAAI,MAAM,OAAO,kCAAkC,YAAY,eAAe,CAAC;AACvF,cAAQ,IAAI,MAAM,IAAI,qFAAqF,CAAC;AAAA,IAC9G,OAAO;AACL,cAAQ,IAAI,MAAM,IAAI,WAAW,WAAW,WAAW,WAAW,MAAM,2BAA2B,CAAC;AAAA,IACtG;AAEA,eAAW,OAAO,OAAO;AACvB,YAAM,SAAS,WAAW,oBAAoB,GAAG;AACjD,UAAI,OAAO,WAAW,OAAO,MAAM;AACjC,uBAAe,KAAK;AAAA,UAClB,SAAS,OAAO;AAAA,UAChB,MAAM;AAAA,UACN,YAAY,IAAI;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,eAAW,MAAM,YAAY;AAC3B,YAAM,SAAS,WAAW,mBAAmB,EAAE;AAC/C,UAAI,OAAO,WAAW,OAAO,MAAM;AACjC,uBAAe,KAAK;AAAA,UAClB,SAAS,OAAO;AAAA,UAChB,MAAM;AAAA,UACN,YAAY,GAAG;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,eAAe;AACjB,UAAM,cAAc,UAAU;AAC9B,UAAM,eAAe;AAErB,QAAI,QAAQ,gBAAgB;AAC1B,cAAQ,IAAI,MAAM,IAAI,WAAW,WAAW,wCAAwC,CAAC;AAAA,IACvF,WAAW,gBAAgB,KAAK,eAAe,KAAK,CAAC,QAAQ,QAAQ;AACnE,cAAQ,IAAI,MAAM,OAAO,sCAAsC,YAAY,eAAe,CAAC;AAG3F,YAAM,gBAAgB,MAAQ,UAAQ;AAAA,QACpC,SAAS,+BAA+B,YAAY;AAAA,MACtD,CAAC;AAED,UAAM,WAAS,aAAa,KAAK,CAAC,eAAe;AAC/C,gBAAQ,IAAI,MAAM,IAAI,8EAA8E,CAAC;AAAA,MACvG,OAAO;AAEL,cAAM,eAAe,MAAM,MAAM,cAAc,EAAE,mBAAmB,MAAM,CAAC;AAC3E,mBAAW,OAAO,aAAa,QAAQ,CAAC,GAAG;AACzC,cAAI,IAAI,WAAW;AACjB,kBAAM,UAAU,EAAE,GAAG,KAAK,WAAW,OAAO,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE;AAChF,kBAAM,MAAM,aAAa,OAAO;AAChC,sBAAU,KAAK,OAAO;AAAA,UACxB;AAAA,QACF;AACA,gBAAQ,IAAI,MAAM,MAAM,qBAAgB,YAAY,sBAAsB,CAAC;AAAA,MAC7E;AAAA,IACF,WAAW,gBAAgB,KAAK,eAAe,GAAG;AAEhD,cAAQ,IAAI,MAAM,OAAO,sCAAsC,YAAY,eAAe,CAAC;AAC3F,cAAQ,IAAI,MAAM,IAAI,wFAAwF,CAAC;AAAA,IACjH,WAAW,gBAAgB,KAAK,iBAAiB,GAAG;AAElD,YAAM,mBAAmB,MAAM,oBAAoB;AACnD,YAAM,iBAAiB,iBAAiB,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU;AAC3E,UAAI,eAAe,SAAS,GAAG;AAC7B,gBAAQ,IAAI,MAAM,OAAO,wBAAwB,eAAe,MAAM,4BAA4B,CAAC;AACnG,mBAAW,OAAO,gBAAgB;AAChC,kBAAQ,IAAI,MAAM,IAAI,cAAS,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;AACxD,cAAI,IAAI,SAAS;AACf,uBAAW,UAAU,IAAI,QAAQ,MAAM,GAAG,CAAC,GAAG;AAC5C,sBAAQ,IAAI,MAAM,IAAI,WAAW,MAAM,EAAE,CAAC;AAAA,YAC5C;AACA,gBAAI,IAAI,QAAQ,SAAS,GAAG;AAC1B,sBAAQ,IAAI,MAAM,IAAI,iBAAiB,IAAI,QAAQ,SAAS,CAAC,cAAc,CAAC;AAAA,YAC9E;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI,MAAM,IAAI,6BAA6B,CAAC;AAAA,MACtD;AAAA,IACF,OAAO;AACL,cAAQ,IAAI,MAAM,IAAI,WAAW,WAAW,0BAA0B,CAAC;AAAA,IACzE;AAEA,eAAW,YAAY,WAAW;AAChC,YAAM,SAAS,WAAW,kBAAkB,QAAQ;AACpD,UAAI,OAAO,WAAW,OAAO,MAAM;AACjC,uBAAe,KAAK;AAAA,UAClB,SAAS,OAAO;AAAA,UAChB,MAAM;AAAA,UACN,YAAY,SAAS;AAAA,QACvB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY;AAEd,YAAQ,IAAI,MAAM,IAAI,2BAA2B,CAAC;AAAA,EACpD;AAGA,MAAI,cAAc,UAAU,cAAc,QAAQ;AAChD,YAAQ,IAAI,MAAM,KAAK,mCAA4B,CAAC;AAEpD,QAAI,eAAe,WAAW,GAAG;AAC/B,cAAQ,IAAI,MAAM,OAAO,yBAAyB,CAAC;AAAA,IACrD,OAAO;AACL,YAAM,WAAW,eAAe,OAAO,CAACC,OAAMA,GAAE,SAAS,KAAK,EAAE;AAChE,YAAM,UAAU,eAAe,OAAO,CAACA,OAAMA,GAAE,SAAS,WAAW,EAAE;AACrE,YAAM,gBAAgB,eAAe,OAAO,CAACA,OAAMA,GAAE,SAAS,UAAU,EAAE;AAE1E,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ,oBAAoB,QAAQ,WAAW,OAAO,gBAAgB,aAAa;AAAA,QAC7E;AAAA,MACF;AAEA,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,IAAI,MAAM,OAAO,+CAA+C,CAAC;AAAA,MAC3E,OAAO;AAEL,cAAM,oBAAoB,MAAM,mBAAmB,cAAc;AACjE,YAAI,CAAC,kBAAkB,WAAW,CAAC,kBAAkB,MAAM;AACzD,kBAAQ,IAAI,MAAM,IAAI,yCAAoC,CAAC;AAC3D,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAGA,cAAM,iBAAiB,IAAI,eAAe;AAE1C,YAAI;AACF,kBAAQ,IAAI,MAAM,IAAI,+BAA+B,CAAC;AAEtD,gBAAM,aAAa,MAAM,eAAe;AAAA,YACtC,eAAe,IAAI,CAACA,QAAO;AAAA,cACzB,SAASA,GAAE;AAAA,cACX,MAAMA,GAAE;AAAA,YACV,EAAE;AAAA,YACF,kBAAkB;AAAA,UACpB;AAGA,cAAI,WAAW,SAAS,GAAG;AACzB,kBAAM,eAAe,eAClB,OAAO,CAACA,OAAMA,GAAE,SAAS,KAAK,EAC9B,IAAI,CAACA,OAAMA,GAAE,UAAU;AAC1B,kBAAM,cAAc,eACjB,OAAO,CAACA,OAAMA,GAAE,SAAS,WAAW,EACpC,IAAI,CAACA,OAAMA,GAAE,UAAU;AAC1B,kBAAM,oBAAoB,eACvB,OAAO,CAACA,OAAMA,GAAE,SAAS,UAAU,EACnC,IAAI,CAACA,OAAMA,GAAE,UAAU;AAE1B,gBAAI,aAAa,SAAS,GAAG;AAC3B,oBAAM,MAAM,aAAa,cAAc,KAAK;AAAA,YAC9C;AACA,gBAAI,YAAY,SAAS,GAAG;AAC1B,oBAAM,MAAM,aAAa,aAAa,WAAW;AAAA,YACnD;AACA,gBAAI,kBAAkB,SAAS,GAAG;AAChC,oBAAM,MAAM,aAAa,mBAAmB,UAAU;AAAA,YACxD;AAAA,UACF;AAEA,kBAAQ;AAAA,YACN,MAAM,MAAM;AAAA,kBAAgB,WAAW,MAAM,uBAAuB;AAAA,UACtE;AAEA,cAAI,WAAW,UAAU,GAAG;AAC1B,oBAAQ;AAAA,cACN,MAAM,IAAI,SAAS,WAAW,OAAO,mBAAmB;AAAA,YAC1D;AAAA,UACF;AAEA,cAAI,WAAW,UAAU,WAAW,OAAO,SAAS,GAAG;AACrD,oBAAQ,IAAI,MAAM,OAAO;AAAA,yCAAkC,CAAC;AAC5D,uBAAW,OAAO,WAAW,QAAQ;AACnC,sBAAQ,IAAI,MAAM,IAAI,UAAU,GAAG,EAAE,CAAC;AAAA,YACxC;AAAA,UACF;AAEA,kBAAQ;AAAA,YACN,MAAM;AAAA,cACJ;AAAA,gBAAmB,WAAW,UAAU,SAAS;AAAA,YACnD;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,cAAI,iBAAiB,sBAAsB;AACzC,oBAAQ,IAAI,MAAM,IAAI,gCAA2B,CAAC;AAClD,oBAAQ;AAAA,cACN,MAAM;AAAA,gBACJ,qBAAqB,MAAM,kBAAkB,CAAC;AAAA,cAChD;AAAA,YACF;AAAA,UACF,WAAW,iBAAiB,eAAe;AACzC,oBAAQ,IAAI,MAAM,IAAI;AAAA,2BAAyB,MAAM,OAAO,EAAE,CAAC;AAAA,UACjE,OAAO;AACL,oBAAQ;AAAA,cACN,MAAM;AAAA,gBACJ;AAAA,2BAAyB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,cACjF;AAAA,YACF;AAAA,UACF;AACA,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAc,UAAU,cAAc,QAAQ;AAChD,YAAQ,IAAI,MAAM,KAAK,iDAA0C,CAAC;AAElE,QAAI,QAAQ,QAAQ;AAClB,cAAQ,IAAI,MAAM,OAAO,+CAA+C,CAAC;AAAA,IAC3E,OAAO;AACL,YAAM,iBAAiB,IAAI,eAAe;AAE1C,UAAI;AACF,gBAAQ,IAAI,MAAM,IAAI,6BAA6B,CAAC;AAGpD,cAAM,YAAkD,CAAC;AACzD,YAAI,WAAW;AACb,oBAAU,KAAK,OAAO,WAAW;AAAA,QACnC;AACA,YAAI,eAAe;AACjB,oBAAU,KAAK,UAAU;AAAA,QAC3B;AAEA,YAAI,gBAAgB;AACpB,YAAI,aAAa;AACjB,cAAM,aAAqC,CAAC;AAE5C,mBAAW,YAAY,WAAW;AAChC,gBAAM,aAAa,MAAM,eAAe,KAAK;AAAA,YAC3C,MAAM;AAAA,UACR,CAAC;AAED,qBAAW,QAAQ,IAAI,WAAW,SAAS;AAC3C,2BAAiB,WAAW,SAAS;AAErC,qBAAW,UAAU,WAAW,UAAU;AACxC,gBAAI;AACF,kBAAI,OAAO,SAAS,SAAS,OAAO,MAAM;AACxC,sBAAM,UAAU,OAAO;AACvB,sBAAM,MAAM,eAAe,OAAO;AAClC,wBAAQ,IAAI,MAAM,IAAI,YAAO,QAAQ,IAAI,QAAQ,CAAC;AAClD;AAAA,cACF,WAAW,OAAO,SAAS,eAAe,OAAO,MAAM;AACrD,sBAAM,gBAAgB,OAAO;AAC7B,sBAAM,MAAM,cAAc,aAAa;AACvC,wBAAQ,IAAI,MAAM,IAAI,YAAO,cAAc,IAAI,cAAc,CAAC;AAC9D;AAAA,cACF,WAAW,OAAO,SAAS,cAAc,OAAO,MAAM;AACpD,sBAAM,eAAe,OAAO;AAC5B,sBAAM,MAAM,aAAa,YAAY;AACrC,wBAAQ,IAAI,MAAM,IAAI,YAAO,aAAa,IAAI,aAAa,CAAC;AAC5D;AAAA,cACF;AAAA,YACF,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AAGA,YAAI,iBAAiB,WAAW,UAAU,MAAM,QAAW;AACzD,kBAAQ,IAAI,MAAM,IAAI,kBAAkB,WAAW,UAAU,CAAC,wBAAwB,CAAC;AAAA,QACzF;AACA,YAAI,WAAW;AACb,gBAAM,WAAW,WAAW,KAAK,KAAK;AACtC,gBAAM,UAAU,WAAW,WAAW,KAAK;AAC3C,kBAAQ,IAAI,MAAM,IAAI,kBAAkB,QAAQ,aAAa,OAAO,yBAAyB,CAAC;AAAA,QAChG;AAEA,YAAI,kBAAkB,GAAG;AACvB,kBAAQ,IAAI,MAAM,IAAI,2BAA2B,CAAC;AAAA,QACpD,OAAO;AACL,kBAAQ;AAAA,YACN,MAAM,MAAM;AAAA,kBAAgB,UAAU,6BAA6B;AAAA,UACrE;AACA,cAAI,aAAa,eAAe;AAC9B,oBAAQ,IAAI,MAAM,IAAI,SAAS,gBAAgB,UAAU,2BAA2B,CAAC;AAAA,UACvF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,YAAI,iBAAiB,sBAAsB;AACzC,kBAAQ,IAAI,MAAM,IAAI,gCAA2B,CAAC;AAClD,kBAAQ;AAAA,YACN,MAAM;AAAA,cACJ,qBAAqB,MAAM,kBAAkB,CAAC;AAAA,YAChD;AAAA,UACF;AAAA,QACF,WAAW,iBAAiB,eAAe;AACzC,kBAAQ,IAAI,MAAM,IAAI;AAAA,2BAAyB,MAAM,OAAO,EAAE,CAAC;AAAA,QACjE,OAAO;AACL,kBAAQ;AAAA,YACN,MAAM;AAAA,cACJ;AAAA,2BAAyB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YACjF;AAAA,UACF;AAAA,QACF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,EAAE,QAAM,MAAM,MAAM,gBAAgB,CAAC;AACvC;","names":["p","p"]}