@aisdlc/core 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +98 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -1
- package/dist/index.d.ts +14 -1
- package/dist/index.js +98 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/index.ts","../src/verifiers/ast/typescript-ast.ts","../src/verifiers/ast/polyglot-scanner.ts","../src/verifiers/quality-gate.ts","../src/utils/fs.ts","../src/verifiers/gherkin.ts","../src/adapters/sdd/openspec.ts","../src/adapters/sdd/speckit.ts","../src/adapters/sdd/integration.ts","../src/verifiers/pdac-graph.ts","../src/verifiers/schemas.ts","../src/adapters/sdd/scaffold.ts","../src/adapters/sdd/ci.ts","../src/adapters/sdd/index.ts","../src/verifiers/traceability.ts","../src/verifiers/governance.ts","../src/verifiers/testing-coverage.ts","../src/verifiers/sca/scanner.ts","../src/verifiers/sca/sbom.ts","../src/verifiers/licenses.ts","../src/verifiers/progressive-friction.ts","../src/verifiers/duplicates.ts","../src/verifiers/secrets.ts","../src/verifiers/sast.ts","../src/reporters/quality-report.ts","../src/git/workflow.ts","../src/git/checkout.ts","../src/git/trailers.ts","../src/git/agent-detector.ts","../src/git/hook-installer.ts","../src/reporters/pr-kpis.ts","../src/reporters/release-kpis.ts","../src/reporters/cytoscape-bundle.ts","../src/reporters/dashboard.ts","../src/init/agent-templates.ts","../src/init/architecture-templates.ts","../src/init/index.ts"],"names":["SyntaxKind","Project","Node","path","path2","yaml","path3","fs","fs2","path4","path5","fs3","path6","fs4","path7","fs5","path8","fs6","crypto","fs7","path9","path10","fs8","path11","fs9","specPath","specFmObj","specContent","specGherkinBlocks","wsValidation","specValidation","fs10","path12","fs11","fs12","path13","fs13","path14","fs14","path15","child_process","path16","fs15","path17","fs16","crypto2","fs17","path18","dependencies","violations","permittedCount","reportMarkdown","fs18","path19","crypto3","fs19","path20","execFileSync","fs20","path21","path22","fs21","path23","fs22","path24","fs23","path25","fs24","path26","fs25","sep","path27","fs26","createRequire","path28","fs27","path29","fs28","path30","fs29"],"mappings":"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AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","file":"index.cjs","sourcesContent":["/**\n * AI-SDLC Core Domain Types and Interfaces\n */\n\n// --- Quality Gate Types ---\nexport interface QualityPolicy {\n max_cyclomatic: number;\n max_cognitive: number;\n min_maintainability: number;\n max_function_lines: number;\n enforce_mode: 'STRICT' | 'PERMISSIVE' | string;\n target_directories: string[];\n supported_extensions: string[];\n exclude_patterns: string[];\n}\n\nexport interface FunctionMetrics {\n functionName: string;\n filePath: string;\n loc: number;\n cyclomatic: number;\n cognitive: number;\n maintainability: number;\n codeSmells: string[];\n}\n\nexport interface AnalysisResult extends FunctionMetrics {\n relPath: string;\n status: 'PASS' | 'FAIL';\n violations: string[];\n}\n\nexport interface QualityThresholds {\n max_cyclomatic?: number;\n max_cognitive?: number;\n min_maintainability?: number;\n max_function_lines?: number;\n enforce_mode?: 'STRICT' | 'PERMISSIVE' | string;\n}\n\nexport interface QualityGateOptions {\n rootDir?: string;\n policyPath?: string;\n policy?: QualityPolicy;\n thresholds?: QualityThresholds;\n}\n\nexport interface QualityGateResult {\n success: boolean;\n totalFiles: number;\n totalFunctions: number;\n passCount: number;\n failCount: number;\n violationsCount: number;\n results: AnalysisResult[];\n policy: QualityPolicy;\n reportMarkdown?: string;\n}\n\n// --- Traceability Types ---\nexport interface ArtifactFrontmatter {\n id?: string;\n type?: string;\n title?: string;\n level?: number;\n 'bounded-context'?: string;\n 'parent-component'?: string;\n 'implementation-type'?: 'service' | 'dll' | 'function' | 'composite' | string;\n 'satisfies-requirements'?: string[];\n 'derives-from'?: string | string[];\n 'mitigates-abuse-case'?: string | string[];\n 'enforced-in-enclave'?: string;\n 'cucumber-tags'?: string[];\n [key: string]: unknown;\n}\n\nexport interface TraceabilityRow {\n id: string;\n title: string;\n type?: string;\n hofId?: string;\n productTraces: string;\n productStatus: 'COMPLIANT' | 'ORPHAN' | 'CONFORME' | 'HUÉRFANO';\n archTraces: string;\n archStatus: 'COMPLIANT' | 'ORPHAN' | 'CONFORME' | 'HUÉRFANO';\n testTraces: string;\n testStatus: 'COMPLIANT' | 'ORPHAN' | 'CONFORME' | 'HUÉRFANO';\n content?: string;\n filePath?: string;\n}\n\nexport interface TraceabilityOptions {\n rootDir?: string;\n specsDir?: string;\n examplesDir?: string;\n testsDir?: string;\n strictHandoff?: boolean;\n}\n\nexport interface TraceabilityResult {\n success: boolean;\n rows: TraceabilityRow[];\n orphans: TraceabilityRow[];\n orphanCount: number;\n totalRequirements: number;\n reportMarkdown: string;\n}\n\n// --- PDaC Handoff & SDD Adapter Types ---\nexport interface ProductHandoffSubgraph {\n requirements: string[];\n useCases?: string[];\n businessRules?: string[];\n securityRequirements?: string[];\n abuseCases?: string[];\n actors?: string[];\n [key: string]: unknown;\n}\n\nexport interface ProductHandoff {\n id: string; // e.g. HOF-001-TELEMETRY-INGESTION\n type: 'handoff' | 'product-handoff' | string;\n title?: string;\n changeId: string;\n version?: string;\n subgraph: ProductHandoffSubgraph;\n citations?: {\n id?: string;\n targetId?: string;\n expectedDigest?: string;\n anchor?: string;\n comment?: string;\n }[];\n createdAt?: string;\n [key: string]: unknown;\n}\n\nexport type SddFramework = 'openspec' | 'speckit';\n\nexport type ChangeProfile = 'patch' | 'standard' | 'critical';\nexport const VALID_CHANGE_PROFILES: readonly ChangeProfile[] = ['patch', 'standard', 'critical'] as const;\n\nexport interface SddWorkspaceInfo {\n framework: SddFramework;\n changeId: string;\n changeDir: string;\n profile?: ChangeProfile;\n proposalFile?: string;\n specFile?: string;\n designFile?: string;\n tasksFile?: string;\n sidecarFile?: string;\n handoff?: ProductHandoff;\n}\n\nexport interface SddDepositOptions {\n rootDir?: string;\n changeId: string;\n framework: SddFramework;\n handoff: ProductHandoff;\n destinationDir?: string;\n}\n\nexport interface SddValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n workspace?: SddWorkspaceInfo;\n}\n\nexport interface SddIntegrationOptions {\n rootDir?: string;\n changeId: string;\n author?: string;\n date?: string;\n autoArchive?: boolean;\n}\n\nexport interface SddIntegrationResult {\n success: boolean;\n changeId: string;\n completedTasks: string[];\n pendingTasks: string[];\n integratedRequirements: string[];\n updatedProductArtifacts: string[];\n updatedArchitectureArtifacts: string[];\n createdCanonicalArtifacts?: string[];\n archived: boolean;\n archivedPath?: string;\n errors: string[];\n}\n\nexport interface SddChangeScaffoldOptions {\n rootDir?: string;\n name: string;\n changeId?: string;\n id?: string;\n from?: string | string[];\n framework?: SddFramework;\n author?: string;\n profile?: ChangeProfile;\n silent?: boolean;\n}\n\nexport interface SddChangeScaffoldResult {\n success: boolean;\n changeId: string;\n canonicalId: string;\n profile: ChangeProfile;\n changeDir: string;\n createdFiles: string[];\n productArtifactCreated?: string;\n citedArtifacts: Array<{ id: string; digest: string; title?: string; comment?: string }>;\n errors: string[];\n}\n\n// --- Progressive Friction & Anti-Bypass Types ---\nexport interface ProgressiveFrictionOptions {\n rootDir?: string;\n changeId?: string;\n changeDir?: string;\n diffFiles?: string[];\n modifiedFiles?: string[];\n}\n\nexport interface ProgressiveFrictionResult {\n success: boolean;\n profile: ChangeProfile;\n bypassed: boolean;\n violations: string[];\n bypassedRules: string[];\n evaluatedFiles: string[];\n errors: string[];\n reportMarkdown?: string;\n}\n\n\nexport interface ChangeDetectionOptions {\n rootDir?: string;\n headRef?: string;\n prTitle?: string;\n prBody?: string;\n changedFiles?: string[];\n}\n\nexport interface ChangeDetectionResult {\n detected: boolean;\n changeId?: string;\n source?: 'branch' | 'title' | 'body' | 'files' | 'single_active_completed';\n changeDir?: string;\n allTasksCompleted?: boolean;\n completedTasksCount?: number;\n totalTasksCount?: number;\n reasons: string[];\n}\n\nexport interface SddIntegrationAudit {\n changeId: string;\n status: 'FULLY_INTEGRATED' | 'PARTIALLY_INTEGRATED' | 'UNINTEGRATED';\n completedTasksCount: number;\n totalTasksCount: number;\n integratedRequirements: string[];\n missingRequirements: string[];\n gaps: string[];\n}\n\n// --- Tasks Governance Types ---\nexport type AutonomyMode = 'AUTONOMOUS' | 'HUMAN_REVIEW_PLAN' | 'AMBIGUOUS' | 'HIGH_RISK_MANUAL';\n\nexport const VALID_AUTONOMY_MODES: readonly AutonomyMode[] = [\n 'AUTONOMOUS',\n 'HUMAN_REVIEW_PLAN',\n 'AMBIGUOUS',\n 'HIGH_RISK_MANUAL'\n] as const;\n\nexport interface TaskVerification {\n method?: string;\n criteria?: string;\n}\n\nexport interface TaskItem {\n id: string;\n title?: string;\n complexity?: string;\n riskLevel?: string;\n autonomyMode?: string;\n assignedTo?: string;\n status?: string;\n blockingReason?: string;\n verification: TaskVerification;\n}\n\nexport interface TaskSummary {\n file: string;\n task: TaskItem;\n hasVerification: boolean;\n validAutonomy: boolean;\n riskAnomaly: boolean;\n}\n\nexport interface GovernanceOptions {\n rootDir?: string;\n specsDir?: string;\n}\n\nexport interface GovernanceResult {\n success: boolean;\n totalTasks: number;\n verifiedCount: number;\n unverifiedCount: number;\n riskCounts: Record<string, number>;\n modeCounts: Record<string, number>;\n tasks: TaskSummary[];\n violations: string[];\n reportMarkdown: string;\n}\n\n// --- Testing Coverage Types ---\nexport interface RequirementAuditItem {\n id: string;\n title: string;\n file: string;\n isTemplate: boolean;\n method: string;\n testRefs: string;\n existingCount: number;\n status: 'VERIFICADO_CON_PRUEBA' | 'FALLO_SIN_PRUEBA';\n}\n\nexport interface TaskAuditItem {\n id: string;\n title: string;\n file: string;\n method: string;\n commandOrCriteria: string;\n status: 'VERIFICADO_CON_PRUEBA' | 'FALLO_SIN_PRUEBA';\n}\n\nexport interface TestingCoverageOptions {\n rootDir?: string;\n}\n\nexport interface TestingCoverageResult {\n success: boolean;\n totalRequirements: number;\n passedRequirements: number;\n failedRequirements: number;\n totalTasks: number;\n passedTasks: number;\n failedTasks: number;\n requirements: RequirementAuditItem[];\n tasks: TaskAuditItem[];\n reportMarkdown: string;\n}\n\n// --- Gherkin Extraction Types ---\nexport interface ExtractedFeature {\n sourceFile: string;\n outputFile: string;\n featureName: string;\n scenarioCount: number;\n}\n\nexport interface GherkinExtractionOptions {\n rootDir?: string;\n targetPath?: string;\n all?: boolean;\n}\n\nexport interface GherkinExtractionResult {\n success: boolean;\n features: ExtractedFeature[];\n totalScenarios: number;\n}\n\nexport interface GherkinSyncCheckResult {\n inSync: boolean;\n outOfSyncFiles: string[];\n missingFiles: string[];\n totalFeatures: number;\n}\n\n// --- License Compliance Types ---\nexport interface LicensePolicy {\n version: string;\n permitted: string[];\n restricted: string[];\n blocked: string[];\n exception_packages?: Record<string, string>;\n}\n\nexport interface LicenseViolation {\n packageName: string;\n version?: string;\n license: string;\n reason: string;\n category: 'BLOCKED' | 'RESTRICTED' | 'UNRECOGNIZED';\n}\n\nexport type ScaTool = 'native' | 'license-checker' | 'trivy' | 'syft';\n\nexport interface ScannedDependency {\n name: string;\n version: string;\n spdxLicense: string;\n purl?: string;\n path?: string;\n licenseFile?: string;\n repository?: string;\n author?: string;\n isDirect?: boolean;\n}\n\nexport interface CycloneDxLicense {\n license: {\n id?: string;\n name?: string;\n };\n}\n\nexport interface CycloneDxComponent {\n type: 'library' | 'application' | 'framework';\n name: string;\n version: string;\n purl?: string;\n author?: string;\n licenses?: CycloneDxLicense[];\n}\n\nexport interface CycloneDxBom {\n bomFormat: 'CycloneDX';\n specVersion: '1.5';\n version: number;\n serialNumber: string;\n metadata: {\n timestamp: string;\n tools: Array<{ vendor: string; name: string; version: string }>;\n component: {\n type: string;\n name: string;\n version: string;\n };\n };\n components: CycloneDxComponent[];\n}\n\nexport interface LicenseVerificationOptions {\n rootDir?: string;\n policyPath?: string;\n manifestPath?: string;\n dynamic?: boolean;\n tool?: ScaTool;\n depth?: 'direct' | 'transitive';\n generateSbom?: boolean;\n sbomPath?: string;\n generateNotices?: boolean;\n noticesPath?: string;\n productionOnly?: boolean;\n}\n\nexport interface LicenseVerificationResult {\n success: boolean;\n totalEvaluated: number;\n permittedCount: number;\n violations: LicenseViolation[];\n reportMarkdown: string;\n sbomPath?: string;\n noticesPath?: string;\n scannedDependencies?: ScannedDependency[];\n}\n\n// --- PDaC Graph & Cryptographic Drift Types ---\nexport interface PdacNode {\n id: string;\n type: string;\n filePath: string;\n title?: string;\n digest: string;\n rawContent: string;\n citations: {\n targetId: string;\n expectedDigest?: string;\n anchor?: string;\n }[];\n}\n\nexport interface PdacDrift {\n sourceId: string;\n targetId: string;\n sourceFile: string;\n expectedDigest: string;\n actualDigest: string;\n}\n\nexport interface PdacGraphOptions {\n rootDir?: string;\n}\n\nexport interface PdacGraphResult {\n success: boolean;\n totalNodes: number;\n totalEdges: number;\n drifts: PdacDrift[];\n reportMarkdown: string;\n}\n\nexport interface PdacSyncOptions {\n rootDir?: string;\n targetPath?: string;\n}\n\nexport interface PdacSyncDetail {\n sourceFile: string;\n targetId: string;\n previousDigest: string;\n newDigest: string;\n}\n\nexport interface PdacSyncResult {\n success: boolean;\n syncedCount: number;\n updatedFiles: string[];\n details: PdacSyncDetail[];\n}\n\nexport interface PreflightGateSummary {\n name: string;\n status: 'PASSED' | 'FAILED' | 'FIXED' | 'WARNING';\n message: string;\n remediation?: string;\n}\n\nexport interface PreflightCheckOptions {\n root?: string;\n fix?: boolean;\n silent?: boolean;\n}\n\nexport interface PreflightCheckResult {\n success: boolean;\n autoFixExecuted: boolean;\n gherkinSynced: number;\n digestsSynced: number;\n gates: PreflightGateSummary[];\n}\n\n// --- Quality Report Types ---\nexport interface QualityReportOptions {\n rootDir?: string;\n policyPath?: string;\n thresholds?: QualityThresholds;\n}\n\nexport interface QualityReportResult {\n markdown: string;\n totalFiles: number;\n totalFunctions: number;\n avgMaintainability: number;\n avgCyclomatic: number;\n verdict: 'PASS' | 'FAIL';\n}\n\n// --- Git Workflow Types ---\nexport interface BranchValidationSuccess {\n valid: true;\n tier: 1 | 2 | 3 | 4;\n tierName: string;\n parentRequirement: string;\n targetMerge: string;\n id?: string;\n parentId?: string;\n taskId?: string;\n}\n\nexport interface BranchValidationError {\n valid: false;\n tier: 0;\n tierName: 'Inválido';\n error: string;\n}\n\nexport type BranchClassificationResult = BranchValidationSuccess | BranchValidationError;\n\nexport interface BranchHierarchyPlan {\n version: string;\n feature: string;\n tasks: string[];\n planText: string;\n}\n\n// --- Artifact Schema Validation Types ---\nexport interface ArtifactSchemaOptions {\n rootDir?: string;\n targetPath?: string;\n schemaDir?: string;\n}\n\nexport interface ArtifactSchemaViolation {\n filePath: string;\n id?: string;\n type?: string;\n schemaId?: string;\n property?: string;\n message: string;\n}\n\nexport interface ArtifactValidationResult {\n valid: boolean;\n filePath: string;\n id?: string;\n type?: string;\n schemaId?: string;\n errors: string[];\n}\n\nexport interface ArtifactSchemaResult {\n success: boolean;\n totalEvaluated: number;\n validCount: number;\n invalidCount: number;\n violations: ArtifactSchemaViolation[];\n results: ArtifactValidationResult[];\n}\n\n// --- Git Task Checkout Types ---\nexport interface ActiveTaskMatch {\n taskId: string;\n taskTitle: string;\n changeId: string;\n changeDir: string;\n version: string;\n}\n\nexport interface GitCheckoutTaskOptions {\n rootDir?: string;\n}\n\nexport interface GitCheckoutTaskResult {\n success: boolean;\n taskId: string;\n changeId?: string;\n releaseBranch?: string;\n featureBranch?: string;\n taskBranch?: string;\n createdBranches: string[];\n switchedBranch?: string;\n error?: string;\n availableTasks?: Array<{ id: string; title: string; changeId: string }>;\n}\n\n// --- Duplicate Requirements Verifier Types ---\nexport type DuplicateSeverity = 'ERROR' | 'WARNING';\n\nexport type DuplicateIssueType =\n | 'ID_COLLISION'\n | 'EXACT_CONTENT'\n | 'TITLE_SIMILARITY'\n | 'BDD_TAG_COLLISION'\n | 'SHARED_BUSINESS_RULE';\n\nexport interface DuplicateIssue {\n type: DuplicateIssueType;\n severity: DuplicateSeverity;\n id: string;\n file: string;\n conflictingId?: string;\n conflictingFile?: string;\n message: string;\n similarityScore?: number;\n}\n\nexport interface DuplicateVerifierOptions {\n rootDir?: string;\n specsDir?: string;\n examplesDir?: string;\n titleSimilarityThreshold?: number; // default: 0.85\n allowWarnings?: boolean;\n}\n\nexport interface DuplicateVerifierResult {\n success: boolean;\n totalRequirements: number;\n errorCount: number;\n warningCount: number;\n issues: DuplicateIssue[];\n reportMarkdown?: string;\n}\n\n// --- Secret Scanning & Gitleaks Types ---\nexport type SecretFindingType =\n | 'PRIVATE_KEY'\n | 'AWS_CREDENTIAL'\n | 'GITHUB_TOKEN'\n | 'SLACK_TOKEN'\n | 'GOOGLE_API_KEY'\n | 'OPENAI_API_KEY'\n | 'STRIPE_API_KEY'\n | 'JWT_TOKEN'\n | 'GENERIC_HIGH_ENTROPY_SECRET'\n | 'GITLEAKS_FINDING';\n\nexport interface SecretViolation {\n filePath: string;\n relPath: string;\n lineNumber: number;\n type: SecretFindingType;\n maskedMatch: string;\n ruleId: string;\n entropy?: number;\n message: string;\n}\n\nexport interface SecretVerifierOptions {\n rootDir?: string;\n diff?: boolean;\n baseBranch?: string;\n entropyThreshold?: number; // default: 4.3\n gitleaks?: boolean;\n excludePatterns?: string[];\n ignoreSecrets?: string[];\n}\n\nexport interface SecretVerifierResult {\n success: boolean;\n totalFilesScanned: number;\n findingsCount: number;\n findings: SecretViolation[];\n scannedWithGitleaks: boolean;\n reportMarkdown?: string;\n}\n\n// --- SAST (Static Application Security Testing) Types ---\nexport type SastSeverity = 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW';\n\nexport type SastFindingType =\n | 'SQL_INJECTION'\n | 'COMMAND_INJECTION'\n | 'SSRF'\n | 'PATH_TRAVERSAL'\n | 'UNSAFE_EVAL'\n | 'PROMPT_INJECTION_RISK'\n | 'SEMGREP_FINDING';\n\nexport interface SastViolation {\n filePath: string;\n relPath: string;\n lineNumber: number;\n ruleId: string;\n type: SastFindingType;\n severity: SastSeverity;\n snippet: string;\n message: string;\n}\n\nexport interface SastVerifierOptions {\n rootDir?: string;\n semgrep?: boolean;\n targetDirectories?: string[];\n minSeverity?: SastSeverity;\n}\n\nexport interface SastVerifierResult {\n success: boolean;\n totalFilesScanned: number;\n violationsCount: number;\n violations: SastViolation[];\n reportMarkdown?: string;\n}\n\nexport interface PromptInjectionFinding {\n ruleId: string;\n severity: SastSeverity;\n pattern: string;\n snippet: string;\n lineNumber?: number;\n message: string;\n}\n\n// --- Interactive Web Dashboard & Cytoscape Graph Types ---\nexport type GraphNodeLayer = 'product' | 'requirement' | 'architecture' | 'test';\nexport type GraphNodeStatus = 'COMPLIANT' | 'ORPHAN' | 'DRIFT' | 'REVIEW' | 'CONFORME' | 'HUÉRFANO';\nexport type GraphNodeType =\n | 'journey'\n | 'actor'\n | 'threat-actor'\n | 'use-case'\n | 'business-rule'\n | 'abuse-case'\n | 'hazard'\n | 'requirement'\n | 'security-requirement'\n | 'safety-requirement'\n | 'component'\n | 'adr'\n | 'security-enclave'\n | 'bdd-feature'\n | 'code-test'\n | string;\n\nexport interface CytoscapeNodeData {\n id: string;\n label: string;\n title: string;\n type: GraphNodeType;\n layer: GraphNodeLayer;\n status: GraphNodeStatus;\n filePath?: string;\n content?: string;\n digest?: string;\n details?: Record<string, unknown>;\n upstream?: string[];\n downstream?: string[];\n}\n\nexport interface CytoscapeEdgeData {\n id: string;\n source: string;\n target: string;\n label?: string;\n relation: string;\n status?: GraphNodeStatus;\n}\n\nexport interface CytoscapeElement {\n group: 'nodes' | 'edges';\n data: CytoscapeNodeData | CytoscapeEdgeData;\n classes?: string;\n}\n\nexport interface DashboardHistoricalKpi {\n id: string;\n label: string;\n timestamp: string;\n kloc: number;\n commits: number;\n bugs: number;\n defectDensity: number;\n reworkPercent: number;\n costUsd: number;\n}\n\nexport interface DashboardOptions {\n rootDir?: string;\n outputPath?: string;\n title?: string;\n includeHistoricalKpis?: boolean;\n}\n\nexport interface DashboardResult {\n outputPath: string;\n totalNodes: number;\n totalEdges: number;\n conformingCount: number;\n issueCount: number;\n nodesByLayer: Record<GraphNodeLayer, number>;\n metrics: {\n totalFiles: number;\n totalFunctions: number;\n avgMaintainability: number;\n avgCyclomatic: number;\n qualityVerdict: 'PASS' | 'FAIL';\n autonomyDistribution: Record<string, number>;\n traceabilityRatio: number;\n bddCoverageRatio: number;\n };\n html: string;\n}\n\n\n\n","/**\n * AI-SDLC: TypeScript/JavaScript Real AST Static Analysis Engine\n * Powered by ts-morph (MIT License)\n */\n\nimport * as path from 'path';\nimport { Node, Project, SyntaxKind } from 'ts-morph';\nimport { FunctionMetrics } from '../../types/index.js';\n\nconst CYCLOMATIC_KINDS = new Set<SyntaxKind>([\n SyntaxKind.IfStatement,\n SyntaxKind.ConditionalExpression,\n SyntaxKind.ForStatement,\n SyntaxKind.ForInStatement,\n SyntaxKind.ForOfStatement,\n SyntaxKind.WhileStatement,\n SyntaxKind.DoStatement,\n SyntaxKind.CaseClause,\n SyntaxKind.CatchClause,\n]);\n\nconst LOGICAL_BINARY_OPS = new Set<SyntaxKind>([\n SyntaxKind.AmpersandAmpersandToken,\n SyntaxKind.BarBarToken,\n SyntaxKind.QuestionQuestionToken,\n]);\n\nlet sharedProject: Project | null = null;\n\nfunction getSharedProject(): Project {\n if (!sharedProject) {\n sharedProject = new Project({\n useInMemoryFileSystem: true,\n compilerOptions: { allowJs: true, jsx: 1 },\n });\n }\n return sharedProject;\n}\n\nfunction resolveDeclarationName(node: Node): string | null {\n if (\n Node.isFunctionDeclaration(node) ||\n Node.isMethodDeclaration(node) ||\n Node.isGetAccessorDeclaration(node) ||\n Node.isSetAccessorDeclaration(node)\n ) {\n const prefix = Node.isGetAccessorDeclaration(node) ? 'get ' : Node.isSetAccessorDeclaration(node) ? 'set ' : '';\n return `${prefix}${node.getName() || 'anonymous'}`;\n }\n if (Node.isConstructorDeclaration(node)) return 'constructor';\n return null;\n}\n\nfunction resolveExpressionParentName(parent: Node): string {\n if (Node.isVariableDeclaration(parent) || Node.isPropertyAssignment(parent)) {\n return parent.getName();\n }\n if (Node.isCallExpression(parent)) {\n const args = parent.getArguments();\n if (args.length > 0 && Node.isStringLiteral(args[0])) {\n return args[0].getLiteralText();\n }\n return parent.getExpression().getText();\n }\n return 'anonymous';\n}\n\nfunction resolveFunctionName(node: Node): string {\n const declName = resolveDeclarationName(node);\n if (declName) return declName;\n\n const parent = node.getParent();\n return parent ? resolveExpressionParentName(parent) : 'anonymous';\n}\n\nfunction isBranchNode(kind: SyntaxKind, child: Node): boolean {\n if (CYCLOMATIC_KINDS.has(kind)) return true;\n if (kind === SyntaxKind.BinaryExpression) {\n const binExpr = child.asKind(SyntaxKind.BinaryExpression);\n return LOGICAL_BINARY_OPS.has(binExpr?.getOperatorToken().getKind() ?? SyntaxKind.Unknown);\n }\n return false;\n}\n\nfunction computeCyclomaticFromAst(node: Node): number {\n let complexity = 1;\n node.forEachDescendant((child) => {\n if (isNestedFunctionBoundary(child, node)) return;\n if (isBranchNode(child.getKind(), child)) {\n complexity++;\n }\n });\n return complexity;\n}\n\nfunction isNestedFunctionBoundary(child: Node, root: Node): boolean {\n if (child === root) return false;\n return (\n Node.isFunctionDeclaration(child) ||\n Node.isMethodDeclaration(child) ||\n Node.isConstructorDeclaration(child)\n );\n}\n\nfunction computeCognitiveFromAst(node: Node, currentNesting = 0): number {\n let cognitive = 0;\n for (const child of node.getChildren()) {\n const kind = child.getKind();\n const isControlFlow = CYCLOMATIC_KINDS.has(kind);\n const nextNesting = isControlFlow ? currentNesting + 1 : currentNesting;\n\n if (isControlFlow) {\n cognitive += kind === SyntaxKind.CaseClause ? 1 : 1 + currentNesting;\n }\n\n if (!isNestedFunctionBoundary(child, node)) {\n cognitive += computeCognitiveFromAst(child, nextNesting);\n }\n }\n return cognitive;\n}\n\nfunction calculateLocAndHalstead(fullText: string, cyclomatic: number): { loc: number; mi: number } {\n const allLines = fullText.split(/\\r?\\n/).map((l) => l.trim()).filter((l) => l.length > 0);\n const commentLines = allLines.filter((l) => l.startsWith('//') || l.startsWith('/*') || l.startsWith('*')).length;\n const loc = Math.max(1, allLines.length - commentLines);\n\n const cleanText = fullText.replace(/\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*/g, '');\n const tokens = cleanText.split(/[\\s,;().{}[\\]=+\\-*/<>!&|:]+/).filter((t) => t.length > 0);\n const N = tokens.length || 1;\n const n = new Set(tokens).size || 1;\n const V = Math.max(1, N * Math.log2(Math.max(2, n)));\n\n const perCM = allLines.length > 0 ? commentLines / allLines.length : 0;\n const commentWeight = 50 * Math.sin(Math.sqrt(2.4 * perCM));\n\n const rawMI = 171 - 5.2 * Math.log(V) - 0.23 * cyclomatic - 16.2 * Math.log(loc) + commentWeight;\n const normalizedMI = Math.max(0, Math.min(100, (rawMI * 100) / 171));\n\n return { loc, mi: Math.round(normalizedMI * 10) / 10 };\n}\n\nfunction detectAstCodeSmells(node: Node, loc: number, nodeText: string): string[] {\n const smells: string[] = [];\n if (node.getDescendantsOfKind(SyntaxKind.AnyKeyword).length > 0) {\n smells.push('Uso prohibido de \"any\"');\n }\n if (/\\/\\/\\s*@ts-ignore|\\/\\/\\s*eslint-disable/.test(nodeText)) {\n smells.push('Supresión no autorizada de linter');\n }\n if (loc > 40) {\n smells.push(`Función extensa (${loc} líneas > límite 40)`);\n }\n return smells;\n}\n\nfunction isDeclarationFunction(node: Node): boolean {\n return (\n Node.isFunctionDeclaration(node) ||\n Node.isMethodDeclaration(node) ||\n Node.isConstructorDeclaration(node) ||\n Node.isGetAccessorDeclaration(node) ||\n Node.isSetAccessorDeclaration(node)\n );\n}\n\nfunction isAnalyzableArrowOrExpr(node: Node): boolean {\n if (!Node.isArrowFunction(node) && !Node.isFunctionExpression(node)) return false;\n const parent = node.getParent();\n if (!parent) return false;\n if (Node.isVariableDeclaration(parent) || Node.isPropertyAssignment(parent)) return true;\n if (Node.isCallExpression(parent)) {\n return ['it', 'test'].includes(parent.getExpression().getText());\n }\n return false;\n}\n\nfunction isAnalyzableFunction(node: Node): boolean {\n return isDeclarationFunction(node) || isAnalyzableArrowOrExpr(node);\n}\n\nfunction buildNodeMetrics(node: Node, filePath: string): FunctionMetrics {\n const functionName = resolveFunctionName(node);\n const cyclomatic = computeCyclomaticFromAst(node);\n const cognitive = computeCognitiveFromAst(node);\n const fullText = node.getFullText();\n const nodeText = node.getText();\n const { loc, mi } = calculateLocAndHalstead(fullText, cyclomatic);\n const codeSmells = detectAstCodeSmells(node, loc, nodeText);\n\n return { functionName, filePath, loc, cyclomatic, cognitive, maintainability: mi, codeSmells };\n}\n\nfunction buildModuleFallback(content: string, filePath: string): FunctionMetrics {\n const { loc, mi } = calculateLocAndHalstead(content, 1);\n const codeSmells = loc > 40 ? [`Función extensa (${loc} líneas > límite 40)`] : [];\n return {\n functionName: 'main_module',\n filePath,\n loc,\n cyclomatic: 1,\n cognitive: 0,\n maintainability: mi,\n codeSmells,\n };\n}\n\nexport function extractFunctionsTypeScriptAst(content: string, filePath: string): FunctionMetrics[] {\n const project = getSharedProject();\n const ext = path.extname(filePath).toLowerCase() || '.ts';\n const fileName = `temp_${Date.now()}_${Math.random().toString(36).substring(2, 7)}${ext}`;\n const sourceFile = project.createSourceFile(fileName, content, { overwrite: true });\n const metricsList: FunctionMetrics[] = [];\n\n try {\n sourceFile.forEachDescendant((node) => {\n if (isAnalyzableFunction(node)) {\n metricsList.push(buildNodeMetrics(node, filePath));\n }\n });\n return metricsList.length > 0 ? metricsList : [buildModuleFallback(content, filePath)];\n } finally {\n sourceFile.forget();\n }\n}\n","/**\n * AI-SDLC: Polyglot Token-Aware Structural AST Scanner\n * Supports Go, Rust, Java, C#, C/C++, and Python with exact delimiter tracking.\n */\n\nimport * as path from 'path';\nimport { FunctionMetrics } from '../../types/index.js';\n\ninterface RawFunctionBlock {\n name: string;\n body: string;\n startLine: number;\n}\n\nexport function extractFunctionsPolyglot(content: string, filePath: string): FunctionMetrics[] {\n const ext = path.extname(filePath).toLowerCase();\n return ext === '.py' ? extractPythonFunctions(content, filePath) : extractBraceFunctions(content, filePath);\n}\n\nfunction isDocstringToggle(trimmed: string): boolean {\n const dCount = (trimmed.match(/\"\"\"/g) || []).length;\n const sCount = (trimmed.match(/'''/g) || []).length;\n return dCount % 2 === 1 || sCount % 2 === 1;\n}\n\nfunction shouldAppendPythonBody(line: string, baseIndent: number, inDoc: boolean): boolean {\n if (inDoc || line.trim().length === 0) return true;\n const lineIndent = line.length - line.trimStart().length;\n return lineIndent > baseIndent;\n}\n\nfunction parsePythonDefLine(line: string, inDoc: boolean): { name: string; indent: number } | null {\n if (inDoc) return null;\n const match = line.match(/^(\\s*)(?:async\\s+)?def\\s+([a-zA-Z0-9_$]+)\\s*\\(/);\n return match ? { name: match[2], indent: match[1].length } : null;\n}\n\nfunction flushPythonBlock(\n state: { currentFn: string | null; fnLines: string[] },\n blocks: RawFunctionBlock[],\n lineIndex: number\n): void {\n if (state.currentFn && state.fnLines.length > 0) {\n blocks.push({ name: state.currentFn, body: state.fnLines.join('\\n'), startLine: lineIndex });\n }\n state.currentFn = null;\n state.fnLines = [];\n}\n\nfunction handlePythonBodyLine(\n raw: string,\n state: { currentFn: string | null; fnLines: string[]; baseIndent: number; inDocstring: boolean },\n blocks: RawFunctionBlock[],\n lineIndex: number\n): void {\n if (shouldAppendPythonBody(raw, state.baseIndent, state.inDocstring)) {\n state.fnLines.push(raw);\n } else {\n flushPythonBlock(state, blocks, lineIndex);\n }\n}\n\nfunction processPythonLine(\n raw: string,\n state: { currentFn: string | null; fnLines: string[]; baseIndent: number; inDocstring: boolean },\n blocks: RawFunctionBlock[],\n lineIndex: number\n): void {\n if (isDocstringToggle(raw.trim())) state.inDocstring = !state.inDocstring;\n\n const defMatch = parsePythonDefLine(raw, state.inDocstring);\n if (defMatch) {\n flushPythonBlock(state, blocks, lineIndex);\n state.currentFn = defMatch.name;\n state.baseIndent = defMatch.indent;\n state.fnLines = [raw];\n return;\n }\n\n if (state.currentFn) {\n handlePythonBodyLine(raw, state, blocks, lineIndex);\n }\n}\n\nfunction extractPythonFunctions(content: string, filePath: string): FunctionMetrics[] {\n const lines = content.split('\\n');\n const blocks: RawFunctionBlock[] = [];\n const state = { currentFn: null as string | null, fnLines: [] as string[], baseIndent: 0, inDocstring: false };\n\n for (let i = 0; i < lines.length; i++) {\n processPythonLine(lines[i], state, blocks, i);\n }\n\n if (state.currentFn && state.fnLines.length > 0) {\n blocks.push({ name: state.currentFn, body: state.fnLines.join('\\n'), startLine: lines.length });\n }\n\n return buildMetricsFromBlocks(blocks, content, filePath);\n}\n\ninterface BraceScanState {\n currentFn: string | null;\n braceCount: number;\n fnLines: string[];\n inBlockComment: boolean;\n}\n\nfunction processBraceLine(\n line: string,\n state: BraceScanState,\n blocks: RawFunctionBlock[],\n lineIndex: number,\n ext: string\n): void {\n if (!state.currentFn) {\n const candidate = matchFunctionHeader(line, ext);\n if (!candidate) return;\n state.currentFn = candidate;\n state.braceCount = 0;\n state.fnLines = [];\n }\n\n state.fnLines.push(line);\n const res = scanBracesInLine(line, state.inBlockComment, ext);\n state.inBlockComment = res.nowInBlock;\n state.braceCount += res.delta;\n\n if (state.braceCount === 0 && state.fnLines.length > 1) {\n blocks.push({ name: state.currentFn, body: state.fnLines.join('\\n'), startLine: lineIndex });\n state.currentFn = null;\n state.fnLines = [];\n }\n}\n\nfunction extractBraceFunctions(content: string, filePath: string): FunctionMetrics[] {\n const ext = path.extname(filePath).toLowerCase();\n const lines = content.split('\\n');\n const blocks: RawFunctionBlock[] = [];\n const state: BraceScanState = { currentFn: null, braceCount: 0, fnLines: [], inBlockComment: false };\n\n for (let i = 0; i < lines.length; i++) {\n processBraceLine(lines[i], state, blocks, i, ext);\n }\n\n return buildMetricsFromBlocks(blocks, content, filePath);\n}\n\nfunction matchCStyleHeader(line: string): string | null {\n const match = line.match(\n /(?:(?:public|private|protected|static|async|virtual|override|fn)\\s+)*(?:function\\s+([a-zA-Z0-9_$]+)|(?:[a-zA-Z0-9_<>[\\]?]+\\s+)+([a-zA-Z0-9_$]+)\\s*\\([^;{]*\\)\\s*(?:throws\\s+[^{]+)?\\{|([a-zA-Z0-9_$]+)\\s*\\([^;{]*\\)\\s*(?::\\s*[^{]+\\s*)?\\{)/\n );\n if (!match) return null;\n const candidate = match[1] || match[2] || match[3];\n const exclusions = ['if', 'for', 'while', 'switch', 'catch', 'select', 'match', 'class', 'struct'];\n return candidate && !exclusions.includes(candidate) ? candidate : null;\n}\n\nfunction matchFunctionHeader(line: string, ext: string): string | null {\n const trimmed = line.trim();\n if (trimmed.startsWith('//') || trimmed.startsWith('/*') || trimmed.startsWith('*')) return null;\n\n if (ext === '.go') {\n const match = line.match(/func\\s+(?:\\([^)]*\\)\\s*)?([a-zA-Z0-9_$]+)\\s*\\(/);\n return match ? match[1] : null;\n }\n if (ext === '.rs') {\n const match = line.match(/(?:pub\\s+)?(?:async\\s+)?(?:unsafe\\s+)?fn\\s+([a-zA-Z0-9_$]+)\\s*\\(/);\n return match ? match[1] : null;\n }\n return matchCStyleHeader(line);\n}\n\ninterface ScanResult {\n delta: number;\n nowInBlock: boolean;\n}\n\nfunction handleStringChar(char: string, inString: string | null): { inString: string | null; skip: boolean } {\n if (char === inString) return { inString: null, skip: false };\n return { inString, skip: char === '\\\\' };\n}\n\nfunction handleBlockState(char: string, next: string, inBlock: boolean): { inBlock: boolean; skip: boolean } {\n if (inBlock && char === '*' && next === '/') return { inBlock: false, skip: true };\n return { inBlock, skip: false };\n}\n\nfunction checkCommentOrQuote(\n char: string,\n next: string,\n ext: string\n): { startBlock: boolean; quote: string | null; isLineComment: boolean } {\n if (char === '/' && next === '/') return { startBlock: false, quote: null, isLineComment: true };\n if (char === '/' && next === '*') return { startBlock: true, quote: null, isLineComment: false };\n const isQuote = char === '\"' || char === \"'\" || (char === '`' && ext === '.go');\n return { startBlock: false, quote: isQuote ? char : null, isLineComment: false };\n}\n\nfunction stepSkippedState(\n char: string,\n next: string,\n inBlock: boolean,\n inString: string | null\n): { inBlock: boolean; inString: string | null; skip: boolean; handled: boolean } {\n if (inBlock) {\n const res = handleBlockState(char, next, inBlock);\n return { inBlock: res.inBlock, inString, skip: res.skip, handled: true };\n }\n if (inString) {\n const res = handleStringChar(char, inString);\n return { inBlock, inString: res.inString, skip: res.skip, handled: true };\n }\n return { inBlock, inString, skip: false, handled: false };\n}\n\nfunction checkCodeChar(\n char: string,\n next: string,\n ext: string\n): { delta: number; startBlock: boolean; quote: string | null; stop: boolean } {\n const trigger = checkCommentOrQuote(char, next, ext);\n if (trigger.isLineComment) return { delta: 0, startBlock: false, quote: null, stop: true };\n if (trigger.startBlock) return { delta: 0, startBlock: true, quote: null, stop: false };\n if (trigger.quote) return { delta: 0, startBlock: false, quote: trigger.quote, stop: false };\n const delta = char === '{' ? 1 : char === '}' ? -1 : 0;\n return { delta, startBlock: false, quote: null, stop: false };\n}\n\nfunction applyCodeChar(\n res: { delta: number; startBlock: boolean; quote: string | null; stop: boolean },\n state: { delta: number; inBlock: boolean; inString: string | null }\n): { advance: number; stop: boolean } {\n if (res.stop) return { advance: 0, stop: true };\n if (res.startBlock) {\n state.inBlock = true;\n return { advance: 1, stop: false };\n }\n if (res.quote) {\n state.inString = res.quote;\n return { advance: 0, stop: false };\n }\n state.delta += res.delta;\n return { advance: 0, stop: false };\n}\n\nfunction scanBracesInLine(line: string, wasInBlock: boolean, ext: string): ScanResult {\n const state = { delta: 0, inBlock: wasInBlock, inString: null as string | null };\n\n for (let j = 0; j < line.length; j++) {\n const char = line[j];\n const next = j + 1 < line.length ? line[j + 1] : '';\n\n const skipped = stepSkippedState(char, next, state.inBlock, state.inString);\n if (skipped.handled) {\n state.inBlock = skipped.inBlock;\n state.inString = skipped.inString;\n if (skipped.skip) j++;\n continue;\n }\n\n const res = checkCodeChar(char, next, ext);\n const step = applyCodeChar(res, state);\n if (step.stop) break;\n j += step.advance;\n }\n\n return { delta: state.delta, nowInBlock: state.inBlock };\n}\n\nfunction buildMetricsFromBlocks(blocks: RawFunctionBlock[], content: string, filePath: string): FunctionMetrics[] {\n if (blocks.length === 0) {\n return [calculatePolyglotMetrics(content, 'main_module', filePath)];\n }\n return blocks.map((b) => calculatePolyglotMetrics(b.body, b.name, filePath));\n}\n\nfunction detectPolyglotSmells(body: string, loc: number): string[] {\n const smells: string[] = [];\n if (/#\\s*noqa|#\\s*type:\\s*ignore|@SuppressWarnings/.test(body)) {\n smells.push('Supresión no autorizada de linter');\n }\n if (loc > 40) {\n smells.push(`Función extensa (${loc} líneas > límite 40)`);\n }\n return smells;\n}\n\nfunction computeHalsteadMI(body: string, cyclomatic: number, loc: number, commentCount: number): number {\n const cleanText = body.replace(/\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*|#.*/g, '');\n const tokens = cleanText.split(/[\\s,;().{}[\\]=+\\-*/<>!&|:]+/).filter((t) => t.length > 0);\n const N = tokens.length || 1;\n const n = new Set(tokens).size || 1;\n const V = Math.max(1, N * Math.log2(Math.max(2, n)));\n\n const totalLines = loc + commentCount;\n const perCM = totalLines > 0 ? commentCount / totalLines : 0;\n const commentWeight = 50 * Math.sin(Math.sqrt(2.4 * perCM));\n\n const rawMI = 171 - 5.2 * Math.log(V) - 0.23 * cyclomatic - 16.2 * Math.log(loc) + commentWeight;\n return Math.round(Math.max(0, Math.min(100, (rawMI * 100) / 171)) * 10) / 10;\n}\n\nfunction isCommentLine(line: string, isPy: boolean): boolean {\n return isPy\n ? line.startsWith('#') || line.startsWith('\"\"\"') || line.startsWith(\"'''\")\n : line.startsWith('//') || line.startsWith('/*') || line.startsWith('*');\n}\n\nfunction countCommentsAndLoc(rawLines: string[], isPy: boolean): { loc: number; commentCount: number; cleanLines: string[] } {\n const commentCount = rawLines.filter((l) => isCommentLine(l, isPy)).length;\n const loc = Math.max(1, rawLines.length - commentCount);\n const cleanLines = rawLines.filter((l) => !isCommentLine(l, isPy));\n return { loc, commentCount, cleanLines };\n}\n\nfunction calculatePolyglotMetrics(body: string, name: string, filePath: string): FunctionMetrics {\n const ext = path.extname(filePath).toLowerCase();\n const rawLines = body.split(/\\r?\\n/).map((l) => l.trim()).filter((l) => l.length > 0);\n const { loc, commentCount, cleanLines } = countCommentsAndLoc(rawLines, ext === '.py');\n\n const cyclomatic = computePolyglotCyclomatic(body, ext);\n const cognitive = computePolyglotCognitive(cleanLines, ext === '.py');\n const maintainability = computeHalsteadMI(body, cyclomatic, loc, commentCount);\n\n return {\n functionName: name,\n filePath,\n loc,\n cyclomatic,\n cognitive,\n maintainability,\n codeSmells: detectPolyglotSmells(body, loc),\n };\n}\n\nfunction computePolyglotCyclomatic(body: string, ext: string): number {\n let regex: RegExp;\n if (ext === '.py') {\n regex = /\\b(if|elif|for|while|except)\\b|\\b(and|or)\\b/g;\n } else if (ext === '.go') {\n regex = /\\b(if|for|case|select)\\b|&&|\\|\\|/g;\n } else if (ext === '.rs') {\n regex = /\\b(if|for|while|match)\\b|&&|\\|\\||\\?/g;\n } else {\n regex = /\\b(if|else\\s+if|for|while|catch|case)\\b|\\?|&&|\\|\\|/g;\n }\n const cleanBody = body.replace(/\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'/g, '');\n const matches = cleanBody.match(regex);\n return 1 + (matches ? matches.length : 0);\n}\n\nfunction computePolyglotCognitive(lines: string[], isPy: boolean): number {\n let cognitive = 0;\n let nesting = 0;\n\n for (const line of lines) {\n if (isPy) {\n const indent = line.length - line.trimStart().length;\n if (/\\b(if|elif|for|while|except)\\b/.test(line)) {\n cognitive += 1 + Math.floor(indent / 4);\n }\n } else {\n if (line.includes('{')) nesting++;\n if (line.includes('}')) nesting = Math.max(0, nesting - 1);\n if (/\\b(if|for|while|catch|match|select)\\b/.test(line)) {\n cognitive += 1 + nesting;\n }\n }\n }\n\n return cognitive;\n}\n","/**\n * AI-SDLC: Deterministic Quality Gate Engine (Polyglot Support)\n * Uses modern AST static analysis with zero legacy heuristics.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n AnalysisResult,\n FunctionMetrics,\n QualityGateOptions,\n QualityGateResult,\n QualityPolicy,\n QualityThresholds,\n} from '../types/index.js';\nimport { extractFunctionsTypeScriptAst } from './ast/typescript-ast.js';\nimport { extractFunctionsPolyglot } from './ast/polyglot-scanner.js';\n\nexport const DEFAULT_EXTENSIONS: readonly string[] = [\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.py',\n '.java',\n '.go',\n '.cs',\n '.rs',\n '.cpp',\n '.c',\n];\n\nexport const DEFAULT_EXCLUDES: readonly string[] = [\n 'node_modules',\n '__pycache__',\n '.pytest_cache',\n 'target',\n 'bin',\n 'obj',\n '.git',\n 'reports',\n 'dist',\n '.changeset',\n];\n\nconst TS_JS_EXTENSIONS: readonly string[] = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'];\n\nexport function createDefaultQualityPolicy(): QualityPolicy {\n return {\n max_cyclomatic: 10,\n max_cognitive: 15,\n min_maintainability: 50.0,\n max_function_lines: 40,\n enforce_mode: 'STRICT',\n target_directories: ['src', 'lib', 'examples', 'tests'],\n supported_extensions: [...DEFAULT_EXTENSIONS],\n exclude_patterns: [...DEFAULT_EXCLUDES],\n };\n}\n\nfunction applyDocScope(policy: QualityPolicy, doc: Record<string, unknown>): void {\n if (typeof doc.enforcement_mode === 'string') policy.enforce_mode = doc.enforcement_mode;\n if (!doc.scope || typeof doc.scope !== 'object') return;\n const scope = doc.scope as Record<string, unknown>;\n\n if (Array.isArray(scope.target_directories)) {\n policy.target_directories = scope.target_directories.map(String);\n }\n if (Array.isArray(scope.supported_extensions)) {\n policy.supported_extensions = scope.supported_extensions.map(String);\n }\n if (Array.isArray(scope.exclude_patterns)) {\n for (const pat of scope.exclude_patterns) {\n const p = String(pat);\n if (!policy.exclude_patterns.includes(p)) policy.exclude_patterns.push(p);\n }\n }\n}\n\nfunction applyDocThresholds(policy: QualityPolicy, doc: Record<string, unknown>): void {\n const sections = [doc.release_thresholds, doc.thresholds].filter(\n (s): s is Record<string, unknown> => Boolean(s && typeof s === 'object')\n );\n\n for (const s of sections) {\n const cc = (s.cyclomatic_complexity as Record<string, unknown>)?.max_per_function;\n const cog = (s.cognitive_complexity as Record<string, unknown>)?.max_per_function;\n const mi = (s.maintainability_index as Record<string, unknown>)?.min_acceptable_score;\n const loc = (s.function_length as Record<string, unknown>)?.max_function_lines;\n\n if (cc !== undefined) policy.max_cyclomatic = Number(cc);\n if (cog !== undefined) policy.max_cognitive = Number(cog);\n if (mi !== undefined) policy.min_maintainability = Number(mi);\n if (loc !== undefined) policy.max_function_lines = Number(loc);\n }\n\n const codingRules = doc.coding_rules as Record<string, unknown> | undefined;\n const rules = codingRules?.rules as Record<string, unknown> | undefined;\n if (rules?.max_function_lines !== undefined) {\n policy.max_function_lines = Number(rules.max_function_lines);\n }\n}\n\nfunction applyEnvThresholds(policy: QualityPolicy): void {\n if (typeof process === 'undefined' || !process.env) return;\n const env = process.env;\n\n if (env.AI_SDLC_MAX_CYCLOMATIC) policy.max_cyclomatic = parseInt(env.AI_SDLC_MAX_CYCLOMATIC, 10);\n if (env.AI_SDLC_MAX_COGNITIVE) policy.max_cognitive = parseInt(env.AI_SDLC_MAX_COGNITIVE, 10);\n if (env.AI_SDLC_MIN_MAINTAINABILITY) policy.min_maintainability = parseFloat(env.AI_SDLC_MIN_MAINTAINABILITY);\n if (env.AI_SDLC_MAX_FUNCTION_LINES) policy.max_function_lines = parseInt(env.AI_SDLC_MAX_FUNCTION_LINES, 10);\n if (env.AI_SDLC_ENFORCE_MODE) policy.enforce_mode = env.AI_SDLC_ENFORCE_MODE;\n}\n\nfunction applyOptionOverrides(policy: QualityPolicy, overrides?: QualityThresholds): void {\n if (!overrides) return;\n if (overrides.max_cyclomatic !== undefined) policy.max_cyclomatic = Number(overrides.max_cyclomatic);\n if (overrides.max_cognitive !== undefined) policy.max_cognitive = Number(overrides.max_cognitive);\n if (overrides.min_maintainability !== undefined) policy.min_maintainability = Number(overrides.min_maintainability);\n if (overrides.max_function_lines !== undefined) policy.max_function_lines = Number(overrides.max_function_lines);\n if (overrides.enforce_mode !== undefined) policy.enforce_mode = overrides.enforce_mode;\n}\n\nexport function parseQualityPolicy(content: string, overrides?: QualityThresholds): QualityPolicy {\n const policy = createDefaultQualityPolicy();\n try {\n const doc = yaml.load(content);\n if (doc && typeof doc === 'object') {\n const record = doc as Record<string, unknown>;\n applyDocScope(policy, record);\n applyDocThresholds(policy, record);\n if (record.max_per_function !== undefined) policy.max_cyclomatic = Number(record.max_per_function);\n if (record.min_acceptable_score !== undefined) policy.min_maintainability = Number(record.min_acceptable_score);\n if (record.max_function_lines !== undefined) policy.max_function_lines = Number(record.max_function_lines);\n }\n } catch {\n // Keep defaults on YAML error\n }\n applyEnvThresholds(policy);\n applyOptionOverrides(policy, overrides);\n return policy;\n}\n\nexport function extractFunctions(content: string, filePath: string): FunctionMetrics[] {\n const ext = path.extname(filePath).toLowerCase();\n return TS_JS_EXTENSIONS.includes(ext)\n ? extractFunctionsTypeScriptAst(content, filePath)\n : extractFunctionsPolyglot(content, filePath);\n}\n\nexport function extractFunctionsBraceLanguages(content: string, filePath: string): FunctionMetrics[] {\n return extractFunctions(content, filePath);\n}\n\nexport function extractFunctionsPython(content: string, filePath: string): FunctionMetrics[] {\n return extractFunctionsPolyglot(content, filePath);\n}\n\nexport function calculateMetrics(fnBody: string, fnName: string, filePath: string): FunctionMetrics {\n const functions = extractFunctions(fnBody, filePath);\n if (functions.length > 0) {\n const matched = functions.find((f) => f.functionName === fnName) || functions[0];\n return { ...matched, functionName: fnName };\n }\n return {\n functionName: fnName,\n filePath,\n loc: 1,\n cyclomatic: 1,\n cognitive: 0,\n maintainability: 100,\n codeSmells: [],\n };\n}\n\nexport function walkDir(\n dir: string,\n extensions: readonly string[] = DEFAULT_EXTENSIONS,\n excludePatterns: readonly string[] = DEFAULT_EXCLUDES\n): string[] {\n let results: string[] = [];\n if (!fs.existsSync(dir)) return results;\n const list = fs.readdirSync(dir);\n for (const file of list) {\n const fullPath = path.join(dir, file);\n const stat = fs.statSync(fullPath);\n if (stat && stat.isDirectory()) {\n if (!excludePatterns.some((pattern) => file === pattern || fullPath.includes(pattern))) {\n results = results.concat(walkDir(fullPath, extensions, excludePatterns));\n }\n } else {\n const ext = path.extname(file).toLowerCase();\n if (extensions.includes(ext)) {\n results.push(fullPath);\n }\n }\n }\n return results;\n}\n\nfunction resolvePolicy(rootDir: string, options: QualityGateOptions): QualityPolicy {\n const policyFile = options.policyPath || path.join(rootDir, 'quality-policy.yaml');\n if (options.policy) {\n const policy = { ...options.policy };\n applyOptionOverrides(policy, options.thresholds);\n return policy;\n }\n if (fs.existsSync(policyFile)) {\n return parseQualityPolicy(fs.readFileSync(policyFile, 'utf-8'), options.thresholds);\n }\n return parseQualityPolicy('', options.thresholds);\n}\n\nfunction collectFilesToScan(rootDir: string, policy: QualityPolicy): string[] {\n const files: string[] = [];\n for (const targetDir of policy.target_directories) {\n const fullDir = path.join(rootDir, targetDir);\n if (fs.existsSync(fullDir)) {\n files.push(...walkDir(fullDir, policy.supported_extensions, policy.exclude_patterns));\n }\n }\n return files;\n}\n\nfunction evaluateViolations(fn: FunctionMetrics, policy: QualityPolicy): string[] {\n const violations: string[] = [];\n if (fn.cyclomatic > policy.max_cyclomatic) {\n violations.push(`Cyclomatic Complexity ${fn.cyclomatic} exceeds threshold of ${policy.max_cyclomatic}`);\n }\n if (fn.cognitive > policy.max_cognitive) {\n violations.push(`Cognitive Complexity ${fn.cognitive} exceeds threshold of ${policy.max_cognitive}`);\n }\n if (fn.maintainability < policy.min_maintainability) {\n violations.push(`Maintainability Index ${fn.maintainability} below minimum of ${policy.min_maintainability}`);\n }\n if (fn.loc > policy.max_function_lines) {\n violations.push(`Function lines ${fn.loc} exceeds maximum of ${policy.max_function_lines}`);\n }\n if (fn.codeSmells.length > 0) {\n violations.push(...fn.codeSmells);\n }\n return violations;\n}\n\nfunction evaluateFileQuality(file: string, rootDir: string, policy: QualityPolicy): AnalysisResult[] {\n const content = fs.readFileSync(file, 'utf-8');\n const fns = extractFunctions(content, file);\n return fns.map((fn) => {\n const violations = evaluateViolations(fn, policy);\n return {\n ...fn,\n relPath: path.relative(rootDir, file).replace(/\\\\/g, '/'),\n status: violations.length === 0 ? 'PASS' : 'FAIL',\n violations,\n };\n });\n}\n\nfunction buildQualityGateResult(\n results: AnalysisResult[],\n totalFiles: number,\n policy: QualityPolicy\n): QualityGateResult {\n const failCount = results.filter((r) => r.status === 'FAIL').length;\n const passCount = results.length - failCount;\n const violationsCount = results.reduce((acc, r) => acc + r.violations.length, 0);\n const success = policy.enforce_mode === 'STRICT' ? failCount === 0 : true;\n\n return {\n success,\n totalFiles,\n totalFunctions: results.length,\n passCount,\n failCount,\n violationsCount,\n results,\n policy,\n };\n}\n\nexport function verifyQualityGate(options: QualityGateOptions = {}): QualityGateResult {\n const rootDir = options.rootDir || process.cwd();\n const policy = resolvePolicy(rootDir, options);\n const allFiles = collectFilesToScan(rootDir, policy);\n const results: AnalysisResult[] = [];\n\n for (const file of allFiles) {\n try {\n results.push(...evaluateFileQuality(file, rootDir, policy));\n } catch {\n // Gracefully ignore unparseable files\n }\n }\n\n return buildQualityGateResult(results, allFiles.length, policy);\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nexport function walkMdFiles(\n dir: string,\n fileList: string[] = [],\n excludeDirs: string[] = [\n 'node_modules',\n '.git',\n 'dist',\n '.changeset',\n 'scratch',\n 'test-scaffold',\n 'fixtures',\n 'templates',\n 'examples',\n '.agent',\n '.agents',\n '.claude',\n '.cursor',\n '.github',\n '.vscode',\n ]\n): string[] {\n try {\n if (!fs.existsSync(dir)) return fileList;\n const files = fs.readdirSync(dir);\n for (const file of files) {\n const fullPath = path.join(dir, file);\n try {\n if (fs.statSync(fullPath).isDirectory()) {\n if (!excludeDirs.includes(file) && !file.startsWith('temp-') && !file.startsWith('.temp-')) {\n walkMdFiles(fullPath, fileList, excludeDirs);\n }\n } else if (file.endsWith('.md')) {\n fileList.push(fullPath);\n }\n } catch {\n // Ignore files unlinked concurrently\n }\n }\n } catch {\n // Ignore directories removed concurrently\n }\n return fileList;\n}\n","/**\n * AI-SDLC: Automated Gherkin to Cucumber (.feature) Extraction Engine\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {\n ExtractedFeature,\n GherkinExtractionOptions,\n GherkinExtractionResult,\n GherkinSyncCheckResult,\n} from '../types/index.js';\nimport { walkMdFiles } from '../utils/fs.js';\n\ninterface MarkdownFrontmatter {\n id?: string;\n version?: string;\n 'cucumber-feature-file'?: string;\n [key: string]: string | undefined;\n}\n\nexport function parseMarkdownFrontmatter(content: string): {\n frontmatter: MarkdownFrontmatter;\n body: string;\n} {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return { frontmatter: {}, body: content };\n\n const yamlLines = match[1].split('\\n');\n const frontmatter: MarkdownFrontmatter = {};\n\n for (const line of yamlLines) {\n const parts = line.split(':');\n if (parts.length >= 2) {\n const key = parts[0].trim();\n let val = parts.slice(1).join(':').trim();\n if ((val.startsWith('\"') && val.endsWith('\"')) || (val.startsWith(\"'\") && val.endsWith(\"'\"))) {\n val = val.substring(1, val.length - 1);\n }\n frontmatter[key] = val;\n }\n }\n\n const body = content.substring(match[0].length);\n return { frontmatter, body };\n}\n\nexport function extractGherkinBlock(body: string): string[] {\n const gherkinRegex = /```gherkin\\r?\\n([\\s\\S]*?)\\r?\\n```/g;\n const blocks: string[] = [];\n let match: RegExpExecArray | null;\n while ((match = gherkinRegex.exec(body)) !== null) {\n blocks.push(match[1].trim());\n }\n return blocks;\n}\n\nexport function resolveTargetFiles(rootDir: string, targetPath?: string): string[] {\n if (targetPath) {\n const fullTarget = path.isAbsolute(targetPath) ? targetPath : path.join(rootDir, targetPath);\n if (!fs.existsSync(fullTarget)) return [];\n return fs.statSync(fullTarget).isDirectory() ? walkMdFiles(fullTarget) : [fullTarget];\n }\n const searchDirs = [\n path.join(rootDir, 'product'),\n path.join(rootDir, 'security'),\n path.join(rootDir, 'specs'),\n path.join(rootDir, 'examples', 'product'),\n path.join(rootDir, 'examples', 'security'),\n path.join(rootDir, 'examples', 'specs'),\n ];\n return searchDirs.filter((d) => fs.existsSync(d)).flatMap((d) => walkMdFiles(d));\n}\n\nexport function resolveFeatureFilePath(\n rootDir: string,\n filePath: string,\n id: string,\n customTarget?: string\n): string {\n if (customTarget) {\n return path.isAbsolute(customTarget) ? customTarget : path.join(rootDir, customTarget);\n }\n const baseDir = path.join(rootDir, 'tests', 'features');\n const candidateSecurity = path.join(baseDir, 'security', `${id.toLowerCase()}.feature`);\n const candidateRoot = path.join(baseDir, `${id.toLowerCase()}.feature`);\n if (fs.existsSync(candidateSecurity)) return candidateSecurity;\n if (fs.existsSync(candidateRoot)) return candidateRoot;\n const subDir = filePath.includes('security') ? 'security' : '';\n return path.join(baseDir, subDir, `${id.toLowerCase()}.feature`);\n}\n\nexport function buildFeatureFileContent(\n rootDir: string,\n filePath: string,\n id: string,\n version: string | undefined,\n gherkinBlocks: string[]\n): string {\n const banner = [\n `# ==============================================================================`,\n `# AUTO-GENERADO POR AI-SDLC (Cucumber Integration)`,\n `# Origen: ${path.relative(rootDir, filePath).replace(/\\\\/g, '/')}`,\n `# ID Requerimiento: ${id}`,\n `# Versión: ${version || '1.0.0'}`,\n `# NO EDITAR MANUALMENTE: Cualquier cambio debe realizarse en el Markdown origen.`,\n `# ==============================================================================`,\n '',\n '',\n ].join('\\n');\n return banner + gherkinBlocks.join('\\n\\n') + '\\n';\n}\n\nfunction countScenarios(gherkinBlocks: string[]): number {\n let count = 0;\n for (const block of gherkinBlocks) {\n const matches = block.match(/\\b(Scenario|Escenario|Scenario Outline|Esquema del escenario):/g);\n if (matches) count += matches.length;\n }\n return count;\n}\n\nexport function extractGherkinFeatures(\n options: GherkinExtractionOptions = {}\n): GherkinExtractionResult {\n const rootDir = options.rootDir || process.cwd();\n const features: ExtractedFeature[] = [];\n let totalScenarios = 0;\n const targetFiles = resolveTargetFiles(rootDir, options.targetPath);\n\n for (const filePath of targetFiles) {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const { frontmatter, body } = parseMarkdownFrontmatter(content);\n const gherkinBlocks = extractGherkinBlock(body);\n if (gherkinBlocks.length === 0) continue;\n\n const id = frontmatter.id || path.basename(filePath, path.extname(filePath));\n const targetPath = resolveFeatureFilePath(rootDir, filePath, id, frontmatter['cucumber-feature-file']);\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\n\n const fullContent = buildFeatureFileContent(rootDir, filePath, id, frontmatter.version, gherkinBlocks);\n fs.writeFileSync(targetPath, fullContent, 'utf-8');\n\n const scenarioCount = countScenarios(gherkinBlocks);\n totalScenarios += scenarioCount;\n features.push({\n sourceFile: path.relative(rootDir, filePath).replace(/\\\\/g, '/'),\n outputFile: path.relative(rootDir, targetPath).replace(/\\\\/g, '/'),\n featureName: id,\n scenarioCount,\n });\n } catch {\n // Ignore unparseable files\n }\n }\n\n return { success: true, features, totalScenarios };\n}\n\nexport function checkGherkinInSync(\n options: GherkinExtractionOptions = {}\n): GherkinSyncCheckResult {\n const rootDir = options.rootDir || process.cwd();\n const targetFiles = resolveTargetFiles(rootDir, options.targetPath);\n const outOfSyncFiles: string[] = [];\n const missingFiles: string[] = [];\n let totalFeatures = 0;\n\n for (const filePath of targetFiles) {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const { frontmatter, body } = parseMarkdownFrontmatter(content);\n const gherkinBlocks = extractGherkinBlock(body);\n if (gherkinBlocks.length === 0) continue;\n\n totalFeatures++;\n const id = frontmatter.id || path.basename(filePath, path.extname(filePath));\n const targetPath = resolveFeatureFilePath(rootDir, filePath, id, frontmatter['cucumber-feature-file']);\n const relTarget = path.relative(rootDir, targetPath).replace(/\\\\/g, '/');\n\n if (!fs.existsSync(targetPath)) {\n missingFiles.push(relTarget);\n continue;\n }\n\n const expectedContent = buildFeatureFileContent(rootDir, filePath, id, frontmatter.version, gherkinBlocks);\n const actualContent = fs.readFileSync(targetPath, 'utf-8');\n if (actualContent.replace(/\\r\\n/g, '\\n') !== expectedContent.replace(/\\r\\n/g, '\\n')) {\n outOfSyncFiles.push(relTarget);\n }\n } catch {\n // Ignore unparseable files\n }\n }\n\n return {\n inSync: missingFiles.length === 0 && outOfSyncFiles.length === 0,\n outOfSyncFiles,\n missingFiles,\n totalFeatures,\n };\n}\n","/**\n * AI-SDLC: OpenSpec SDD Adapter\n * Manages OpenSpec change workspaces and deposits Product Handoff sidecars (HOF-*).\n * Aligns with @prodshape/integration-openspec.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport { ChangeProfile, ProductHandoff, SddValidationResult, SddWorkspaceInfo } from '../../types/index.js';\nimport { extractGherkinBlock } from '../../verifiers/gherkin.js';\nimport { SddAdapter } from './types.js';\n\nexport class OpenSpecAdapter implements SddAdapter {\n readonly framework = 'openspec' as const;\n\n getChangeWorkspaceDir(rootDir: string, changeId: string): string {\n // 1. Check for standard openspec path: openspec/changes/<changeId>\n const openspecDir = path.join(rootDir, 'openspec', 'changes', changeId);\n if (fs.existsSync(openspecDir)) return openspecDir;\n\n // 2. Check for AI-SDLC active change path: specs/changes/active/<changeId>\n const activeChangeDir = path.join(rootDir, 'specs', 'changes', 'active', changeId);\n if (fs.existsSync(activeChangeDir)) return activeChangeDir;\n\n // 3. Check for AI-SDLC completed change path: specs/changes/completed/<changeId>\n const completedChangeDir = path.join(rootDir, 'specs', 'changes', 'completed', changeId);\n if (fs.existsSync(completedChangeDir)) return completedChangeDir;\n\n // 4. Default: specs/changes/active/<changeId>\n return activeChangeDir;\n }\n\n depositSidecar(options: {\n rootDir: string;\n changeId: string;\n handoff: ProductHandoff;\n format?: 'yaml' | 'json';\n }): string {\n const changeDir = this.getChangeWorkspaceDir(options.rootDir, options.changeId);\n if (!fs.existsSync(changeDir)) {\n fs.mkdirSync(changeDir, { recursive: true });\n }\n\n const handoff = { ...options.handoff };\n if (!handoff.id.startsWith('HOF-')) {\n handoff.id = `HOF-${handoff.id}`;\n }\n if (!handoff.changeId) {\n handoff.changeId = options.changeId;\n }\n if (!handoff.createdAt) {\n handoff.createdAt = new Date().toISOString();\n }\n\n const filename = options.format === 'json' ? 'handoff.json' : 'handoff.yaml';\n const filePath = path.join(changeDir, filename);\n\n const content =\n options.format === 'json'\n ? JSON.stringify(handoff, null, 2)\n : yaml.dump(handoff, { indent: 2, lineWidth: -1 });\n\n fs.writeFileSync(filePath, content, 'utf-8');\n return filePath;\n }\n\n loadSidecar(changeWorkspaceDir: string): ProductHandoff | null {\n if (!fs.existsSync(changeWorkspaceDir)) return null;\n\n const candidateFiles = [\n 'handoff.yaml',\n 'handoff.yml',\n 'product-handoff.yaml',\n 'product-handoff.yml',\n '.handoff.yaml',\n 'handoff.json',\n 'product-handoff.json',\n ];\n\n for (const file of candidateFiles) {\n const fullPath = path.join(changeWorkspaceDir, file);\n if (fs.existsSync(fullPath)) {\n try {\n const raw = fs.readFileSync(fullPath, 'utf-8').replace(/^\\uFEFF/, '');\n const parsed = file.endsWith('.json') ? JSON.parse(raw) : (yaml.load(raw) as any);\n if (parsed && typeof parsed === 'object' && parsed.id && String(parsed.id).startsWith('HOF-')) {\n return parsed as ProductHandoff;\n }\n } catch {\n // Ignore invalid parse attempt, try next\n }\n }\n }\n\n return null;\n }\n\n validateWorkspace(changeWorkspaceDir: string): SddValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!fs.existsSync(changeWorkspaceDir)) {\n return {\n valid: false,\n errors: [`El directorio del cambio OpenSpec no existe: ${changeWorkspaceDir}`],\n warnings: [],\n };\n }\n\n const changeId = path.basename(changeWorkspaceDir);\n\n const proposalFile = path.join(changeWorkspaceDir, 'proposal.md');\n const specFile = path.join(changeWorkspaceDir, 'spec.md');\n const designFile = path.join(changeWorkspaceDir, 'design.md');\n const tasksFile = path.join(changeWorkspaceDir, 'tasks.md');\n\n let profile: ChangeProfile = 'standard';\n if (fs.existsSync(specFile)) {\n try {\n const rawSpec = fs.readFileSync(specFile, 'utf-8').replace(/^\\uFEFF/, '');\n const match = rawSpec.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (match) {\n const parsedFm = yaml.load(match[1]) as any;\n if (parsedFm && parsedFm.profile && ['patch', 'standard', 'critical'].includes(parsedFm.profile)) {\n profile = parsedFm.profile as ChangeProfile;\n }\n }\n } catch {\n // ignore parse error\n }\n }\n\n if (!fs.existsSync(specFile)) {\n errors.push(`Falta el archivo obligatorio 'spec.md' en ${changeWorkspaceDir}.`);\n } else {\n try {\n const rawSpec = fs.readFileSync(specFile, 'utf-8').replace(/^\\uFEFF/, '');\n const match = rawSpec.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (match) {\n const parsedFm = yaml.load(match[1]) as any;\n if (parsedFm && parsedFm['acceptance-format'] && parsedFm['acceptance-format'] !== 'gherkin') {\n errors.push(\n `El archivo 'spec.md' declara acceptance-format '${parsedFm['acceptance-format']}', pero el estándar obligatorio es 'gherkin'.`\n );\n }\n if (parsedFm && parsedFm['acceptance-format'] === 'gherkin') {\n const blocks = extractGherkinBlock(rawSpec);\n if (blocks.length === 0) {\n errors.push(\n `El archivo 'spec.md' en ${changeWorkspaceDir} declara 'acceptance-format: gherkin' pero no incluye ningún bloque de especificación ejecutable (\\`\\`\\`gherkin ... \\`\\`\\`).`\n );\n }\n }\n }\n } catch {\n // ignore parse error\n }\n }\n\n let sidecarFile: string | undefined;\n let handoff: ProductHandoff | null = null;\n\n if (profile === 'patch') {\n handoff = this.loadSidecar(changeWorkspaceDir);\n if (handoff) {\n sidecarFile = path.join(changeWorkspaceDir, 'handoff.yaml');\n }\n } else {\n if (!fs.existsSync(proposalFile)) {\n warnings.push(`Falta 'proposal.md' en el espacio de trabajo OpenSpec.`);\n }\n if (!fs.existsSync(tasksFile)) {\n errors.push(`Falta el archivo obligatorio 'tasks.md' en ${changeWorkspaceDir}.`);\n }\n\n handoff = this.loadSidecar(changeWorkspaceDir);\n if (!handoff) {\n errors.push(\n `Falta el archivo de acompañamiento (sidecar) 'handoff.yaml' con identificador 'HOF-*' en ${changeWorkspaceDir}.`\n );\n } else {\n if (!handoff.subgraph || !Array.isArray(handoff.subgraph.requirements)) {\n errors.push(`El sidecar '${handoff.id}' no define un subgrafo de requerimientos válido.`);\n }\n sidecarFile = path.join(changeWorkspaceDir, 'handoff.yaml');\n }\n }\n\n const workspace: SddWorkspaceInfo = {\n framework: this.framework,\n changeId,\n changeDir: changeWorkspaceDir,\n profile,\n proposalFile: fs.existsSync(proposalFile) ? proposalFile : undefined,\n specFile: fs.existsSync(specFile) ? specFile : undefined,\n designFile: fs.existsSync(designFile) ? designFile : undefined,\n tasksFile: fs.existsSync(tasksFile) ? tasksFile : undefined,\n sidecarFile,\n handoff: handoff || undefined,\n };\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n workspace,\n };\n }\n}\n","/**\n * AI-SDLC: Spec Kit SDD Adapter\n * Manages GitHub Spec Kit workspaces and deposits Product Handoff sidecars (HOF-*).\n * Aligns with @prodshape/integration-speckit.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport { ChangeProfile, ProductHandoff, SddValidationResult, SddWorkspaceInfo } from '../../types/index.js';\nimport { extractGherkinBlock } from '../../verifiers/gherkin.js';\nimport { SddAdapter } from './types.js';\n\nexport class SpecKitAdapter implements SddAdapter {\n readonly framework = 'speckit' as const;\n\n getChangeWorkspaceDir(rootDir: string, changeId: string): string {\n // 1. Spec Kit convention: specs/<changeId>\n const standardDir = path.join(rootDir, 'specs', changeId);\n if (fs.existsSync(standardDir)) return standardDir;\n\n // 2. Active changes path: specs/changes/active/<changeId>\n const activeChangeDir = path.join(rootDir, 'specs', 'changes', 'active', changeId);\n if (fs.existsSync(activeChangeDir)) return activeChangeDir;\n\n // 3. Completed changes path: specs/changes/completed/<changeId>\n const completedChangeDir = path.join(rootDir, 'specs', 'changes', 'completed', changeId);\n if (fs.existsSync(completedChangeDir)) return completedChangeDir;\n\n // 4. Default: specs/<changeId>\n return standardDir;\n }\n\n depositSidecar(options: {\n rootDir: string;\n changeId: string;\n handoff: ProductHandoff;\n format?: 'yaml' | 'json';\n }): string {\n const changeDir = this.getChangeWorkspaceDir(options.rootDir, options.changeId);\n if (!fs.existsSync(changeDir)) {\n fs.mkdirSync(changeDir, { recursive: true });\n }\n\n const handoff = { ...options.handoff };\n if (!handoff.id.startsWith('HOF-')) {\n handoff.id = `HOF-${handoff.id}`;\n }\n if (!handoff.changeId) {\n handoff.changeId = options.changeId;\n }\n if (!handoff.createdAt) {\n handoff.createdAt = new Date().toISOString();\n }\n\n const filename = options.format === 'json' ? 'handoff.json' : 'handoff.yaml';\n const filePath = path.join(changeDir, filename);\n\n const content =\n options.format === 'json'\n ? JSON.stringify(handoff, null, 2)\n : yaml.dump(handoff, { indent: 2, lineWidth: -1 });\n\n fs.writeFileSync(filePath, content, 'utf-8');\n\n // Also mirror to .specify/memory/<changeId>.handoff.yaml if .specify/ directory exists\n const specifyMemoryDir = path.join(options.rootDir, '.specify', 'memory');\n if (fs.existsSync(path.join(options.rootDir, '.specify'))) {\n if (!fs.existsSync(specifyMemoryDir)) {\n fs.mkdirSync(specifyMemoryDir, { recursive: true });\n }\n fs.writeFileSync(path.join(specifyMemoryDir, `${options.changeId}.handoff.yaml`), content, 'utf-8');\n }\n\n return filePath;\n }\n\n loadSidecar(changeWorkspaceDir: string): ProductHandoff | null {\n if (!fs.existsSync(changeWorkspaceDir)) return null;\n\n const candidateFiles = [\n 'handoff.yaml',\n 'handoff.yml',\n 'product-handoff.yaml',\n 'product-handoff.yml',\n '.handoff.yaml',\n 'handoff.json',\n ];\n\n for (const file of candidateFiles) {\n const fullPath = path.join(changeWorkspaceDir, file);\n if (fs.existsSync(fullPath)) {\n try {\n const raw = fs.readFileSync(fullPath, 'utf-8').replace(/^\\uFEFF/, '');\n const parsed = file.endsWith('.json') ? JSON.parse(raw) : (yaml.load(raw) as any);\n if (parsed && typeof parsed === 'object' && parsed.id && String(parsed.id).startsWith('HOF-')) {\n return parsed as ProductHandoff;\n }\n } catch {\n // Ignore invalid parse attempt, try next\n }\n }\n }\n\n return null;\n }\n\n validateWorkspace(changeWorkspaceDir: string): SddValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!fs.existsSync(changeWorkspaceDir)) {\n return {\n valid: false,\n errors: [`El directorio del cambio Spec Kit no existe: ${changeWorkspaceDir}`],\n warnings: [],\n };\n }\n\n const changeId = path.basename(changeWorkspaceDir);\n\n const specFile = path.join(changeWorkspaceDir, 'spec.md');\n const planFile = path.join(changeWorkspaceDir, 'plan.md');\n const tasksFile = path.join(changeWorkspaceDir, 'tasks.md');\n\n let profile: ChangeProfile = 'standard';\n if (fs.existsSync(specFile)) {\n try {\n const rawSpec = fs.readFileSync(specFile, 'utf-8').replace(/^\\uFEFF/, '');\n const match = rawSpec.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (match) {\n const parsedFm = yaml.load(match[1]) as any;\n if (parsedFm && parsedFm.profile && ['patch', 'standard', 'critical'].includes(parsedFm.profile)) {\n profile = parsedFm.profile as ChangeProfile;\n }\n }\n } catch {\n // ignore parse error\n }\n }\n\n if (!fs.existsSync(specFile)) {\n errors.push(`Falta el archivo de especificación obligatorio 'spec.md' en ${changeWorkspaceDir}.`);\n } else {\n try {\n const rawSpec = fs.readFileSync(specFile, 'utf-8').replace(/^\\uFEFF/, '');\n const match = rawSpec.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (match) {\n const parsedFm = yaml.load(match[1]) as any;\n if (parsedFm && parsedFm['acceptance-format'] && parsedFm['acceptance-format'] !== 'gherkin') {\n errors.push(\n `El archivo 'spec.md' declara acceptance-format '${parsedFm['acceptance-format']}', pero el estándar obligatorio es 'gherkin'.`\n );\n }\n if (parsedFm && parsedFm['acceptance-format'] === 'gherkin') {\n const blocks = extractGherkinBlock(rawSpec);\n if (blocks.length === 0) {\n errors.push(\n `El archivo 'spec.md' en ${changeWorkspaceDir} declara 'acceptance-format: gherkin' pero no incluye ningún bloque de especificación ejecutable (\\`\\`\\`gherkin ... \\`\\`\\`).`\n );\n }\n }\n }\n } catch {\n // ignore parse error\n }\n }\n\n let sidecarFile: string | undefined;\n let handoff: ProductHandoff | null = null;\n\n if (profile === 'patch') {\n handoff = this.loadSidecar(changeWorkspaceDir);\n if (handoff) {\n sidecarFile = path.join(changeWorkspaceDir, 'handoff.yaml');\n }\n } else {\n if (!fs.existsSync(tasksFile)) {\n errors.push(`Falta el archivo de tareas obligatorio 'tasks.md' en ${changeWorkspaceDir}.`);\n }\n if (!fs.existsSync(planFile)) {\n warnings.push(`Se recomienda incluir 'plan.md' en el espacio de trabajo Spec Kit.`);\n }\n\n handoff = this.loadSidecar(changeWorkspaceDir);\n if (!handoff) {\n errors.push(\n `Falta el archivo de acompañamiento (sidecar) 'handoff.yaml' con identificador 'HOF-*' en ${changeWorkspaceDir}.`\n );\n } else {\n if (!handoff.subgraph || !Array.isArray(handoff.subgraph.requirements)) {\n errors.push(`El sidecar '${handoff.id}' no define un subgrafo de requerimientos válido.`);\n }\n sidecarFile = path.join(changeWorkspaceDir, 'handoff.yaml');\n }\n }\n\n const workspace: SddWorkspaceInfo = {\n framework: this.framework,\n changeId,\n changeDir: changeWorkspaceDir,\n profile,\n specFile: fs.existsSync(specFile) ? specFile : undefined,\n designFile: fs.existsSync(planFile) ? planFile : undefined,\n tasksFile: fs.existsSync(tasksFile) ? tasksFile : undefined,\n sidecarFile,\n handoff: handoff || undefined,\n };\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n workspace,\n };\n }\n}\n","/**\n * AI-SDLC: SDD Change Integration & Canonical Specification Promotion Engine\n * Ensures that changes implemented in SDD workspaces are correctly integrated\n * into canonical specifications (Product, Requirements, and Architecture arc42/NAF v4).\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n ChangeDetectionOptions,\n ChangeDetectionResult,\n ProductHandoff,\n SddIntegrationAudit,\n SddIntegrationOptions,\n SddIntegrationResult,\n} from '../../types/index.js';\nimport { walkMdFiles } from '../../utils/fs.js';\nimport { parseFrontmatter } from '../../verifiers/traceability.js';\nimport { loadProductHandoffSidecar } from './index.js';\n\ninterface TaskParsed {\n id: string;\n title?: string;\n status?: string;\n}\n\nexport function parseTasksFromContent(content: string): TaskParsed[] {\n const tasks: TaskParsed[] = [];\n const { frontmatter } = parseFrontmatter(content);\n\n if (frontmatter && Array.isArray(frontmatter.tasks)) {\n for (const t of frontmatter.tasks as any[]) {\n if (t && typeof t === 'object' && t.id) {\n tasks.push({\n id: String(t.id),\n title: t.title ? String(t.title) : undefined,\n status: t.status ? String(t.status).toUpperCase() : undefined,\n });\n }\n }\n }\n\n // Also match markdown task checkboxes if no frontmatter tasks found\n if (tasks.length === 0) {\n const lines = content.split('\\n');\n let index = 1;\n for (const line of lines) {\n const trimmed = line.trim();\n const match = trimmed.match(/^-\\s+\\[([ xX])\\]\\s+(?:`([^`]+)`\\s*:?\\s*)?(.*)$/);\n if (match) {\n const isDone = match[1].toLowerCase() === 'x';\n const taskId = match[2] || `TSK-${String(index).padStart(3, '0')}`;\n tasks.push({\n id: taskId,\n title: match[3],\n status: isDone ? 'COMPLETED' : 'PENDING',\n });\n index++;\n }\n }\n }\n\n return tasks;\n}\n\nexport function appendRevisionHistoryRow(\n body: string,\n entry: { version: string; date: string; author: string; description: string; reference: string }\n): string {\n // Check if reference already recorded in table\n if (body.includes(entry.reference)) {\n return body;\n }\n\n const tableHeaderMatch = body.match(\n /(\\|\\s*Versi[oó]n\\s*\\|\\s*Fecha\\s*\\|\\s*Autor[^\\n]*\\r?\\n\\|[\\s\\-:|]+\\r?\\n)/i\n );\n\n const newRow = `| **${entry.version}** | ${entry.date} | ${entry.author} | ${entry.description} | ${entry.reference} |\\n`;\n\n if (tableHeaderMatch && tableHeaderMatch.index !== undefined) {\n const insertPos = tableHeaderMatch.index + tableHeaderMatch[0].length;\n return body.substring(0, insertPos) + newRow + body.substring(insertPos);\n }\n\n // If table header not found, append section at the end\n const newSection = `\\n\\n## Historial de Revisiones\\n\\n| Versión | Fecha | Autor / Agente | Descripción del Cambio | Referencia de Cambio (Change/PR) |\\n| :--- | :--- | :--- | :--- | :--- |\\n${newRow}`;\n return body + newSection;\n}\n\n\n// --- Canonical Artifact Materialization ---\n\n\ninterface SpecCatalogNewItem {\n id: string;\n targetDir: string;\n category: string;\n scope: string;\n}\n\ninterface SpecCatalogAffectedItem {\n id: string;\n action: 'MODIFIED' | 'DEPRECATED';\n category: string;\n}\n\nexport interface SpecCatalogScope {\n newItems: SpecCatalogNewItem[];\n affectedItems: SpecCatalogAffectedItem[];\n}\n\n/**\n * Parses a spec.md using the canonical template format to extract:\n * - Section 1.1: existing catalog items that are MODIFIED or DEPRECATED\n * - Section 1.2: new catalog items to be physically materialized\n *\n * Returns empty arrays when the spec uses the simplified format (no 1.1 / 1.2 headings).\n */\nexport function parseSpecCatalogScope(specContent: string): SpecCatalogScope {\n const newItems: SpecCatalogNewItem[] = [];\n const affectedItems: SpecCatalogAffectedItem[] = [];\n\n // Locate section 1.1 and 1.2 blocks by heading\n const section11Match = specContent.match(/###\\s+1\\.1\\s+Affected Existing Catalog Items[^\\n]*\\n([\\s\\S]*?)(?=\\n###\\s+1\\.2|\\n---|\\n##\\s|$)/i);\n const section12Match = specContent.match(/###\\s+1\\.2\\s+New Catalog Items Introduced[^\\n]*\\n([\\s\\S]*?)(?=\\n---|\\n##\\s|\\n###\\s+[^1]|$)/i);\n\n // Parse section 1.1 — table rows: | Category | `ID` | `ACTION` | Description |\n if (section11Match) {\n const tableRows = section11Match[1].split('\\n').filter(l => l.trim().startsWith('|'));\n for (const row of tableRows) {\n // Skip header and separator rows\n if (/^\\|\\s*:?-+:?\\s*\\|/.test(row) || /Catalog Category/.test(row)) continue;\n const cols = row.split('|').map(c => c.trim()).filter(Boolean);\n if (cols.length < 3) continue;\n const rawId = cols[1].replace(/`/g, '').trim();\n const rawAction = cols[2].replace(/`/g, '').trim().toUpperCase();\n if (!rawId || !rawAction) continue;\n if (rawAction === 'MODIFIED' || rawAction === 'DEPRECATED') {\n affectedItems.push({ id: rawId, action: rawAction as 'MODIFIED' | 'DEPRECATED', category: cols[0] });\n }\n }\n }\n\n // Parse section 1.2 — table rows: | Category | `ID` | `target/dir/` | Scope |\n if (section12Match) {\n const tableRows = section12Match[1].split('\\n').filter(l => l.trim().startsWith('|'));\n for (const row of tableRows) {\n if (/^\\|\\s*:?-+:?\\s*\\|/.test(row) || /Catalog Category/.test(row)) continue;\n const cols = row.split('|').map(c => c.trim()).filter(Boolean);\n if (cols.length < 3) continue;\n const rawId = cols[1].replace(/`/g, '').trim();\n const rawDir = cols[2].replace(/`/g, '').trim();\n if (!rawId || !rawDir) continue;\n newItems.push({ id: rawId, targetDir: rawDir, category: cols[0], scope: cols[3] || '' });\n }\n }\n\n return { newItems, affectedItems };\n}\n\n/**\n * Writes a new canonical artifact file with valid frontmatter and empty revision table.\n * Only runs if the target file does not already exist (idempotent).\n */\nfunction materializeCanonicalArtifact(\n rootDir: string,\n item: SpecCatalogNewItem,\n changeId: string,\n author: string,\n date: string\n): string {\n const targetPath = path.join(rootDir, item.targetDir, `${item.id}.md`);\n if (fs.existsSync(targetPath)) return targetPath;\n\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\n\n const typeMap: Record<string, string> = {\n 'product/requirements/': 'requirement',\n 'product/use-cases/': 'use-case',\n 'product/actors/': 'actor',\n 'product/business-rules/': 'business-rule',\n 'product/journeys/': 'journey',\n 'security/requirements/': 'security-requirement',\n 'architecture/': 'component',\n };\n const artifactType = typeMap[item.targetDir] || 'artifact';\n const frontmatter = `id: ${item.id}\\ntype: ${artifactType}\\nstatus: draft\\nversion: \"1.0.0\"\\n`;\n const title = item.scope || item.id;\n const revisionRow = `| **1.0.0** | ${date} | ${author} | Creación inicial desde ${changeId} | ${changeId} |\\n`;\n const body = `# ${item.id}: ${title}\\n\\n## Historial de Revisiones\\n\\n| Versión | Fecha | Autor / Agente | Descripción del Cambio | Referencia de Cambio (Change/PR) |\\n| :--- | :--- | :--- | :--- | :--- |\\n${revisionRow}`;\n\n fs.writeFileSync(targetPath, `---\\n${frontmatter}---\\n${body}`, 'utf-8');\n return targetPath;\n}\n\nexport function findChangeWorkspaceDir(rootDir: string, changeId: string): string | null {\n const candidateDirs = [\n path.join(rootDir, 'specs', 'changes', 'active', changeId),\n path.join(rootDir, 'specs', changeId),\n path.join(rootDir, 'openspec', 'changes', changeId),\n path.join(rootDir, 'specs', 'changes', 'completed', changeId),\n ];\n\n for (const dir of candidateDirs) {\n if (fs.existsSync(dir)) return dir;\n }\n\n return null;\n}\n\nexport function integrateSddChange(options: SddIntegrationOptions): SddIntegrationResult {\n const rootDir = options.rootDir || process.cwd();\n const changeId = options.changeId;\n const author = options.author || 'AI-SDLC Integration Engine';\n const date = options.date || new Date().toISOString().split('T')[0];\n const autoArchive = options.autoArchive !== false;\n\n const errors: string[] = [];\n const updatedProductArtifacts: string[] = [];\n const updatedArchitectureArtifacts: string[] = [];\n\n // 1. Locate change workspace\n const changeDir = findChangeWorkspaceDir(rootDir, changeId);\n if (!changeDir) {\n return {\n success: false,\n changeId,\n completedTasks: [],\n pendingTasks: [],\n integratedRequirements: [],\n updatedProductArtifacts: [],\n updatedArchitectureArtifacts: [],\n archived: false,\n errors: [`No se encontró el espacio de trabajo para el cambio '${changeId}'.`],\n };\n }\n\n // 2. Parse tasks.md to identify implemented vs pending tasks\n const tasksFile = path.join(changeDir, 'tasks.md');\n const allTasks: TaskParsed[] = [];\n if (fs.existsSync(tasksFile)) {\n const tasksContent = fs.readFileSync(tasksFile, 'utf-8');\n allTasks.push(...parseTasksFromContent(tasksContent));\n }\n\n const completedTasks = allTasks.filter((t) => t.status === 'COMPLETED').map((t) => t.id);\n const pendingTasks = allTasks.filter((t) => t.status !== 'COMPLETED').map((t) => t.id);\n\n // Bloquear integración si existen tareas pendientes o no completadas\n if (pendingTasks.length > 0) {\n return {\n success: false,\n changeId,\n completedTasks,\n pendingTasks,\n integratedRequirements: [],\n updatedProductArtifacts: [],\n updatedArchitectureArtifacts: [],\n archived: false,\n errors: [\n `No se puede integrar el cambio '${changeId}' porque existen ${pendingTasks.length} tareas pendientes o bloqueadas (${pendingTasks.join(\n ', '\n )}). Todas las tareas deben estar en estado COMPLETED antes de consolidar en la especificación canónica.`,\n ],\n };\n }\n\n // 3. Load sidecar HOF-* or fallback to proposal citations\n let handoff: ProductHandoff | null = loadProductHandoffSidecar(changeDir);\n\n if (!handoff) {\n // Attempt to extract from proposal.md\n const proposalFile = path.join(changeDir, 'proposal.md');\n if (fs.existsSync(proposalFile)) {\n const propContent = fs.readFileSync(proposalFile, 'utf-8');\n const { frontmatter } = parseFrontmatter(propContent);\n const citations = Array.isArray(frontmatter.citations) ? (frontmatter.citations as any[]) : [];\n const reqs = citations.map((c) => c.id).filter((id: string) => id.startsWith('FR-') || id.startsWith('QR-') || id.startsWith('CON-') || id.startsWith('SEC-REQ-'));\n handoff = {\n id: `HOF-${changeId.toUpperCase()}`,\n type: 'handoff',\n changeId,\n subgraph: {\n requirements: reqs,\n },\n citations,\n };\n }\n }\n\n if (!handoff || !handoff.subgraph) {\n return {\n success: false,\n changeId,\n completedTasks,\n pendingTasks,\n integratedRequirements: [],\n updatedProductArtifacts: [],\n updatedArchitectureArtifacts: [],\n archived: false,\n errors: [`El cambio '${changeId}' no posee un sidecar 'handoff.yaml' ni citaciones válidas en proposal.md.`],\n };\n }\n\n // 4. Determine which requirements are implemented\n // \"integra todo lo implementado\": integrate all requirements declared in the handoff subgraph\n const targetReqs = [\n ...(handoff.subgraph.requirements || []),\n ...(handoff.subgraph.securityRequirements || []),\n ];\n\n // 4.5 Materialize new canonical artifacts declared in spec.md section 1.2\n const createdCanonicalArtifacts: string[] = [];\n const specFile = path.join(changeDir, 'spec.md');\n if (fs.existsSync(specFile)) {\n const specContent = fs.readFileSync(specFile, 'utf-8');\n const { newItems } = parseSpecCatalogScope(specContent);\n for (const item of newItems) {\n try {\n materializeCanonicalArtifact(rootDir, item, changeId, author, date);\n createdCanonicalArtifacts.push(item.id);\n } catch (err: any) {\n errors.push(`Error materializando artefacto canónico '${item.id}': ${err.message}`);\n }\n }\n }\n\n // 5. Scan all markdown files to find canonical target files\n const allMdFiles = walkMdFiles(rootDir);\n const canonicalArtifacts = new Map<string, { file: string; frontmatter: any; body: string }>();\n\n for (const file of allMdFiles) {\n const relFile = path.relative(rootDir, file).replace(/\\\\/g, '/');\n // Skip change folders and templates\n if (relFile.includes('specs/changes/') || relFile.includes('templates/')) continue;\n\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const { frontmatter, body } = parseFrontmatter(content);\n if (frontmatter.id) {\n canonicalArtifacts.set(String(frontmatter.id), { file, frontmatter, body });\n }\n } catch {\n // Ignore\n }\n }\n\n // 6. Integrate Product & Requirements Artifacts\n for (const reqId of targetReqs) {\n if (createdCanonicalArtifacts.includes(reqId)) continue; // newly materialized — leave as draft\n const canonical = canonicalArtifacts.get(reqId);\n if (canonical) {\n try {\n const fm = canonical.frontmatter;\n let modified = false;\n\n if (fm.status !== 'active') {\n fm.status = 'active';\n modified = true;\n }\n\n const taskDesc =\n completedTasks.length > 0\n ? `Implementación verificada (${completedTasks.join(', ')})`\n : `Integración de especificación`;\n\n const updatedBody = appendRevisionHistoryRow(canonical.body, {\n version: String(fm.version || '1.0.0'),\n date,\n author,\n description: taskDesc,\n reference: changeId,\n });\n\n if (updatedBody !== canonical.body || modified) {\n const yamlHeader = `---\\n${yaml.dump(fm, { indent: 2, lineWidth: -1 }).trim()}\\n---\\n`;\n fs.writeFileSync(canonical.file, yamlHeader + updatedBody, 'utf-8');\n updatedProductArtifacts.push(reqId);\n }\n } catch (err: any) {\n errors.push(`Error actualizando artefacto canónico '${reqId}': ${err.message}`);\n }\n }\n }\n\n // 7. Integrate Architecture Components & Views (arc42 / NAF v4)\n // Identify cited architecture components in handoff or proposal\n const citedComponents: string[] = [];\n if (handoff.citations) {\n for (const c of handoff.citations) {\n const citeId = (c as any).targetId || (c as any).id;\n if (\n citeId &&\n (citeId.startsWith('CMP-') ||\n citeId.startsWith('SEC-ENC-') ||\n citeId.startsWith('ADR-'))\n ) {\n citedComponents.push(citeId);\n }\n }\n }\n\n // If no components cited directly in citations, search canonical components that implement target requirements\n for (const [artId, art] of canonicalArtifacts.entries()) {\n if (artId.startsWith('CMP-') && art.frontmatter) {\n const satisfies = Array.isArray(art.frontmatter['satisfies-requirements'])\n ? (art.frontmatter['satisfies-requirements'] as string[])\n : [];\n if (targetReqs.some((r) => satisfies.includes(r))) {\n if (!citedComponents.includes(artId)) citedComponents.push(artId);\n }\n }\n }\n\n for (const cmpId of citedComponents) {\n const canonical = canonicalArtifacts.get(cmpId);\n if (canonical) {\n try {\n const fm = canonical.frontmatter;\n let modified = false;\n\n // Ensure satisfies-requirements includes target requirements\n if (cmpId.startsWith('CMP-')) {\n const existingSatisfies = Array.isArray(fm['satisfies-requirements'])\n ? [...fm['satisfies-requirements']]\n : [];\n for (const req of targetReqs) {\n if (!existingSatisfies.includes(req)) {\n existingSatisfies.push(req);\n modified = true;\n }\n }\n fm['satisfies-requirements'] = existingSatisfies;\n }\n\n const updatedBody = appendRevisionHistoryRow(canonical.body, {\n version: String(fm.version || '1.0.0'),\n date,\n author,\n description: `Integración de incremento de entrega ${changeId}`,\n reference: changeId,\n });\n\n if (updatedBody !== canonical.body || modified) {\n const yamlHeader = `---\\n${yaml.dump(fm, { indent: 2, lineWidth: -1 }).trim()}\\n---\\n`;\n fs.writeFileSync(canonical.file, yamlHeader + updatedBody, 'utf-8');\n updatedArchitectureArtifacts.push(cmpId);\n }\n } catch (err: any) {\n errors.push(`Error actualizando componente de arquitectura '${cmpId}': ${err.message}`);\n }\n }\n }\n\n // 8. Archiving / Promotion of Change Workspace\n let archived = false;\n let archivedPath: string | undefined;\n\n const isActiveFolder = changeDir.includes('specs' + path.sep + 'changes' + path.sep + 'active');\n const allTasksCompleted = allTasks.length > 0 && pendingTasks.length === 0;\n\n if (allTasksCompleted && autoArchive && isActiveFolder) {\n const completedParent = path.join(rootDir, 'specs', 'changes', 'completed');\n if (!fs.existsSync(completedParent)) {\n fs.mkdirSync(completedParent, { recursive: true });\n }\n\n const destDir = path.join(completedParent, changeId);\n if (fs.existsSync(destDir)) {\n fs.rmSync(destDir, { recursive: true, force: true });\n }\n\n // Move folder\n fs.renameSync(changeDir, destDir);\n archived = true;\n archivedPath = destDir;\n\n // Update proposal.md status to applied\n const destProposal = path.join(destDir, 'proposal.md');\n if (fs.existsSync(destProposal)) {\n const content = fs.readFileSync(destProposal, 'utf-8');\n const { frontmatter, body } = parseFrontmatter(content);\n frontmatter.status = 'applied';\n const newContent = `---\\n${yaml.dump(frontmatter, { indent: 2, lineWidth: -1 }).trim()}\\n---\\n` + body;\n fs.writeFileSync(destProposal, newContent, 'utf-8');\n }\n } else {\n // Update proposal status or add integration note\n const proposalFile = path.join(changeDir, 'proposal.md');\n if (fs.existsSync(proposalFile)) {\n const content = fs.readFileSync(proposalFile, 'utf-8');\n const { frontmatter, body } = parseFrontmatter(content);\n if (allTasksCompleted) {\n frontmatter.status = 'completed';\n }\n const newContent = `---\\n${yaml.dump(frontmatter, { indent: 2, lineWidth: -1 }).trim()}\\n---\\n` + body;\n fs.writeFileSync(proposalFile, newContent, 'utf-8');\n }\n }\n\n return {\n success: errors.length === 0,\n changeId,\n completedTasks,\n pendingTasks,\n integratedRequirements: targetReqs,\n updatedProductArtifacts,\n updatedArchitectureArtifacts,\n createdCanonicalArtifacts,\n archived,\n archivedPath,\n errors,\n };\n}\n\nexport function verifySddIntegration(options: { rootDir?: string } = {}): {\n success: boolean;\n audits: SddIntegrationAudit[];\n errors: string[];\n} {\n const rootDir = options.rootDir || process.cwd();\n const audits: SddIntegrationAudit[] = [];\n const errors: string[] = [];\n\n // Look for changes in specs/changes/active and specs/changes/completed\n const searchDirs = [\n path.join(rootDir, 'specs', 'changes', 'completed'),\n path.join(rootDir, 'specs', 'changes', 'active'),\n ];\n\n // Scan all canonical requirements\n const allMdFiles = walkMdFiles(rootDir);\n const canonicalMap = new Map<string, any>();\n for (const file of allMdFiles) {\n const rel = path.relative(rootDir, file).replace(/\\\\/g, '/');\n if (rel.includes('specs/changes/') || rel.includes('templates/')) continue;\n try {\n const { frontmatter, body } = parseFrontmatter(fs.readFileSync(file, 'utf-8'));\n if (frontmatter.id) {\n canonicalMap.set(String(frontmatter.id), { file, frontmatter, body });\n }\n } catch {}\n }\n\n for (const parent of searchDirs) {\n if (!fs.existsSync(parent)) continue;\n const entries = fs.readdirSync(parent, { withFileTypes: true });\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const changeDir = path.join(parent, e.name);\n const handoff = loadProductHandoffSidecar(changeDir);\n if (!handoff) continue;\n\n const tasksFile = path.join(changeDir, 'tasks.md');\n const tasks: TaskParsed[] = fs.existsSync(tasksFile)\n ? parseTasksFromContent(fs.readFileSync(tasksFile, 'utf-8'))\n : [];\n\n const completed = tasks.filter((t) => t.status === 'COMPLETED');\n const targetReqs = handoff.subgraph?.requirements || [];\n const integrated: string[] = [];\n const missing: string[] = [];\n const gaps: string[] = [];\n\n for (const reqId of targetReqs) {\n const canonical = canonicalMap.get(reqId);\n if (!canonical) {\n missing.push(reqId);\n gaps.push(`El requerimiento '${reqId}' no existe en la especificación canónica.`);\n } else {\n // Check if canonical reflects active status\n if (canonical.frontmatter.status !== 'active') {\n gaps.push(`El requerimiento '${reqId}' no tiene status: active en la especificación canónica.`);\n }\n integrated.push(reqId);\n }\n }\n\n let status: 'FULLY_INTEGRATED' | 'PARTIALLY_INTEGRATED' | 'UNINTEGRATED' = 'UNINTEGRATED';\n if (integrated.length === targetReqs.length && gaps.length === 0) {\n status = 'FULLY_INTEGRATED';\n } else if (integrated.length > 0) {\n status = 'PARTIALLY_INTEGRATED';\n }\n\n if (gaps.length > 0) {\n errors.push(`[${e.name}] Desalineación: ${gaps.join('; ')}`);\n }\n\n audits.push({\n changeId: e.name,\n status,\n completedTasksCount: completed.length,\n totalTasksCount: tasks.length,\n integratedRequirements: integrated,\n missingRequirements: missing,\n gaps,\n });\n }\n }\n\n return {\n success: errors.length === 0,\n audits,\n errors,\n };\n}\n\nfunction matchesFolderOrPrefix(folder: string, candidate: string): boolean {\n const fLower = folder.toLowerCase();\n const cLower = candidate.toLowerCase();\n if (fLower === cLower || cLower.includes(fLower)) return true;\n const fPrefix = fLower.match(/^([a-z0-9]+-[0-9]+)/);\n const cPrefix = cLower.match(/([a-z0-9]+-[0-9]+)/);\n return Boolean(fPrefix && cPrefix && fPrefix[1] === cPrefix[1]);\n}\n\nfunction resolveMatchFromMetadata(\n activeFolders: string[],\n options: ChangeDetectionOptions\n): { changeId?: string; source?: ChangeDetectionResult['source']; reason?: string } {\n const hasSpecificFilter = Boolean(\n options.headRef ||\n (options.changedFiles && options.changedFiles.length > 0) ||\n options.prTitle ||\n options.prBody\n );\n\n if (options.headRef) {\n const found = activeFolders.find((f) => matchesFolderOrPrefix(f, options.headRef!));\n if (found) return { changeId: found, source: 'branch', reason: `Coincidencia por rama origen '${options.headRef}'.` };\n }\n if (options.changedFiles && options.changedFiles.length > 0) {\n for (const file of options.changedFiles) {\n const match = file.replace(/\\\\/g, '/').match(/specs\\/changes\\/active\\/([^/]+)/);\n if (match && activeFolders.includes(match[1])) {\n return { changeId: match[1], source: 'files', reason: `Coincidencia por archivo modificado '${file}'.` };\n }\n }\n }\n if (options.prTitle) {\n const found = activeFolders.find((f) => matchesFolderOrPrefix(f, options.prTitle!));\n if (found) return { changeId: found, source: 'title', reason: `Coincidencia por título del PR '${options.prTitle}'.` };\n }\n if (options.prBody) {\n const found = activeFolders.find((f) => matchesFolderOrPrefix(f, options.prBody!));\n if (found) return { changeId: found, source: 'body', reason: `Coincidencia por mención en cuerpo del PR.` };\n }\n if (!hasSpecificFilter && activeFolders.length === 1) {\n return { changeId: activeFolders[0], source: 'single_active_completed', reason: `Único cambio activo disponible '${activeFolders[0]}'.` };\n }\n return {};\n}\n\n/**\n * Detect which active SDD change should be integrated in a CI/CD pipeline\n * upon PR merge to main or release branches.\n */\nexport function detectActiveChangeForIntegration(\n options: ChangeDetectionOptions = {}\n): ChangeDetectionResult {\n const rootDir = options.rootDir || process.cwd();\n const activeParent = path.join(rootDir, 'specs', 'changes', 'active');\n if (!fs.existsSync(activeParent)) {\n return { detected: false, reasons: [`No existe el directorio de cambios activos en '${activeParent}'.`] };\n }\n\n const entries = fs.readdirSync(activeParent, { withFileTypes: true });\n const activeFolders = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n if (activeFolders.length === 0) {\n return { detected: false, reasons: ['No se encontraron carpetas de cambios activos en specs/changes/active/.'] };\n }\n\n const match = resolveMatchFromMetadata(activeFolders, options);\n if (!match.changeId) {\n return {\n detected: false,\n reasons: [`No se correlacionó ningún cambio activo (${activeFolders.join(', ')}) con los metadatos suministrados.`],\n };\n }\n\n const changeDir = path.join(activeParent, match.changeId);\n const tasksFile = path.join(changeDir, 'tasks.md');\n const tasks = fs.existsSync(tasksFile) ? parseTasksFromContent(fs.readFileSync(tasksFile, 'utf-8')) : [];\n const completed = tasks.filter((t) => t.status === 'COMPLETED');\n const allCompleted = tasks.length > 0 && completed.length === tasks.length;\n\n return {\n detected: true,\n changeId: match.changeId,\n source: match.source,\n changeDir,\n allTasksCompleted: allCompleted,\n completedTasksCount: completed.length,\n totalTasksCount: tasks.length,\n reasons: match.reason ? [match.reason] : [],\n };\n}\n\n","/**\n * AI-SDLC: Product Definition as Code (PDaC) Graph & Cryptographic Drift Verifier\n */\n\nimport * as crypto from 'crypto';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {\n PdacDrift,\n PdacGraphOptions,\n PdacGraphResult,\n PdacNode,\n PdacSyncDetail,\n PdacSyncOptions,\n PdacSyncResult,\n} from '../types/index.js';\nimport { walkMdFiles } from '../utils/fs.js';\n\nexport function computeCanonicalSha256(content: string): string {\n // Normalize newlines to LF for deterministic hashing\n const normalized = content.replace(/\\r\\n/g, '\\n');\n return crypto.createHash('sha256').update(normalized, 'utf-8').digest('hex');\n}\n\nexport function parseFrontmatterId(content: string): { id?: string; type?: string; title?: string } {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return {};\n\n const lines = match[1].split('\\n');\n let id: string | undefined;\n let type: string | undefined;\n let title: string | undefined;\n\n for (const line of lines) {\n const parts = line.split(':');\n if (parts.length >= 2) {\n const key = parts[0].trim();\n const val = parts.slice(1).join(':').trim().replace(/^[\"']|[\"']$/g, '');\n if (key === 'id') id = val;\n if (key === 'type') type = val;\n if (key === 'title') title = val;\n }\n }\n\n return { id, type, title };\n}\n\ninterface CitationEntry {\n targetId: string;\n expectedDigest?: string;\n anchor?: string;\n sourceFile: string;\n}\n\nexport function extractCitations(content: string, sourceFile: string): CitationEntry[] {\n const citations: CitationEntry[] = [];\n const lines = content.split('\\n');\n\n let inCitations = false;\n let currentTarget: string | null = null;\n let currentDigest: string | undefined;\n let currentAnchor: string | undefined;\n\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (!line || line.startsWith('#')) continue;\n\n if (line.startsWith('citations:')) {\n inCitations = true;\n continue;\n }\n\n if (inCitations) {\n if (line.endsWith(':') && !line.startsWith('- ') && !line.startsWith('id:') && !line.startsWith('digest:') && !line.startsWith('anchor:') && !line.startsWith('comment:')) {\n inCitations = false;\n if (currentTarget) {\n citations.push({ targetId: currentTarget, expectedDigest: currentDigest, anchor: currentAnchor, sourceFile });\n currentTarget = null;\n currentDigest = undefined;\n currentAnchor = undefined;\n }\n continue;\n }\n\n if (line.startsWith('- id:')) {\n if (currentTarget) {\n citations.push({ targetId: currentTarget, expectedDigest: currentDigest, anchor: currentAnchor, sourceFile });\n }\n currentTarget = line.split(':')[1].replace(/['\"]/g, '').trim();\n currentDigest = undefined;\n currentAnchor = undefined;\n } else if (currentTarget) {\n if (line.startsWith('digest:')) {\n let dig = line.split(':').slice(1).join(':').replace(/['\"]/g, '').trim();\n if (dig.startsWith('sha256:')) dig = dig.substring(7);\n currentDigest = dig;\n } else if (line.startsWith('anchor:')) {\n currentAnchor = line.split(':')[1].replace(/['\"]/g, '').trim();\n }\n }\n }\n }\n\n if (currentTarget) {\n citations.push({ targetId: currentTarget, expectedDigest: currentDigest, anchor: currentAnchor, sourceFile });\n }\n\n return citations;\n}\n\n\n\nexport function generatePdacReportMarkdown(\n nodes: PdacNode[],\n drifts: PdacDrift[],\n unresolvedCount: number\n): string {\n const isOk = drifts.length === 0 && unresolvedCount === 0;\n const lines: string[] = [\n `# 🔒 PDaC Cryptographic Matrix and Drift Detection (Anti-Drift)`,\n ``,\n `> **Evaluation Date:** ${new Date().toISOString()}`,\n `> **Verdict:** ${isOk ? '✅ ALIGNED (0 Cryptographic drifts detected)' : `❌ DRIFT DETECTED (${drifts.length} Digest misalignments)`}`,\n ``,\n `---`,\n ``,\n `## 1. Canonical Baseline Nodes (${nodes.length})`,\n ``,\n `| Artifact ID | Type | Title | SHA-256 Digest (Baseline) |`,\n `| :--- | :--- | :--- | :--- |`,\n ];\n\n for (const n of nodes) {\n lines.push(`| **\\`${n.id}\\`** | \\`${n.type}\\` | ${n.title || 'Untitled'} | \\`sha256:${n.digest.substring(0, 16)}...\\` |`);\n }\n\n if (drifts.length > 0) {\n lines.push('');\n lines.push('---');\n lines.push('');\n lines.push('## 2. Cryptographic Drifts Detected (Status: STALE)');\n lines.push('');\n lines.push('| Consumer File | Cited ID | Expected Digest in Spec | Actual Digest in Baseline |');\n lines.push('| :--- | :--- | :--- | :--- |');\n for (const d of drifts) {\n lines.push(\n `| \\`${d.sourceFile}\\` | **\\`${d.targetId}\\`** | \\`sha256:${d.expectedDigest.substring(0, 12)}...\\` | \\`sha256:${d.actualDigest.substring(0, 12)}...\\` |`\n );\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function verifyPdacGraph(options: PdacGraphOptions = {}): PdacGraphResult {\n const rootDir = options.rootDir || process.cwd();\n const allMdFiles = walkMdFiles(rootDir);\n\n const baselineMap = new Map<string, PdacNode>();\n const allCitations: CitationEntry[] = [];\n\n for (const file of allMdFiles) {\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const { id, type, title } = parseFrontmatterId(content);\n const digest = computeCanonicalSha256(content);\n const relFile = path.relative(rootDir, file).replace(/\\\\/g, '/');\n\n if (id) {\n const citations = extractCitations(content, relFile);\n baselineMap.set(id, {\n id,\n type: type || 'artifact',\n filePath: relFile,\n title,\n digest,\n rawContent: content,\n citations: citations.map((c) => ({\n targetId: c.targetId,\n expectedDigest: c.expectedDigest,\n anchor: c.anchor,\n })),\n });\n }\n\n // Also collect citations from specs, sdd, delivery, and change directories (ignore templates/ and process/)\n const isDeliveryDoc =\n (relFile.startsWith('specs/') ||\n relFile.startsWith('sdd/') ||\n relFile.startsWith('delivery/') ||\n relFile.startsWith('changes/') ||\n relFile.includes('/specs/')) &&\n !relFile.includes('.template.');\n if (isDeliveryDoc) {\n const fileCitations = extractCitations(content, relFile);\n allCitations.push(...fileCitations);\n }\n } catch {\n // Ignore unparseable files\n }\n }\n\n const drifts: PdacDrift[] = [];\n let unresolvedCount = 0;\n\n for (const citation of allCitations) {\n const targetNode = baselineMap.get(citation.targetId);\n if (!targetNode) {\n unresolvedCount++;\n continue;\n }\n\n if (citation.expectedDigest) {\n if (citation.expectedDigest !== targetNode.digest) {\n drifts.push({\n sourceId: citation.sourceFile,\n targetId: citation.targetId,\n sourceFile: citation.sourceFile,\n expectedDigest: citation.expectedDigest,\n actualDigest: targetNode.digest,\n });\n }\n }\n }\n\n const nodes = Array.from(baselineMap.values());\n const reportMarkdown = generatePdacReportMarkdown(nodes, drifts, unresolvedCount);\n\n return {\n success: drifts.length === 0,\n totalNodes: nodes.length,\n totalEdges: allCitations.length,\n drifts,\n reportMarkdown,\n };\n}\n\nexport function updateCitationsInContent(\n content: string,\n baselineMap: Map<string, PdacNode>,\n sourceFile: string,\n details: PdacSyncDetail[]\n): { updatedContent: string; changed: boolean } {\n const lines = content.split(/\\r?\\n/);\n let changed = false;\n let inCitations = false;\n let currentTarget: string | null = null;\n const newLines: string[] = [];\n\n for (const rawLine of lines) {\n const trimmed = rawLine.trim();\n\n if (trimmed.startsWith('citations:')) {\n inCitations = true;\n newLines.push(rawLine);\n continue;\n }\n\n if (inCitations) {\n if (\n trimmed.endsWith(':') &&\n !trimmed.startsWith('- ') &&\n !trimmed.startsWith('id:') &&\n !trimmed.startsWith('digest:') &&\n !trimmed.startsWith('anchor:') &&\n !trimmed.startsWith('comment:')\n ) {\n inCitations = false;\n currentTarget = null;\n newLines.push(rawLine);\n continue;\n }\n\n if (trimmed.startsWith('- id:')) {\n currentTarget = trimmed.split(':')[1].replace(/['\"]/g, '').trim();\n newLines.push(rawLine);\n continue;\n }\n\n if (currentTarget && trimmed.startsWith('digest:')) {\n const targetNode = baselineMap.get(currentTarget);\n if (targetNode) {\n let currentDig = trimmed.split(':').slice(1).join(':').replace(/['\"]/g, '').trim();\n const hadShaPrefix = currentDig.startsWith('sha256:');\n if (hadShaPrefix) currentDig = currentDig.substring(7);\n const hasQuotes = trimmed.includes('\"') || trimmed.includes(\"'\");\n\n if (currentDig !== targetNode.digest) {\n const indent = rawLine.match(/^\\s*/)?.[0] || ' ';\n const prefix = hadShaPrefix ? 'sha256:' : '';\n const val = `${prefix}${targetNode.digest}`;\n const newLine = hasQuotes ? `${indent}digest: \"${val}\"` : `${indent}digest: ${val}`;\n newLines.push(newLine);\n changed = true;\n details.push({\n sourceFile,\n targetId: currentTarget,\n previousDigest: currentDig,\n newDigest: targetNode.digest,\n });\n continue;\n }\n }\n }\n }\n\n newLines.push(rawLine);\n }\n\n const eol = content.includes('\\r\\n') ? '\\r\\n' : '\\n';\n return { updatedContent: newLines.join(eol), changed };\n}\n\nexport function syncPdacDigests(options: PdacSyncOptions = {}): PdacSyncResult {\n const rootDir = options.rootDir || process.cwd();\n const allMdFiles = walkMdFiles(rootDir);\n const baselineMap = new Map<string, PdacNode>();\n\n for (const file of allMdFiles) {\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const { id, type, title } = parseFrontmatterId(content);\n if (id) {\n const digest = computeCanonicalSha256(content);\n const relFile = path.relative(rootDir, file).replace(/\\\\/g, '/');\n baselineMap.set(id, {\n id,\n type: type || 'artifact',\n filePath: relFile,\n title,\n digest,\n rawContent: content,\n citations: [],\n });\n }\n } catch {\n // Ignore unparseable files\n }\n }\n\n const details: PdacSyncDetail[] = [];\n const updatedFiles: string[] = [];\n const candidateFiles: string[] = [];\n\n if (options.targetPath) {\n const fullTarget = path.isAbsolute(options.targetPath) ? options.targetPath : path.join(rootDir, options.targetPath);\n if (fs.existsSync(fullTarget)) {\n if (fs.statSync(fullTarget).isDirectory()) candidateFiles.push(...walkMdFiles(fullTarget));\n else candidateFiles.push(fullTarget);\n }\n } else {\n for (const file of allMdFiles) {\n const relFile = path.relative(rootDir, file).replace(/\\\\/g, '/');\n const isDeliveryDoc =\n (relFile.startsWith('specs/') ||\n relFile.startsWith('sdd/') ||\n relFile.startsWith('delivery/') ||\n relFile.startsWith('changes/') ||\n relFile.includes('/specs/')) &&\n !relFile.includes('.template.');\n if (isDeliveryDoc) candidateFiles.push(file);\n }\n }\n\n for (const file of candidateFiles) {\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const relFile = path.relative(rootDir, file).replace(/\\\\/g, '/');\n const { updatedContent, changed } = updateCitationsInContent(content, baselineMap, relFile, details);\n if (changed) {\n fs.writeFileSync(file, updatedContent, 'utf-8');\n updatedFiles.push(relFile);\n }\n } catch {\n // Ignore unreadable or unwritable files\n }\n }\n\n return {\n success: true,\n syncedCount: details.length,\n updatedFiles,\n details,\n };\n}\n","/**\n * AI-SDLC: Deterministic Artifact Schema Verifier\n * Validates YAML frontmatters of product, security, architecture, manual, and safety artifacts\n * against canonical JSON Schema specifications (Draft 2020-12).\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n ArtifactSchemaOptions,\n ArtifactSchemaResult,\n ArtifactSchemaViolation,\n ArtifactValidationResult,\n} from '../types/index.js';\nimport { walkMdFiles } from '../utils/fs.js';\n\nexport const TYPE_TO_SCHEMA_MAP: Record<string, string> = {\n // Product\n actor: 'schemas/product/actor.schema.json',\n 'business-rule': 'schemas/product/business-rule.schema.json',\n journey: 'schemas/product/journey.schema.json',\n requirement: 'schemas/product/requirement.schema.json',\n term: 'schemas/product/term.schema.json',\n 'use-case': 'schemas/product/use-case.schema.json',\n\n // Security\n 'abuse-case': 'schemas/security/abuse-case.schema.json',\n 'security-enclave': 'schemas/security/enclave.schema.json',\n 'security-requirement': 'schemas/security/security-req.schema.json',\n 'threat-actor': 'schemas/security/threat-actor.schema.json',\n\n // Architecture\n 'architecture-decision-record': 'schemas/architecture/adr.schema.json',\n component: 'schemas/architecture/component.schema.json',\n\n // Safety\n hazard: 'schemas/safety/hazard.schema.json',\n 'safety-requirement': 'schemas/safety/safety-req.schema.json',\n\n // Manuals\n 'user-manual': 'schemas/manuals/user-manual.schema.json',\n 'production-manual': 'schemas/manuals/production-manual.schema.json',\n\n // SDD\n tasks: 'schemas/sdd/tasks.schema.json',\n handoff: 'schemas/sdd/handoff.schema.json',\n 'spec-change-proposal': 'schemas/sdd/proposal.schema.json',\n proposal: 'schemas/sdd/proposal.schema.json',\n 'spec-design': 'schemas/sdd/design.schema.json',\n 'spec-change-design': 'schemas/sdd/design.schema.json',\n design: 'schemas/sdd/design.schema.json',\n 'delivery-spec': 'schemas/sdd/spec.schema.json',\n spec: 'schemas/sdd/spec.schema.json',\n 'release-kpis': 'schemas/sdd/release-kpis.schema.json',\n 'session-telemetry': 'schemas/sdd/session-telemetry.schema.json',\n\n // Compliance\n 'license-manifest': 'schemas/compliance/license-manifest.schema.json',\n\n // Workflow\n 'agent-handoff': 'schemas/workflow/agent-handoff.schema.json',\n\n // IDE\n 'mcp-config': 'schemas/ide/mcp-config.schema.json',\n};\n\nconst PREFIX_TAXONOMY: Array<[string, string]> = [\n ['ACT-THREAT-', 'threat-actor'],\n ['ACT-', 'actor'],\n ['UC-', 'use-case'],\n ['BR-', 'business-rule'],\n ['FR-', 'requirement'],\n ['QR-', 'requirement'],\n ['CON-', 'requirement'],\n ['JRN-', 'journey'],\n ['TERM-', 'term'],\n ['ABUSE-', 'abuse-case'],\n ['SEC-ENC-', 'security-enclave'],\n ['SEC-REQ-', 'security-requirement'],\n ['HAZ-', 'hazard'],\n ['SAF-REQ-', 'safety-requirement'],\n ['SAF-', 'safety-requirement'],\n ['ADR-', 'architecture-decision-record'],\n ['CMP-', 'component'],\n ['MAN-USER-', 'user-manual'],\n ['MAN-PROD-', 'production-manual'],\n ['MAN-LIC-', 'license-manifest'],\n ['LIC-MAN-', 'license-manifest'],\n ['LIC-', 'license-manifest'],\n ['TSK-', 'tasks'],\n ['HOF-WORKFLOW-', 'agent-handoff'],\n ['AHOF-', 'agent-handoff'],\n ['HOF-', 'handoff'],\n ['SPEC-', 'delivery-spec'],\n ['DSG-', 'spec-design'],\n ['CHG-', 'spec-change-proposal'],\n ['PATCH-', 'spec-change-proposal'],\n ['PROP-', 'spec-change-proposal'],\n ['KPI-REL-', 'release-kpis'],\n ['REL-KPI-', 'release-kpis'],\n ['TEL-SES-', 'session-telemetry'],\n ['SES-TEL-', 'session-telemetry'],\n ['TEL-', 'session-telemetry'],\n ['MCP-CFG-', 'mcp-config'],\n ['IDE-MCP-', 'mcp-config'],\n ['MCP-', 'mcp-config'],\n];\n\nexport function inferArtifactTypeFromId(id: string): string | null {\n for (const [prefix, type] of PREFIX_TAXONOMY) {\n if (id.startsWith(prefix)) {\n return type;\n }\n }\n return null;\n}\n\nexport function extractFrontmatter(content: string): Record<string, unknown> | null {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return null;\n try {\n const parsed = yaml.load(match[1]);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport interface JsonSchemaRule {\n type?: string | string[];\n const?: unknown;\n enum?: unknown[];\n pattern?: string;\n minLength?: number;\n maxLength?: number;\n minimum?: number;\n maximum?: number;\n minItems?: number;\n maxItems?: number;\n items?: JsonSchemaRule;\n required?: string[];\n properties?: Record<string, JsonSchemaRule>;\n additionalProperties?: boolean | JsonSchemaRule;\n oneOf?: JsonSchemaRule[];\n anyOf?: JsonSchemaRule[];\n format?: string;\n [key: string]: unknown;\n}\n\n/**\n * Deterministic JSON Schema validator matching Draft 2020-12 core specifications\n */\nexport function validateAgainstSchema(\n value: unknown,\n schema: JsonSchemaRule,\n propPath = ''\n): string[] {\n const errors: string[] = [];\n const currentProp = propPath || 'root';\n\n // 1. const validation\n if (schema.const !== undefined && value !== schema.const) {\n errors.push(`'${currentProp}' must equal '${schema.const}', received '${String(value)}'`);\n return errors;\n }\n\n // 2. enum validation\n if (schema.enum !== undefined && !schema.enum.includes(value)) {\n errors.push(\n `'${currentProp}' must be one of [${schema.enum.join(', ')}], received '${String(value)}'`\n );\n return errors;\n }\n\n // 3. oneOf validation\n if (schema.oneOf) {\n let matchCount = 0;\n for (const sub of schema.oneOf) {\n if (validateAgainstSchema(value, sub, propPath).length === 0) {\n matchCount++;\n }\n }\n if (matchCount !== 1) {\n errors.push(`'${currentProp}' must match exactly one sub-schema in oneOf`);\n }\n return errors;\n }\n\n // 4. anyOf validation\n if (schema.anyOf) {\n const anyMatched = schema.anyOf.some(\n (sub) => validateAgainstSchema(value, sub, propPath).length === 0\n );\n if (!anyMatched) {\n errors.push(`'${currentProp}' did not match any allowed alternative in anyOf`);\n }\n return errors;\n }\n\n // 5. type validation\n if (schema.type !== undefined) {\n const allowedTypes = Array.isArray(schema.type) ? schema.type : [schema.type];\n let actualType: string = typeof value;\n if (value === null) actualType = 'null';\n else if (Array.isArray(value)) actualType = 'array';\n else if (actualType === 'number' && Number.isInteger(value)) actualType = 'integer';\n\n const matchesType = allowedTypes.some((t) => {\n if (t === actualType) return true;\n if (t === 'number' && actualType === 'integer') return true;\n return false;\n });\n\n if (!matchesType) {\n errors.push(\n `'${currentProp}' expected type [${allowedTypes.join('|')}], received '${actualType}'`\n );\n return errors;\n }\n }\n\n // If null and allowed, skip further string/number/object checks\n if (value === null) {\n return errors;\n }\n\n // 6. String validations\n if (typeof value === 'string') {\n if (schema.minLength !== undefined && value.length < schema.minLength) {\n errors.push(`'${currentProp}' length must be >= ${schema.minLength}`);\n }\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n errors.push(`'${currentProp}' length must be <= ${schema.maxLength}`);\n }\n if (schema.pattern !== undefined) {\n const regex = new RegExp(schema.pattern);\n if (!regex.test(value)) {\n errors.push(`'${currentProp}' value '${value}' does not match pattern ${schema.pattern}`);\n }\n }\n if (schema.format === 'date') {\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n if (!dateRegex.test(value) || isNaN(Date.parse(value))) {\n errors.push(`'${currentProp}' must be a valid ISO-8601 date string (YYYY-MM-DD)`);\n }\n }\n }\n\n // 7. Number validations\n if (typeof value === 'number') {\n if (schema.minimum !== undefined && value < schema.minimum) {\n errors.push(`'${currentProp}' must be >= ${schema.minimum}`);\n }\n if (schema.maximum !== undefined && value > schema.maximum) {\n errors.push(`'${currentProp}' must be <= ${schema.maximum}`);\n }\n }\n\n // 8. Array validations\n if (Array.isArray(value)) {\n if (schema.minItems !== undefined && value.length < schema.minItems) {\n errors.push(`'${currentProp}' items count must be >= ${schema.minItems}`);\n }\n if (schema.maxItems !== undefined && value.length > schema.maxItems) {\n errors.push(`'${currentProp}' items count must be <= ${schema.maxItems}`);\n }\n if (schema.items) {\n value.forEach((item, idx) => {\n errors.push(...validateAgainstSchema(item, schema.items!, `${currentProp}[${idx}]`));\n });\n }\n }\n\n // 9. Object validations\n if (typeof value === 'object' && !Array.isArray(value)) {\n const record = value as Record<string, unknown>;\n\n // Check required fields\n if (schema.required) {\n for (const reqKey of schema.required) {\n if (!(reqKey in record) || record[reqKey] === undefined) {\n errors.push(`'${currentProp}' missing required field '${reqKey}'`);\n }\n }\n }\n\n // Check properties\n const properties = schema.properties || {};\n for (const [key, propVal] of Object.entries(record)) {\n if (key in properties) {\n errors.push(\n ...validateAgainstSchema(\n propVal,\n properties[key],\n propPath ? `${propPath}.${key}` : key\n )\n );\n } else if (schema.additionalProperties === false) {\n errors.push(`'${currentProp}' contains disallowed extra property '${key}'`);\n } else if (typeof schema.additionalProperties === 'object') {\n errors.push(\n ...validateAgainstSchema(\n propVal,\n schema.additionalProperties as JsonSchemaRule,\n propPath ? `${propPath}.${key}` : key\n )\n );\n }\n }\n }\n\n return errors;\n}\n\nexport function resolveSchemaForArtifact(\n frontmatter: Record<string, unknown>,\n rootDir: string\n): { schemaPath: string; schema: JsonSchemaRule } | null {\n const type =\n (frontmatter.type as string) ||\n (typeof frontmatter.id === 'string' ? inferArtifactTypeFromId(frontmatter.id) : null);\n\n if (!type || !TYPE_TO_SCHEMA_MAP[type]) {\n return null;\n }\n\n const relSchemaPath = TYPE_TO_SCHEMA_MAP[type];\n let fullSchemaPath = path.join(rootDir, relSchemaPath);\n if (!fs.existsSync(fullSchemaPath)) {\n const fallbackPath = path.join(process.cwd(), relSchemaPath);\n if (fs.existsSync(fallbackPath)) {\n fullSchemaPath = fallbackPath;\n } else {\n return null;\n }\n }\n\n try {\n const raw = fs.readFileSync(fullSchemaPath, 'utf-8');\n const schema = JSON.parse(raw) as JsonSchemaRule;\n return { schemaPath: relSchemaPath, schema };\n } catch {\n return null;\n }\n}\n\nexport function validateArtifactSchema(\n frontmatter: Record<string, unknown>,\n schemaOrType: string | JsonSchemaRule,\n rootDir: string = process.cwd()\n): ArtifactValidationResult {\n let schema: JsonSchemaRule | null = null;\n let schemaId: string | undefined;\n\n if (typeof schemaOrType === 'string') {\n if (schemaOrType.endsWith('.json')) {\n let fullPath = path.isAbsolute(schemaOrType)\n ? schemaOrType\n : path.join(rootDir, schemaOrType);\n if (!fs.existsSync(fullPath)) {\n const fallbackPath = path.join(process.cwd(), schemaOrType);\n if (fs.existsSync(fallbackPath)) {\n fullPath = fallbackPath;\n }\n }\n if (fs.existsSync(fullPath)) {\n schema = JSON.parse(fs.readFileSync(fullPath, 'utf-8'));\n schemaId = schemaOrType;\n }\n } else if (TYPE_TO_SCHEMA_MAP[schemaOrType]) {\n const relPath = TYPE_TO_SCHEMA_MAP[schemaOrType];\n let fullPath = path.join(rootDir, relPath);\n if (!fs.existsSync(fullPath)) {\n const fallbackPath = path.join(process.cwd(), relPath);\n if (fs.existsSync(fallbackPath)) {\n fullPath = fallbackPath;\n }\n }\n if (fs.existsSync(fullPath)) {\n schema = JSON.parse(fs.readFileSync(fullPath, 'utf-8'));\n schemaId = relPath;\n }\n }\n }\n else {\n schema = schemaOrType;\n schemaId = (schema as { $id?: string }).$id;\n }\n\n if (!schema) {\n return {\n valid: false,\n filePath: '',\n id: frontmatter.id as string | undefined,\n type: frontmatter.type as string | undefined,\n errors: [`Schema could not be resolved for '${String(schemaOrType)}'`],\n };\n }\n\n const errors = validateAgainstSchema(frontmatter, schema);\n return {\n valid: errors.length === 0,\n filePath: '',\n id: frontmatter.id as string | undefined,\n type: frontmatter.type as string | undefined,\n schemaId,\n errors,\n };\n}\n\nexport function verifyArtifactsSchemas(\n options: ArtifactSchemaOptions = {}\n): ArtifactSchemaResult {\n const rootDir = options.rootDir || process.cwd();\n let filesToScan: string[] = [];\n\n if (options.targetPath) {\n const target = path.isAbsolute(options.targetPath)\n ? options.targetPath\n : path.join(rootDir, options.targetPath);\n if (fs.existsSync(target)) {\n if (fs.statSync(target).isDirectory()) {\n filesToScan = walkMdFiles(target);\n } else if (target.endsWith('.md')) {\n filesToScan = [target];\n }\n }\n } else {\n filesToScan = walkMdFiles(rootDir);\n }\n\n const violations: ArtifactSchemaViolation[] = [];\n const results: ArtifactValidationResult[] = [];\n let validCount = 0;\n let totalEvaluated = 0;\n\n for (const file of filesToScan) {\n const relPath = path.relative(rootDir, file).replace(/\\\\/g, '/');\n\n // Skip root-level markdown documents, process guides, reports, changesets, scratch, templates (unless explicitly targeted), and test temps\n if (\n relPath.startsWith('process/') ||\n relPath.startsWith('reports/') ||\n relPath.startsWith('.changeset/') ||\n relPath.startsWith('scratch/') ||\n relPath.startsWith('node_modules/') ||\n relPath.startsWith('dist/') ||\n (!options.targetPath && relPath.startsWith('templates/')) ||\n relPath.startsWith('temp-') ||\n relPath.startsWith('test-') ||\n !relPath.includes('/')\n ) {\n continue;\n }\n\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const frontmatter = extractFrontmatter(content);\n if (!frontmatter || !frontmatter.id) {\n continue;\n }\n\n const schemaInfo = resolveSchemaForArtifact(frontmatter, rootDir);\n if (!schemaInfo) {\n continue;\n }\n\n totalEvaluated++;\n const errors = validateAgainstSchema(frontmatter, schemaInfo.schema);\n const isValid = errors.length === 0;\n\n if (isValid) {\n validCount++;\n results.push({\n valid: true,\n filePath: relPath,\n id: String(frontmatter.id),\n type: String(frontmatter.type || ''),\n schemaId: schemaInfo.schemaPath,\n errors: [],\n });\n } else {\n results.push({\n valid: false,\n filePath: relPath,\n id: String(frontmatter.id),\n type: String(frontmatter.type || ''),\n schemaId: schemaInfo.schemaPath,\n errors,\n });\n\n for (const err of errors) {\n violations.push({\n filePath: relPath,\n id: String(frontmatter.id),\n type: String(frontmatter.type || ''),\n schemaId: schemaInfo.schemaPath,\n message: err,\n });\n }\n }\n } catch (err: unknown) {\n violations.push({\n filePath: relPath,\n message: `Failed to read or parse frontmatter: ${String(err)}`,\n });\n }\n }\n\n return {\n success: violations.length === 0,\n totalEvaluated,\n validCount,\n invalidCount: violations.length > 0 ? totalEvaluated - validCount : 0,\n violations,\n results,\n };\n}\n","/**\n * AI-SDLC: SDD Change Scaffolding Engine\n * Automates deterministic creation of active SDD workspaces, populating\n * proposal.md, spec.md, design.md, tasks.md, and depositing the HOF-* sidecar.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n ChangeProfile,\n ProductHandoff,\n SddChangeScaffoldOptions,\n SddChangeScaffoldResult,\n} from '../../types/index.js';\nimport { walkMdFiles } from '../../utils/fs.js';\nimport { extractGherkinBlock } from '../../verifiers/gherkin.js';\nimport { computeCanonicalSha256 } from '../../verifiers/pdac-graph.js';\nimport { validateArtifactSchema } from '../../verifiers/schemas.js';\nimport { parseFrontmatter } from '../../verifiers/traceability.js';\nimport { depositProductHandoffSidecar, getSddAdapter } from './index.js';\n\nexport function slugify(text: string): string {\n return text\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nexport function getNextCorrelativeNumber(rootDir: string): number {\n const candidateDirs = [\n path.join(rootDir, 'specs', 'changes', 'active'),\n path.join(rootDir, 'specs', 'changes', 'completed'),\n path.join(rootDir, 'specs'),\n path.join(rootDir, 'openspec', 'changes'),\n ];\n\n let maxNum = 0;\n\n for (const dir of candidateDirs) {\n if (!fs.existsSync(dir)) continue;\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const match = e.name.match(/^(?:chg|CHG|patch|PATCH)-(\\d+)/i);\n if (match) {\n const num = parseInt(match[1], 10);\n if (!isNaN(num) && num > maxNum) {\n maxNum = num;\n }\n }\n }\n } catch {\n // Ignore unreadable candidate dir\n }\n }\n\n return maxNum + 1;\n}\n\nexport function scaffoldSddChange(options: SddChangeScaffoldOptions): SddChangeScaffoldResult {\n const rootDir = options.rootDir || process.cwd();\n const framework = options.framework || 'openspec';\n const author = options.author || 'agent-developer / human-dev';\n const profile: ChangeProfile = options.profile || 'standard';\n const dateStr = new Date().toISOString().split('T')[0];\n const name = options.name.trim();\n\n const errors: string[] = [];\n const createdFiles: string[] = [];\n\n if (!name) {\n return {\n success: false,\n changeId: '',\n canonicalId: '',\n profile,\n changeDir: '',\n createdFiles: [],\n citedArtifacts: [],\n errors: ['El nombre del cambio no puede estar vacío.'],\n };\n }\n\n // 1. Generate normalized change-id\n let slug: string;\n let canonicalId: string;\n let padNum = '001';\n\n const targetChangeId = options.changeId || options.id;\n if (targetChangeId) {\n const rawId = targetChangeId.trim();\n slug = slugify(rawId);\n canonicalId = rawId.toUpperCase();\n const match = rawId.match(/^(?:chg|CHG|patch|PATCH)-(\\d+)/i);\n if (match) {\n padNum = match[1];\n }\n } else {\n const nextNum = getNextCorrelativeNumber(rootDir);\n padNum = String(nextNum).padStart(3, '0');\n const nameSlug = slugify(name);\n const prefix = profile === 'patch' ? 'patch' : 'chg';\n slug = `${prefix}-${padNum}-${nameSlug}`;\n canonicalId = `${prefix.toUpperCase()}-${padNum}-${nameSlug.toUpperCase()}`;\n }\n\n // 2. Determine target change workspace folder\n const adapter = getSddAdapter(framework);\n const changeDir = adapter.getChangeWorkspaceDir(rootDir, slug);\n\n if (fs.existsSync(changeDir)) {\n const existing = fs.readdirSync(changeDir);\n if (existing.length > 0) {\n return {\n success: false,\n changeId: slug,\n canonicalId,\n profile,\n changeDir,\n createdFiles: [],\n citedArtifacts: [],\n errors: [`El directorio del cambio '${changeDir}' ya existe y no está vacío.`],\n };\n }\n } else {\n fs.mkdirSync(changeDir, { recursive: true });\n }\n\n // 3. Scan canonical artifacts across repository for citations\n const allMdFiles = walkMdFiles(rootDir);\n const artifactMap = new Map<\n string,\n { id: string; file: string; frontmatter: any; title?: string; digest: string }\n >();\n\n for (const file of allMdFiles) {\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const { frontmatter } = parseFrontmatter(content);\n if (frontmatter && frontmatter.id) {\n const id = String(frontmatter.id);\n const digest = computeCanonicalSha256(content);\n const title = typeof frontmatter.title === 'string' ? frontmatter.title : undefined;\n artifactMap.set(id, { id, file, frontmatter, title, digest });\n }\n } catch {\n // Ignore unparseable\n }\n }\n\n // Parse --from input IDs\n const rawFrom = options.from;\n const inputFromIds: string[] = [];\n if (Array.isArray(rawFrom)) {\n for (const item of rawFrom) {\n if (typeof item === 'string') {\n inputFromIds.push(...item.split(',').map((s) => s.trim()).filter(Boolean));\n }\n }\n } else if (typeof rawFrom === 'string') {\n inputFromIds.push(...rawFrom.split(',').map((s) => s.trim()).filter(Boolean));\n }\n\n let productArtifactCreated: string | undefined;\n const citedArtifacts: Array<{ id: string; digest: string; title?: string; comment?: string }> = [];\n const subRequirements: string[] = [];\n const subUseCases: string[] = [];\n const subSecReqs: string[] = [];\n const subRules: string[] = [];\n\n // Patch profile shortcut: only spec.md with profile: patch is created\n if (profile === 'patch') {\n for (const id of inputFromIds) {\n const existing = artifactMap.get(id);\n if (existing) {\n citedArtifacts.push({\n id: existing.id,\n digest: `sha256:${existing.digest}`,\n title: existing.title,\n comment: `Citación de ${existing.frontmatter?.type || 'artefacto'} (${existing.title || existing.id})`,\n });\n }\n }\n\n const citationsSection =\n citedArtifacts.length > 0\n ? `citations:\\n${yaml\n .dump(\n citedArtifacts.map((c) => ({ id: c.id, digest: c.digest, comment: c.comment })),\n { indent: 2, lineWidth: -1 }\n )\n .trim()\n .split('\\n')\n .map((l) => ` ${l}`)\n .join('\\n')}\\n`\n : '';\n\n const specPath = path.join(changeDir, 'spec.md');\n const specFmObj = {\n id: `SPEC-${canonicalId}`,\n type: 'delivery-spec',\n 'change-id': canonicalId,\n profile: 'patch',\n 'acceptance-format': 'gherkin',\n 'cucumber-tags': [`@${canonicalId}`, '@patch', '@automated'],\n };\n const specContent = `---\nid: SPEC-${canonicalId}\ntype: delivery-spec\nchange-id: ${canonicalId}\nprofile: patch\nacceptance-format: gherkin\ncucumber-tags:\n - \"@${canonicalId}\"\n - \"@patch\"\n - \"@automated\"\n${citationsSection}verification:\n method: automated-test\n command: pnpm test\n---\n\n# Delivery Specification (Fast Patch): ${canonicalId}\n\n## 1. Patch Scope and Justification\n${name}\n\n## 2. Acceptance and Correction Criteria (BDD Gherkin)\n\n\\`\\`\\`gherkin\n@${canonicalId} @patch @automated\nFeature: Patch ${canonicalId} - ${name}\n Scenario: Defect fix verification\n Given the system exhibits the defect identified in \"${name}\"\n When the patch fix is applied\n Then the anomalous behavior is resolved and verification passes\n\\`\\`\\`\n\n## 3. Automated Verification\n- **Command**: \\`pnpm test\\`\n- **Criteria**: All unit and regression tests must pass.\n`;\n fs.writeFileSync(specPath, specContent, 'utf-8');\n createdFiles.push(specPath);\n\n const specGherkinBlocks = extractGherkinBlock(specContent);\n if (specGherkinBlocks.length === 0) {\n errors.push(\n `El archivo 'spec.md' de la entrega debe incluir obligatoriamente especificaciones en formato Gherkin (\\`\\`\\`gherkin ... \\`\\`\\`).`\n );\n }\n\n const wsValidation = adapter.validateWorkspace(changeDir);\n if (!wsValidation.valid) {\n errors.push(...wsValidation.errors);\n }\n\n const specValidation = validateArtifactSchema(specFmObj as any, 'delivery-spec', rootDir);\n if (!specValidation.valid) {\n errors.push(...specValidation.errors);\n }\n\n return {\n success: errors.length === 0,\n changeId: slug,\n canonicalId,\n profile,\n changeDir,\n createdFiles,\n citedArtifacts,\n errors,\n };\n }\n\n // 4. Handle Option A: Greenfield feature or explicit citations\n if (inputFromIds.length === 0) {\n // Greenfield feature: create draft canonical requirement in specs/product/\n const nameSlugUpper = slugify(name).toUpperCase();\n const reqId = `FR-${padNum}-${nameSlugUpper}-001`;\n const ucId = `UC-${padNum}-${nameSlugUpper}`;\n\n const productDir = path.join(rootDir, 'specs', 'product');\n if (!fs.existsSync(productDir)) {\n fs.mkdirSync(productDir, { recursive: true });\n }\n\n const reqFilePath = path.join(productDir, `${reqId}.md`);\n if (!fs.existsSync(reqFilePath)) {\n const reqContent = `---\nid: ${reqId}\ntype: requirement\ntitle: \"${name}\"\nstatus: draft\nversion: \"1.0.0\"\nschema-version: \"1.0\"\ncategory: functional\nderives-from:\n - ${ucId}\nverifiable-by: cucumber-bdd\nacceptance-format: gherkin\ncucumber-tags:\n - \"@${reqId}\"\n - \"@automated\"\nsupersedes: null\nsuperseded-by: null\n---\n\n# ${reqId}: ${name}\n\n## 1. Enunciado Normativo\nEl sistema DEBE implementar y soportar la capacidad de ${name}.\n\n---\n\n## 2. Criterios de Aceptación en Formato Gherkin (Cucumber)\n\n\\`\\`\\`gherkin\n@${reqId} @automated\nFeature: ${name}\n As a user or client system\n I want to execute the capability for ${name}\n So that the expected outcome and value are achieved\n\n Scenario: Nominal successful flow\n Given the system is in an operational state\n When the operation for \"${name}\" is executed\n Then the operation completes successfully\n\\`\\`\\`\n\n---\n\n## 3. Historial de Revisiones\n\n| Versión | Fecha | Autor / Agente | Descripción del Cambio | Referencia de Cambio (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | ${dateStr} | ${author} | Definición inicial de requerimiento para ${canonicalId} | ${canonicalId} |\n`;\n fs.writeFileSync(reqFilePath, reqContent, 'utf-8');\n productArtifactCreated = reqFilePath;\n createdFiles.push(reqFilePath);\n\n const digest = computeCanonicalSha256(reqContent);\n citedArtifacts.push({\n id: reqId,\n digest: `sha256:${digest}`,\n title: name,\n comment: `Requerimiento funcional canónico asociado (Génesis ${canonicalId})`,\n });\n subRequirements.push(reqId);\n subUseCases.push(ucId);\n }\n } else {\n // Process explicit --from IDs\n for (const id of inputFromIds) {\n const existing = artifactMap.get(id);\n if (existing) {\n citedArtifacts.push({\n id: existing.id,\n digest: `sha256:${existing.digest}`,\n title: existing.title,\n comment: `Citación de ${existing.frontmatter.type || 'artefacto'} (${existing.title || existing.id})`,\n });\n\n if (id.startsWith('FR-') || id.startsWith('QR-') || id.startsWith('CON-')) {\n if (!subRequirements.includes(id)) subRequirements.push(id);\n } else if (id.startsWith('UC-')) {\n if (!subUseCases.includes(id)) subUseCases.push(id);\n // Auto-discover derived requirements from this UC\n for (const [otherId, otherArt] of artifactMap.entries()) {\n const derives = otherArt.frontmatter['derives-from'];\n const derivesArr = Array.isArray(derives) ? derives : derives ? [derives] : [];\n if (derivesArr.includes(id)) {\n if (otherId.startsWith('FR-') || otherId.startsWith('QR-')) {\n if (!subRequirements.includes(otherId)) subRequirements.push(otherId);\n if (!citedArtifacts.some((c) => c.id === otherId)) {\n citedArtifacts.push({\n id: otherId,\n digest: `sha256:${otherArt.digest}`,\n title: otherArt.title,\n comment: `Requerimiento derivado de ${id}`,\n });\n }\n }\n }\n }\n } else if (id.startsWith('SEC-REQ-') || id.startsWith('SAF-REQ-')) {\n if (!subSecReqs.includes(id)) subSecReqs.push(id);\n } else if (id.startsWith('BR-')) {\n if (!subRules.includes(id)) subRules.push(id);\n }\n } else {\n // Artifact not found in repository: scaffold draft requirement in specs/product\n const productDir = path.join(rootDir, 'specs', 'product');\n if (!fs.existsSync(productDir)) {\n fs.mkdirSync(productDir, { recursive: true });\n }\n const reqFilePath = path.join(productDir, `${id}.md`);\n const reqContent = `---\nid: ${id}\ntype: ${id.startsWith('UC-') ? 'use-case' : id.startsWith('SEC-REQ-') ? 'security-requirement' : 'requirement'}\ntitle: \"${name}\"\nstatus: draft\nversion: \"1.0.0\"\nschema-version: \"1.0\"\ncategory: functional\nverifiable-by: cucumber-bdd\nacceptance-format: gherkin\ncucumber-tags:\n - \"@${id}\"\n - \"@automated\"\nsupersedes: null\nsuperseded-by: null\n---\n\n# ${id}: ${name}\n\n## 1. Enunciado\nDefinición de artefacto citado en ${canonicalId}.\n\n## 2. Criterios de Aceptación en Formato Gherkin (Cucumber)\n\n\\`\\`\\`gherkin\n@${id} @automated\nFeature: ${name}\n Scenario: Expected behavior verification\n Given the system is initialized for \"${name}\"\n When the request associated with ${id} is processed\n Then the response satisfies acceptance criteria\n\\`\\`\\`\n`;\n fs.writeFileSync(reqFilePath, reqContent, 'utf-8');\n createdFiles.push(reqFilePath);\n productArtifactCreated = reqFilePath;\n\n const digest = computeCanonicalSha256(reqContent);\n citedArtifacts.push({\n id,\n digest: `sha256:${digest}`,\n title: name,\n comment: `Artefacto citado en ${canonicalId}`,\n });\n\n if (id.startsWith('UC-')) {\n subUseCases.push(id);\n } else if (id.startsWith('SEC-REQ-')) {\n subSecReqs.push(id);\n } else {\n subRequirements.push(id);\n }\n }\n }\n }\n\n // Ensure at least 1 requirement in subRequirements for schema validity\n if (subRequirements.length === 0) {\n const fallbackReqId = `FR-${padNum}-${slugify(name).toUpperCase()}-001`;\n subRequirements.push(fallbackReqId);\n }\n\n // 5. Build citations YAML block for Markdown frontmatters\n const citationsYamlBlock = yaml\n .dump(\n citedArtifacts.map((c) => ({\n id: c.id,\n digest: c.digest,\n comment: c.comment,\n })),\n { indent: 2, lineWidth: -1 }\n )\n .trim()\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n\n // 6. Generate proposal.md\n const proposalPath = path.join(changeDir, 'proposal.md');\n const proposalContent = `---\nid: ${canonicalId}\ntype: spec-change-proposal\ntitle: \"${name}\"\nstatus: draft\nauthor: \"${author}\"\ncitations:\n${citationsYamlBlock}\n---\n\n# Propuesta de Cambio: ${canonicalId}\n\n## 1. Motivación y Alcance\n${name}\n\n## 2. Dependencias Externas Evaluadas\n- Lista de dependencias nuevas a incorporar y verificación de licencia según \\`license-policy.yaml\\`.\n`;\n fs.writeFileSync(proposalPath, proposalContent, 'utf-8');\n createdFiles.push(proposalPath);\n\n // 7. Generate spec.md with mandatory Gherkin formatting\n const specPath = path.join(changeDir, 'spec.md');\n const specFmObj = {\n id: `SPEC-${canonicalId}`,\n type: 'delivery-spec',\n 'change-id': canonicalId,\n profile,\n 'acceptance-format': 'gherkin',\n 'cucumber-tags': [`@${canonicalId}`, '@automated'],\n };\n const specContent = `---\nid: SPEC-${canonicalId}\ntype: delivery-spec\nchange-id: ${canonicalId}\nprofile: ${profile}\nacceptance-format: gherkin\ncucumber-tags:\n - \"@${canonicalId}\"\n - \"@automated\"\n---\n\n# Delivery Specification: ${canonicalId}\n\n## 1. Functional Behavior Scenarios (BDD Gherkin)\n\n\\`\\`\\`gherkin\n@${canonicalId} @functional @automated\nFeature: ${name}\n As a system component or user\n I want to process the operation for ${name}\n So that delivery criteria are satisfied\n\n Scenario: Nominal successful flow\n Given the system is in a nominal operational state\n When the operation for \"${name}\" is processed\n Then the operation completes successfully satisfying acceptance criteria\n\\`\\`\\`\n\n---\n\n## 2. Cybersecurity and Mitigation Scenarios (Abuse Scenarios)\n\n\\`\\`\\`gherkin\n@${canonicalId} @security @mitigation\nFeature: Security Mitigation for ${canonicalId}\n Scenario: Unauthorized access attempt or invalid payload\n Given an unauthenticated actor or invalid credentials\n When the request reaches protected enclaves\n Then the connection is rejected immediately and a security event is recorded\n\\`\\`\\`\n`;\n fs.writeFileSync(specPath, specContent, 'utf-8');\n createdFiles.push(specPath);\n\n const specGherkinBlocks = extractGherkinBlock(specContent);\n if (specGherkinBlocks.length === 0) {\n errors.push(\n `El archivo 'spec.md' de la entrega debe incluir obligatoriamente especificaciones en formato Gherkin (\\`\\`\\`gherkin ... \\`\\`\\`).`\n );\n }\n\n // 8. Generate design.md\n const designPath = path.join(changeDir, 'design.md');\n const designContent = `---\nid: DSG-${canonicalId}\ntype: spec-design\nchange-id: ${canonicalId}\ntitle: \"Diseño Técnico: ${name}\"\nversion: \"1.0.0\"\nschema-version: \"1.0\"\nhandoff: \"HOF-${canonicalId}\"\narchitecture-component: \"CMP-CORE\"\nenclave: \"SEC-ENC-DMZ\"\nstatus: draft\ncitations:\n${citationsYamlBlock}\n---\n\n# Diseño Técnico: ${canonicalId}\n\n## 1. Mapeo Arquitectónico y Enclave Zero Trust\nEl componente se despliega en el enclave perimetral y materializa el servicio correspondiente.\n\n## 2. Contratos de Datos e Interfaces\nDetalle de DTOs, interfaces de servicio y esquemas de datos asociados a ${name}.\n\n## 3. Protocolos de Manejo de Errores y Mitigación\nGestión de excepciones, reintentos y respuestas ante anomalías.\n\n## 4. Conformidad con la Política de Licencias (\\`license-policy.yaml\\`)\nTodas las librerías empleadas en la implementación deben cumplir con las categorías permitidas en \\`license-policy.yaml\\`.\n\n## 5. Historial de Revisiones\n\n| Versión | Fecha | Autor | Descripción del Cambio | Referencia |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | ${dateStr} | ${author} | Diseño técnico formal inicial | ${canonicalId} |\n`;\n fs.writeFileSync(designPath, designContent, 'utf-8');\n createdFiles.push(designPath);\n\n // 9. Generate tasks.md\n const tasksPath = path.join(changeDir, 'tasks.md');\n const tasksFm = {\n id: `TSK-PLAN-${canonicalId}`,\n type: 'task-plan',\n 'change-id': canonicalId,\n title: `Desglose de Tareas Verificables: ${name}`,\n version: '1.0.0',\n 'schema-version': '1.0',\n status: 'draft',\n 'governance-summary': {\n 'autonomous-tasks-count': 1,\n 'human-review-plan-count': 1,\n 'ambiguous-count': 0,\n 'high-risk-manual-count': 0,\n },\n tasks: [\n {\n id: 'TSK-001',\n title: 'Definición de Contratos, Interfaces y Tipos de Datos',\n complexity: 'LOW',\n 'risk-level': 'LOW',\n 'autonomy-mode': 'AUTONOMOUS',\n verification: {\n method: 'quality-gate',\n 'command-or-criteria': 'pnpm test',\n },\n 'assigned-to': 'agent-developer',\n status: 'PENDING',\n },\n {\n id: 'TSK-002',\n title: 'Implementación de Lógica y Pruebas Unitarias/BDD',\n complexity: 'MEDIUM',\n 'risk-level': 'MEDIUM',\n 'autonomy-mode': 'HUMAN_REVIEW_PLAN',\n verification: {\n method: 'automated-unit-test',\n 'command-or-criteria': 'pnpm test',\n },\n 'assigned-to': 'agent-developer',\n status: 'PENDING',\n },\n ],\n supersedes: null,\n 'superseded-by': null,\n };\n\n const tasksContent = `---\n${yaml.dump(tasksFm, { indent: 2, lineWidth: -1 }).trim()}\n---\n\n# Desglose de Tareas Verificables: ${canonicalId}\n\n## 1. Matriz de Clasificación de Autonomía y Supervisión Humana\n\n| Modo de Autonomía | Semáforo | Criterio de Activación | Comportamiento del Agente y del Humano |\n| :--- | :---: | :--- | :--- |\n| **\\`AUTONOMOUS\\`** | 🟢 | Riesgo bajo, tarea aislada y bien especificada con pruebas inmediatas. | **Plan + Ejecución Autónoma**. El agente genera el plan y escribe el código sin interrupción. |\n| **\\`HUMAN_REVIEW_PLAN\\`** | 🟡 | Riesgo medio, cambios en arquitectura, contratos de API o reglas críticas. | **Revisión Obligatoria de Plan**. El agente diseña el plan detallado y espera aprobación humana. |\n| **\\`AMBIGUOUS\\`** | 🟠 | Requisitos vagos, criterios incompletos o conflicto de lógica de negocio. | **Bloqueada para Implementación**. Requiere clarificación previa con el usuario. |\n| **\\`HIGH_RISK_MANUAL\\`** | 🔴 | Riesgo crítico (migraciones destructivas de DB, claves criptográficas, infra). | **Prohibida la Ejecución Autónoma**. Ejecución directa humana. |\n\n---\n\n## 2. Plan Detallado de Tareas y Criterios de Verificación\n\n### Fase 1: Tipos y Contratos (TSK-001)\n- **ID**: \\`TSK-001\\`\n- **Descripción**: Crear las interfaces y estructuras de datos estipuladas en \\`design.md\\`.\n- **Modo**: \\`AUTONOMOUS\\` 🟢\n- **Verificación**: \\`pnpm test\\`\n\n### Fase 2: Implementación y Pruebas (TSK-002)\n- **ID**: \\`TSK-002\\`\n- **Descripción**: Implementar la lógica y pruebas de ${name}.\n- **Modo**: \\`HUMAN_REVIEW_PLAN\\` 🟡\n- **Verificación**: \\`pnpm test\\`\n\n---\n\n## 3. Historial de Revisiones\n\n| Versión | Fecha | Autor / Agente | Descripción del Cambio | Referencia de Cambio (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | ${dateStr} | ${author} | Creación inicial del plan de tareas con gobernanza | ${canonicalId} |\n`;\n fs.writeFileSync(tasksPath, tasksContent, 'utf-8');\n createdFiles.push(tasksPath);\n\n // 10. Deposit handoff.yaml sidecar\n const subgraph: {\n requirements: string[];\n useCases?: string[];\n securityRequirements?: string[];\n businessRules?: string[];\n } = {\n requirements: subRequirements,\n };\n if (subUseCases.length > 0) subgraph.useCases = subUseCases;\n if (subSecReqs.length > 0) subgraph.securityRequirements = subSecReqs;\n if (subRules.length > 0) subgraph.businessRules = subRules;\n\n const handoff: ProductHandoff = {\n id: `HOF-${canonicalId}`,\n type: 'handoff',\n title: `Handoff Canónico de Producto para ${name}`,\n changeId: canonicalId,\n version: '1.0.0',\n createdAt: new Date().toISOString(),\n subgraph,\n citations: citedArtifacts.map((c) => ({\n id: c.id,\n digest: c.digest,\n comment: c.comment,\n })),\n };\n\n\n const depositedPath = depositProductHandoffSidecar({\n rootDir,\n changeId: slug,\n framework,\n handoff,\n });\n createdFiles.push(depositedPath);\n\n // 11. Post-creation Validation against Schemas & Workspace rules\n const wsValidation = adapter.validateWorkspace(changeDir);\n if (!wsValidation.valid) {\n errors.push(...wsValidation.errors);\n }\n\n const specValidation = validateArtifactSchema(specFmObj as any, 'delivery-spec', rootDir);\n if (!specValidation.valid) {\n errors.push(...specValidation.errors);\n }\n\n const tasksValidation = validateArtifactSchema(tasksFm as any, 'tasks', rootDir);\n if (!tasksValidation.valid) {\n errors.push(...tasksValidation.errors);\n }\n\n const handoffValidation = validateArtifactSchema(handoff as any, 'handoff', rootDir);\n if (!handoffValidation.valid) {\n errors.push(...handoffValidation.errors);\n }\n\n return {\n success: errors.length === 0,\n changeId: slug,\n canonicalId,\n profile,\n changeDir,\n createdFiles,\n productArtifactCreated,\n citedArtifacts,\n errors,\n };\n}\n","/**\n * AI-SDLC: CI/CD Environment Adapters & Multi-Platform Resolvers\n * Supports GitHub Actions, GitLab CI, Azure DevOps and Bitbucket Pipelines.\n */\n\nimport * as fs from 'fs';\n\nexport type CiProvider = 'github' | 'gitlab' | 'azure' | 'bitbucket' | 'generic';\n\nexport interface ResolvedCiEnv {\n provider: CiProvider;\n headRef?: string;\n prTitle?: string;\n prBody?: string;\n prId?: string;\n manualChangeId?: string;\n author: string;\n}\n\nexport function resolveCiEnvironment(env: NodeJS.ProcessEnv = process.env): ResolvedCiEnv {\n const manualChangeId = env.MANUAL_CHANGE_ID?.trim() || env.CHANGE_ID?.trim() || undefined;\n\n let provider: CiProvider = 'generic';\n if (env.GITLAB_CI === 'true') {\n provider = 'gitlab';\n } else if (env.TF_BUILD === 'true') {\n provider = 'azure';\n } else if (env.BITBUCKET_COMMIT !== undefined || env.BITBUCKET_BRANCH !== undefined) {\n provider = 'bitbucket';\n } else if (env.GITHUB_ACTIONS === 'true') {\n provider = 'github';\n }\n\n // Branch / Ref extraction\n let headRef: string | undefined = env.PR_HEAD_REF?.trim() || undefined;\n if (!headRef) {\n if (provider === 'gitlab') {\n headRef =\n env.CI_MERGE_REQUEST_SOURCE_BRANCH_NAME?.trim() ||\n env.CI_COMMIT_REF_NAME?.trim() ||\n env.CI_COMMIT_BRANCH?.trim() ||\n undefined;\n } else if (provider === 'azure') {\n const azureBranch =\n env.SYSTEM_PULLREQUEST_SOURCEBRANCH?.trim() ||\n env.BUILD_SOURCEBRANCH?.trim() ||\n env.BUILD_SOURCEBRANCHNAME?.trim();\n if (azureBranch) {\n headRef = azureBranch.replace(/^refs\\/heads\\//, '');\n }\n } else if (provider === 'bitbucket') {\n headRef =\n env.BITBUCKET_BRANCH?.trim() ||\n env.BITBUCKET_PR_DESTINATION_BRANCH?.trim() ||\n undefined;\n } else if (provider === 'github') {\n headRef =\n env.GITHUB_HEAD_REF?.trim() ||\n env.GITHUB_REF_NAME?.trim() ||\n undefined;\n }\n }\n\n // PR / MR Title\n const prTitle: string | undefined =\n env.PR_TITLE?.trim() ||\n env.CI_MERGE_REQUEST_TITLE?.trim() ||\n env.SYSTEM_PULLREQUEST_PULLREQUESTTITLE?.trim() ||\n undefined;\n\n // PR / MR Body / Description\n const prBody: string | undefined =\n env.PR_BODY?.trim() ||\n env.CI_MERGE_REQUEST_DESCRIPTION?.trim() ||\n undefined;\n\n // PR / MR ID\n const prId: string | undefined =\n env.PR_NUMBER?.trim() ||\n env.CI_MERGE_REQUEST_IID?.trim() ||\n env.SYSTEM_PULLREQUEST_PULLREQUESTID?.trim() ||\n env.BITBUCKET_PR_ID?.trim() ||\n undefined;\n\n // Provider author attribution\n let author = 'CI/CD Automated SDD Integration';\n if (provider === 'github') {\n author = 'GitHub Actions CI (Automated SDD Integration)';\n } else if (provider === 'gitlab') {\n author = 'GitLab CI (Automated SDD Integration)';\n } else if (provider === 'azure') {\n author = 'Azure DevOps CI (Automated SDD Integration)';\n } else if (provider === 'bitbucket') {\n author = 'Bitbucket Pipelines (Automated SDD Integration)';\n }\n\n return {\n provider,\n headRef,\n prTitle,\n prBody,\n prId,\n manualChangeId,\n author,\n };\n}\n\nexport function emitCiOutput(\n key: string,\n value: string,\n env: NodeJS.ProcessEnv = process.env\n): void {\n // 1. GitHub Actions output\n const outputFile = env.GITHUB_OUTPUT;\n if (outputFile && fs.existsSync(outputFile)) {\n fs.appendFileSync(outputFile, `${key}=${value}\\n`, 'utf-8');\n }\n\n // 2. Azure DevOps Logging Command\n if (env.TF_BUILD === 'true') {\n console.log(`##vso[task.setvariable variable=${key};isOutput=true]${value}`);\n }\n\n // 3. Dotenv output file (GitLab CI, Bitbucket, or explicit CI_OUTPUT_FILE)\n const envOutputFile =\n env.CI_OUTPUT_FILE ||\n env.GITLAB_ENV ||\n (env.GITLAB_CI === 'true' || env.BITBUCKET_COMMIT !== undefined\n ? 'sdd-integrate.env'\n : undefined);\n\n if (envOutputFile) {\n const uppercaseKey = key.toUpperCase();\n const envString = `${uppercaseKey}=${value}`;\n if (fs.existsSync(envOutputFile)) {\n const content = fs.readFileSync(envOutputFile, 'utf-8');\n const lines = content.split('\\n');\n let found = false;\n const newLines = lines.map(line => {\n if (line.startsWith(`${uppercaseKey}=`)) {\n found = true;\n return envString;\n }\n return line;\n });\n if (!found) {\n newLines.push(envString);\n }\n fs.writeFileSync(envOutputFile, newLines.filter(l => l.trim() !== '').join('\\n') + '\\n', 'utf-8');\n } else {\n fs.writeFileSync(envOutputFile, envString + '\\n', 'utf-8');\n }\n }\n}\n","/**\n * AI-SDLC: SDD Adapters Engine (OpenSpec & Spec Kit)\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { ProductHandoff, SddDepositOptions, SddFramework } from '../../types/index.js';\nimport { OpenSpecAdapter } from './openspec.js';\nimport { SpecKitAdapter } from './speckit.js';\nimport { SddAdapter } from './types.js';\n\nexport * from './types.js';\nexport * from './openspec.js';\nexport * from './speckit.js';\nexport * from './integration.js';\nexport * from './scaffold.js';\nexport * from './ci.js';\n\nexport function getSddAdapter(framework: SddFramework): SddAdapter {\n switch (framework) {\n case 'openspec':\n return new OpenSpecAdapter();\n case 'speckit':\n return new SpecKitAdapter();\n default:\n throw new Error(`Framework SDD no soportado: ${framework}`);\n }\n}\n\nexport function depositProductHandoffSidecar(options: SddDepositOptions): string {\n const adapter = getSddAdapter(options.framework);\n return adapter.depositSidecar({\n rootDir: options.rootDir || process.cwd(),\n changeId: options.changeId,\n handoff: options.handoff,\n });\n}\n\nexport function loadProductHandoffSidecar(changeDir: string): ProductHandoff | null {\n const openspec = new OpenSpecAdapter();\n const res = openspec.loadSidecar(changeDir);\n if (res) return res;\n\n const speckit = new SpecKitAdapter();\n return speckit.loadSidecar(changeDir);\n}\n\nexport function scanAllProductHandoffs(\n rootDir: string\n): Map<string, { handoff: ProductHandoff; changeDir: string }> {\n const handoffsMap = new Map<string, { handoff: ProductHandoff; changeDir: string }>();\n\n // Look across potential SDD change locations:\n // 1. specs/changes/active/*\n // 2. specs/changes/completed/*\n // 3. specs/*\n // 4. openspec/changes/*\n const candidateParentDirs = [\n path.join(rootDir, 'specs', 'changes', 'active'),\n path.join(rootDir, 'specs', 'changes', 'completed'),\n path.join(rootDir, 'specs'),\n path.join(rootDir, 'openspec', 'changes'),\n ];\n\n for (const parentDir of candidateParentDirs) {\n if (!fs.existsSync(parentDir)) continue;\n const entries = fs.readdirSync(parentDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n // Skip non-change directories\n if (entry.name === 'changes' || entry.name === 'active' || entry.name === 'node_modules') continue;\n\n const changeDir = path.join(parentDir, entry.name);\n if (handooffsHasDir(handoffsMap, changeDir)) continue;\n\n const handoff = loadProductHandoffSidecar(changeDir);\n if (handoff && handoff.id) {\n handoffsMap.set(changeDir, { handoff, changeDir });\n }\n }\n }\n\n return handoffsMap;\n}\n\nfunction handooffsHasDir(map: Map<string, any>, dir: string): boolean {\n const norm = path.resolve(dir);\n for (const key of map.keys()) {\n if (path.resolve(key) === norm) return true;\n }\n return false;\n}\n","/**\n * AI-SDLC: Automated 360° Traceability Engine (RTM Validator)\n * Verifies complete coverage across:\n * 1. PDaC Handoff (HOF-*) & Product Subgraph (Upstream: UC-*, BR-*, ABUSE-*)\n * 2. arc42 / NAF v4 Architecture Views (Midstream: CMP-*, ADR-*, SEC-ENC-*)\n * 3. BDD / Gherkin Executable Tests (Downstream: .feature files & scenario tags)\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport { scanAllProductHandoffs } from '../adapters/sdd/index.js';\nimport {\n ArtifactFrontmatter,\n ProductHandoff,\n TraceabilityOptions,\n TraceabilityResult,\n TraceabilityRow,\n} from '../types/index.js';\nimport { walkMdFiles } from '../utils/fs.js';\n\ninterface ArtifactEntry {\n file: string;\n type?: string;\n title?: string;\n frontmatter: ArtifactFrontmatter;\n rawBody: string;\n}\n\ninterface ComponentEntry {\n id: string;\n level?: number;\n parentComponent?: string;\n boundedContext?: string;\n implementationType?: string;\n satisfies: string[];\n}\n\nexport function parseFrontmatter(content: string): { frontmatter: ArtifactFrontmatter; body: string } {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return { frontmatter: {}, body: content };\n\n try {\n const parsed = yaml.load(match[1]);\n const frontmatter = parsed && typeof parsed === 'object' ? (parsed as ArtifactFrontmatter) : {};\n return { frontmatter, body: content.substring(match[0].length) };\n } catch {\n return { frontmatter: {}, body: content.substring(match[0].length) };\n }\n}\n\nexport function extractFeatureTags(featureContent: string): string[] {\n const tags: string[] = [];\n const lines = featureContent.split('\\n');\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (line.startsWith('@')) {\n const lineTags = line.split(/\\s+/).filter((t) => t.startsWith('@'));\n for (const t of lineTags) {\n tags.push(t.substring(1)); // strip '@'\n }\n }\n }\n return Array.from(new Set(tags));\n}\n\nexport function generateTraceabilityReportMarkdown(rows: TraceabilityRow[], errors: number): string {\n const isOk = errors === 0;\n const reportLines: string[] = [\n '# 360° Requirements Traceability Matrix (RTM)',\n '',\n `*Verification Date: ${new Date().toISOString()}*`,\n `*Overall Status: ${isOk ? '100% TRACEABLE (PASSED)' : `ERRORS DETECTED (${errors} gaps)`}*`,\n '',\n '## 1. End-to-End Coverage (PDaC Handoff ➔ arc42/NAF v4 ➔ BDD/Gherkin)',\n '',\n '| Requirement ID | PDaC Handoff | Title | Product (Upstream) | Architecture (Midstream) | Testing (Downstream) | Global Status |',\n '| :--- | :--- | :--- | :--- | :--- | :--- | :---: |',\n ];\n\n for (const r of rows) {\n const ok = (r.productStatus === 'COMPLIANT' || r.productStatus === 'CONFORME') &&\n (r.archStatus === 'COMPLIANT' || r.archStatus === 'CONFORME') &&\n (r.testStatus === 'COMPLIANT' || r.testStatus === 'CONFORME');\n reportLines.push(\n `| **\\`${r.id}\\`** | \\`${r.hofId || 'N/A'}\\` | ${r.title} | \\`${r.productTraces}\\` | \\`${r.archTraces}\\` | \\`${r.testTraces}\\` | ${\n ok ? '✅ COMPLIANT' : '❌ ORPHAN'\n } |`\n );\n }\n\n reportLines.push('');\n reportLines.push('## 2. Deterministic Validation Criteria');\n reportLines.push(\n '- **Product (Upstream)**: Requirement is issued in a formal PDaC Handoff (`HOF-*`) and derives from a Use Case (`UC-*`), Business Rule (`BR-*`), or Abuse Case (`ABUSE-*`).'\n );\n reportLines.push(\n '- **Architecture (Midstream)**: Requirement is assigned to at least one Component (`CMP-*`), Security Enclave (`SEC-ENC-*`), Decision (`ADR-*`), or arc42/NAF v4 Execution View.'\n );\n reportLines.push(\n '- **Testing (Downstream)**: Requirement has executable scenarios in BDD/Gherkin (`.feature`) test suites with matching tags or verified automated test cases.'\n );\n\n return reportLines.join('\\n');\n}\n\nconst SKIPPED_DIR_NAMES = new Set([\n 'node_modules',\n '.git',\n 'dist',\n 'scratch',\n 'fixtures',\n 'templates',\n 'examples',\n]);\n\nfunction shouldSkipDir(name: string): boolean {\n return SKIPPED_DIR_NAMES.has(name) || name.startsWith('temp-');\n}\n\nfunction isCodeTestFile(name: string): boolean {\n return (\n name.endsWith('.spec.ts') ||\n name.endsWith('.spec.js') ||\n name.endsWith('.test.ts') ||\n name.endsWith('.test.js') ||\n name.endsWith('_test.py') ||\n name.endsWith('_test.go')\n );\n}\n\nfunction indexFeatureFile(\n fullPath: string,\n rootDir: string,\n map: Map<string, string[]>\n): void {\n try {\n const content = fs.readFileSync(fullPath, 'utf-8');\n const tags = extractFeatureTags(content);\n const relFeature = path.relative(rootDir, fullPath).replace(/\\\\/g, '/');\n for (const tag of tags) {\n const existing = map.get(tag) || [];\n if (!existing.includes(relFeature)) existing.push(relFeature);\n map.set(tag, existing);\n }\n } catch {\n // Ignore read error\n }\n}\n\nfunction scanFeatureFiles(\n dir: string,\n rootDir: string,\n map: Map<string, string[]>\n): void {\n if (!fs.existsSync(dir)) return;\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const e of entries) {\n const fullPath = path.join(dir, e.name);\n if (e.isDirectory() && !shouldSkipDir(e.name)) {\n scanFeatureFiles(fullPath, rootDir, map);\n } else if (e.name.endsWith('.feature')) {\n indexFeatureFile(fullPath, rootDir, map);\n }\n }\n } catch {\n // Ignore directory error\n }\n}\n\nfunction indexCodeTestFile(\n fullPath: string,\n rootDir: string,\n reqIds: string[],\n map: Map<string, string[]>\n): void {\n try {\n const content = fs.readFileSync(fullPath, 'utf-8');\n const relTest = path.relative(rootDir, fullPath).replace(/\\\\/g, '/');\n for (const artId of reqIds) {\n if (content.includes(artId)) {\n const existing = map.get(artId) || [];\n if (!existing.includes(relTest)) existing.push(relTest);\n map.set(artId, existing);\n }\n }\n } catch {\n // Ignore read error\n }\n}\n\nfunction scanCodeTestFiles(\n dir: string,\n rootDir: string,\n reqIds: string[],\n map: Map<string, string[]>\n): void {\n if (!fs.existsSync(dir)) return;\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const e of entries) {\n const fullPath = path.join(dir, e.name);\n if (e.isDirectory() && !shouldSkipDir(e.name)) {\n scanCodeTestFiles(fullPath, rootDir, reqIds, map);\n } else if (isCodeTestFile(e.name)) {\n indexCodeTestFile(fullPath, rootDir, reqIds, map);\n }\n }\n } catch {\n // Ignore directory error\n }\n}\n\nexport function verifyTraceability(options: TraceabilityOptions = {}): TraceabilityResult {\n const rootDir = options.rootDir || process.cwd();\n const allMdFiles = walkMdFiles(rootDir);\n\n // 1. Index all markdown artifacts\n const artifactMap = new Map<string, ArtifactEntry>();\n const componentsList: ComponentEntry[] = [];\n const architectureViews: { file: string; content: string }[] = [];\n\n for (const file of allMdFiles) {\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const { frontmatter, body } = parseFrontmatter(content);\n const relFile = path.relative(rootDir, file).replace(/\\\\/g, '/');\n\n if (frontmatter.id) {\n artifactMap.set(frontmatter.id, {\n file: relFile,\n type: typeof frontmatter.type === 'string' ? frontmatter.type : undefined,\n title: typeof frontmatter.title === 'string' ? frontmatter.title : undefined,\n frontmatter,\n rawBody: body,\n });\n\n if (frontmatter.type === 'component' || String(frontmatter.id).startsWith('CMP-')) {\n const satisfies: string[] = [];\n if (Array.isArray(frontmatter['satisfies-requirements'])) {\n satisfies.push(...(frontmatter['satisfies-requirements'] as string[]));\n }\n if (Array.isArray(frontmatter['satisfies'])) {\n satisfies.push(...(frontmatter['satisfies'] as string[]));\n }\n componentsList.push({\n id: String(frontmatter.id),\n level: typeof frontmatter.level === 'number' ? frontmatter.level : undefined,\n parentComponent:\n typeof frontmatter['parent-component'] === 'string'\n ? frontmatter['parent-component']\n : undefined,\n boundedContext:\n typeof frontmatter['bounded-context'] === 'string'\n ? frontmatter['bounded-context']\n : undefined,\n implementationType:\n typeof frontmatter['implementation-type'] === 'string'\n ? frontmatter['implementation-type']\n : undefined,\n satisfies,\n });\n }\n }\n\n // Collect arc42 / NAF v4 architecture views\n if (\n relFile.includes('architecture/') ||\n relFile.includes('06_runtime_view') ||\n relFile.includes('08_security_concept') ||\n relFile.includes('09_decisions')\n ) {\n architectureViews.push({ file: relFile, content });\n }\n } catch {\n // Ignore unparseable files\n }\n }\n\n // 2. Scan PDaC Handoffs (HOF-*)\n const handoffsMap = scanAllProductHandoffs(rootDir);\n const handoffList: ProductHandoff[] = Array.from(handoffsMap.values()).map((v) => v.handoff);\n\n // Also collect any handoffs declared in artifactMap (e.g. from markdown files with id: HOF-*)\n for (const [id, entry] of artifactMap.entries()) {\n if (id.startsWith('HOF-') && !handoffsMap.has(id)) {\n const fm = entry.frontmatter;\n const subgraph = (fm.subgraph as any) || {\n requirements: Array.isArray(fm.requirements) ? (fm.requirements as string[]) : [],\n };\n handoffList.push({\n id,\n type: 'handoff',\n title: entry.title,\n changeId: String(fm['change-id'] || fm.changeId || id),\n subgraph,\n });\n }\n }\n\n // Index requirement to handoff\n const reqToHandoffMap = new Map<string, ProductHandoff>();\n for (const hof of handoffList) {\n if (hof.subgraph && Array.isArray(hof.subgraph.requirements)) {\n for (const reqId of hof.subgraph.requirements) {\n reqToHandoffMap.set(reqId, hof);\n }\n }\n if (hof.subgraph && Array.isArray(hof.subgraph.securityRequirements)) {\n for (const reqId of hof.subgraph.securityRequirements) {\n reqToHandoffMap.set(reqId, hof);\n }\n }\n }\n\n // 3. Scan Downstream Tests (BDD / Gherkin .feature & Code-level tests)\n const featureTagMap = new Map<string, string[]>(); // reqId -> featureFiles[]\n const codeTestMap = new Map<string, string[]>(); // reqId -> testFiles[]\n\n const targetReqIds: string[] = [];\n for (const [artId] of artifactMap.entries()) {\n if (\n artId.startsWith('FR-') ||\n artId.startsWith('QR-') ||\n artId.startsWith('SEC-REQ-') ||\n artId.startsWith('CON-')\n ) {\n targetReqIds.push(artId);\n }\n }\n\n scanFeatureFiles(rootDir, rootDir, featureTagMap);\n scanCodeTestFiles(rootDir, rootDir, targetReqIds, codeTestMap);\n\n // 4. Identify all requirements to verify (excluding templates and process docs)\n const requirements: ArtifactEntry[] = [];\n for (const [id, data] of artifactMap.entries()) {\n if (data.file.includes('templates/') || data.file.includes('.template.') || data.file.includes('process/')) {\n continue;\n }\n\n if (\n data.type === 'requirement' ||\n data.type === 'security-requirement' ||\n id.startsWith('FR-') ||\n id.startsWith('QR-') ||\n id.startsWith('CON-') ||\n id.startsWith('SEC-REQ-')\n ) {\n requirements.push(data);\n }\n }\n\n let errorCount = 0;\n const matrixRows: TraceabilityRow[] = [];\n const orphans: TraceabilityRow[] = [];\n\n for (const req of requirements) {\n const fm = req.frontmatter;\n const reqId = fm.id || '';\n const associatedHandoff = reqToHandoffMap.get(reqId);\n\n // --- A. UPSTREAM: PRODUCT TRACEABILITY (PDaC Handoff & Subgraph) ---\n const productTraces: string[] = [];\n\n // From frontmatter\n if (Array.isArray(fm['derives-from'])) {\n productTraces.push(...(fm['derives-from'] as string[]));\n } else if (typeof fm['derives-from'] === 'string') {\n productTraces.push(fm['derives-from']);\n }\n\n if (Array.isArray(fm['mitigates-abuse-case'])) {\n productTraces.push(...(fm['mitigates-abuse-case'] as string[]));\n } else if (typeof fm['mitigates-abuse-case'] === 'string') {\n productTraces.push(fm['mitigates-abuse-case']);\n }\n\n // From PDaC Handoff subgraph\n if (associatedHandoff) {\n if (associatedHandoff.subgraph?.useCases) {\n productTraces.push(...associatedHandoff.subgraph.useCases);\n }\n if (associatedHandoff.subgraph?.businessRules) {\n productTraces.push(...associatedHandoff.subgraph.businessRules);\n }\n if (associatedHandoff.subgraph?.abuseCases) {\n productTraces.push(...associatedHandoff.subgraph.abuseCases);\n }\n }\n\n // Keep unique valid traces that exist in the artifact base\n const validProductTraces = Array.from(\n new Set(productTraces.filter((id) => artifactMap.has(id)))\n );\n\n const isProductConforme =\n validProductTraces.length > 0 || (associatedHandoff !== undefined && (associatedHandoff.subgraph?.requirements?.includes(reqId) ?? false));\n\n const productStatus: 'COMPLIANT' | 'ORPHAN' = isProductConforme ? 'COMPLIANT' : 'ORPHAN';\n if (!isProductConforme) errorCount++;\n\n // --- B. MIDSTREAM: ARCHITECTURE TRACEABILITY (arc42 / NAF v4 - Reverse Lookup) ---\n const archTraces: string[] = [];\n\n // Component reverse mapping (components declaring satisfies-requirements / satisfies)\n for (const cmp of componentsList) {\n if (cmp.satisfies.includes(reqId)) {\n if (!archTraces.includes(cmp.id)) archTraces.push(cmp.id);\n if (cmp.parentComponent && !archTraces.includes(cmp.parentComponent)) {\n archTraces.push(cmp.parentComponent);\n }\n }\n }\n\n if (typeof fm['enforced-in-enclave'] === 'string') {\n archTraces.push(fm['enforced-in-enclave']);\n }\n\n // Check arc42 / NAF v4 views for direct citations\n for (const view of architectureViews) {\n if (view.content.includes(reqId)) {\n const viewName = path.basename(view.file);\n if (!archTraces.includes(viewName)) archTraces.push(viewName);\n }\n }\n\n const uniqueArchTraces = Array.from(new Set(archTraces));\n const archStatus: 'COMPLIANT' | 'ORPHAN' = uniqueArchTraces.length > 0 ? 'COMPLIANT' : 'ORPHAN';\n if (uniqueArchTraces.length === 0) errorCount++;\n\n // --- C. DOWNSTREAM: TEST TRACEABILITY (BDD / Gherkin & Code Tests - Reverse Lookup) ---\n const testTraces: string[] = [];\n\n // Tagged .feature files (reverse lookup)\n const matchingFeatures = featureTagMap.get(reqId) || [];\n testTraces.push(...matchingFeatures);\n\n if (associatedHandoff) {\n const handoffFeatures = featureTagMap.get(associatedHandoff.id) || [];\n testTraces.push(...handoffFeatures);\n }\n\n // Code-based test files (reverse lookup)\n const matchingCodeTests = codeTestMap.get(reqId) || [];\n testTraces.push(...matchingCodeTests);\n\n const uniqueTestTraces = Array.from(new Set(testTraces));\n const testStatus: 'COMPLIANT' | 'ORPHAN' = uniqueTestTraces.length > 0 ? 'COMPLIANT' : 'ORPHAN';\n if (uniqueTestTraces.length === 0) errorCount++;\n\n const row: TraceabilityRow = {\n id: reqId,\n title: (fm.title as string) || 'Untitled',\n type: req.type,\n hofId: associatedHandoff?.id,\n productTraces: validProductTraces.join(', ') || (associatedHandoff ? associatedHandoff.id : 'NONE'),\n productStatus,\n archTraces: uniqueArchTraces.join(', ') || 'NONE',\n archStatus,\n testTraces: uniqueTestTraces.join(', ') || 'NONE',\n testStatus,\n content: req.rawBody ? req.rawBody.trim() : undefined,\n filePath: req.file,\n };\n\n matrixRows.push(row);\n if (productStatus === 'ORPHAN' || archStatus === 'ORPHAN' || testStatus === 'ORPHAN') {\n orphans.push(row);\n }\n }\n\n const reportMarkdown = generateTraceabilityReportMarkdown(matrixRows, errorCount);\n\n return {\n success: errorCount === 0,\n rows: matrixRows,\n orphans,\n orphanCount: orphans.length,\n totalRequirements: requirements.length,\n reportMarkdown,\n };\n}\n","/**\n * AI-SDLC: Tasks Governance and Autonomy Classification Verifier\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n AutonomyMode,\n GovernanceOptions,\n GovernanceResult,\n TaskItem,\n TaskSummary,\n VALID_AUTONOMY_MODES,\n} from '../types/index.js';\n\ninterface TasksFrontmatter {\n tasks: TaskItem[];\n [key: string]: unknown;\n}\n\nexport function parseTasksDoc(content: string): { frontmatter: TasksFrontmatter; body: string } {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return { frontmatter: { tasks: [] }, body: content };\n\n let parsed: unknown;\n try {\n parsed = yaml.load(match[1]);\n } catch {\n return { frontmatter: { tasks: [] }, body: content };\n }\n\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return { frontmatter: { tasks: [] }, body: content };\n }\n\n const raw = parsed as Record<string, unknown>;\n const rawTasks = Array.isArray(raw['tasks']) ? (raw['tasks'] as Record<string, unknown>[]) : [];\n\n const tasks: TaskItem[] = rawTasks.map((t) => {\n const verification: TaskItem['verification'] = {};\n if (t['verification'] && typeof t['verification'] === 'object') {\n const v = t['verification'] as Record<string, unknown>;\n if (typeof v['method'] === 'string') verification.method = v['method'];\n if (typeof v['command-or-criteria'] === 'string') verification.criteria = v['command-or-criteria'];\n }\n return {\n id: typeof t['id'] === 'string' ? t['id'] : String(t['id'] ?? ''),\n title: typeof t['title'] === 'string' ? t['title'] : undefined,\n complexity: typeof t['complexity'] === 'string' ? t['complexity'] : undefined,\n riskLevel: typeof t['risk-level'] === 'string' ? t['risk-level'] : undefined,\n autonomyMode: typeof t['autonomy-mode'] === 'string' ? t['autonomy-mode'] : undefined,\n assignedTo: typeof t['assigned-to'] === 'string' ? t['assigned-to'] : undefined,\n status: typeof t['status'] === 'string' ? t['status'] : undefined,\n blockingReason: typeof t['blocking-reason'] === 'string' ? t['blocking-reason'] : undefined,\n verification,\n };\n });\n\n const frontmatter: TasksFrontmatter = { ...raw, tasks };\n return { frontmatter, body: content.substring(match[0].length) };\n}\n\nexport function walkTaskFiles(\n dir: string,\n fileList: string[] = [],\n excludeDirs: string[] = [\n 'node_modules',\n '.git',\n 'dist',\n '.changeset',\n 'scratch',\n 'test-scaffold',\n 'fixtures',\n 'templates',\n 'examples',\n ]\n): string[] {\n try {\n if (!fs.existsSync(dir)) return fileList;\n const files = fs.readdirSync(dir);\n for (const file of files) {\n const fullPath = path.join(dir, file);\n try {\n if (fs.statSync(fullPath).isDirectory()) {\n if (!excludeDirs.includes(file)) {\n walkTaskFiles(fullPath, fileList, excludeDirs);\n }\n } else if (\n (file.toLowerCase() === 'tasks.md' || file.endsWith('.tasks.md')) &&\n !file.includes('.template.')\n ) {\n fileList.push(fullPath);\n }\n } catch {\n // Ignore files unlinked concurrently\n }\n }\n } catch {\n // Ignore directories removed concurrently\n }\n return fileList;\n}\n\n\nexport function generateGovernanceReportMarkdown(\n summaries: TaskSummary[],\n violationsCount: number,\n modeCounts: Record<string, number>,\n totalTasks: number\n): string {\n const countAutonomous = modeCounts['AUTONOMOUS'] || 0;\n const countHumanReviewPlan = modeCounts['HUMAN_REVIEW_PLAN'] || 0;\n const countAmbiguous = modeCounts['AMBIGUOUS'] || 0;\n const countHighRiskManual = modeCounts['HIGH_RISK_MANUAL'] || 0;\n\n const reportContent: string[] = [\n `# 📋 Task Governance and Human Autonomy Classification Report`,\n ``,\n `> **Audit Date:** ${new Date().toISOString()}`,\n `> **Overall Verdict:** ${\n violationsCount === 0\n ? 'COMPLIANT (0 Governance Violations)'\n : `NON-COMPLIANT (${violationsCount} Violations detected)`\n }`,\n ``,\n `---`,\n ``,\n `## 1. Project Autonomy Modes Distribution`,\n ``,\n `| Autonomy Mode | Status | Count | Percentage | AI Agent Role | Human Intervention Required |`,\n `| :--- | :---: | :---: | :---: | :--- | :--- |`,\n `| **\\`AUTONOMOUS\\`** | 🟢 | **${countAutonomous}** | ${\n Math.round((countAutonomous / (totalTasks || 1)) * 100)\n }% | Autonomous planning and coding | Asynchronous final PR review |`,\n `| **\\`HUMAN_REVIEW_PLAN\\`** | 🟡 | **${countHumanReviewPlan}** | ${\n Math.round((countHumanReviewPlan / (totalTasks || 1)) * 100)\n }% | Detailed plan elaboration | **Explicit plan approval BEFORE coding** |`,\n `| **\\`AMBIGUOUS\\`** | 🟠 | **${countAmbiguous}** | ${\n Math.round((countAmbiguous / (totalTasks || 1)) * 100)\n }% | **HALTED**: Coding prohibited | Refinement and clarification with Product Owner |`,\n `| **\\`HIGH_RISK_MANUAL\\`** | 🔴 | **${countHighRiskManual}** | ${\n Math.round((countHighRiskManual / (totalTasks || 1)) * 100)\n }% | Pair-programming assistance only | **Direct execution by human engineers** |`,\n ``,\n `---`,\n ``,\n `## 2. Verifiable Tasks Detail and Acceptance Criteria`,\n ``,\n `| Task ID | Source File | Title | Risk | Autonomy | Concrete Verification Criterion | Assigned To | Status |`,\n `| :--- | :--- | :--- | :---: | :---: | :--- | :--- | :---: |`,\n ];\n\n for (const t of summaries) {\n const isConform = !t.riskAnomaly && t.hasVerification && t.validAutonomy;\n const icon = isConform ? '✅ OK' : '❌ GAP';\n const criteria = t.task.verification?.criteria || 'MISSING';\n reportContent.push(\n `| **\\`${t.task.id}\\`** | \\`${t.file}\\` | ${t.task.title || 'Untitled'} | \\`${\n t.task.riskLevel || 'MEDIUM'\n }\\` | \\`${t.task.autonomyMode || 'UNKNOWN'}\\` | \\`${criteria}\\` | \\`${\n t.task.assignedTo || 'agent-developer'\n }\\` | ${icon} |`\n );\n }\n\n reportContent.push('');\n reportContent.push('---');\n reportContent.push('');\n reportContent.push('## 3. Compliance Guidelines');\n reportContent.push(\n '1. No agent may start a task marked as `HUMAN_REVIEW_PLAN` without explicit human approval/comment in the issue/PR.'\n );\n reportContent.push(\n '2. Tasks marked as `AMBIGUOUS` require a Q&A session or refinement of the SDD specification.'\n );\n reportContent.push(\n '3. Every completed task must be accompanied by execution evidence of the specified verification command.'\n );\n\n return reportContent.join('\\n');\n}\n\nexport function verifyTasksGovernance(options: GovernanceOptions = {}): GovernanceResult {\n const rootDir = options.rootDir || process.cwd();\n const searchDir = options.specsDir || rootDir;\n const taskFiles = walkTaskFiles(searchDir);\n\n let totalTasks = 0;\n let unverifiedCount = 0;\n const taskSummaries: TaskSummary[] = [];\n const violationsList: string[] = [];\n\n const modeCounts: Record<string, number> = {\n AUTONOMOUS: 0,\n HUMAN_REVIEW_PLAN: 0,\n AMBIGUOUS: 0,\n HIGH_RISK_MANUAL: 0,\n };\n const riskCounts: Record<string, number> = {\n LOW: 0,\n MEDIUM: 0,\n HIGH: 0,\n CRITICAL: 0,\n };\n\n for (const file of taskFiles) {\n if (!fs.existsSync(file)) continue;\n let content: string;\n try {\n content = fs.readFileSync(file, 'utf-8');\n } catch {\n continue;\n }\n const { frontmatter } = parseTasksDoc(content);\n\n if (!frontmatter.tasks || frontmatter.tasks.length === 0) {\n continue;\n }\n\n const relPath = path.relative(rootDir, file).replace(/\\\\/g, '/');\n\n for (const t of frontmatter.tasks) {\n totalTasks++;\n\n const isModeValid = VALID_AUTONOMY_MODES.includes(t.autonomyMode as AutonomyMode);\n const hasVerification = Boolean(\n t.verification && t.verification.criteria && t.verification.criteria.length > 3\n );\n\n let safetyViolation: string | null = null;\n if (\n t.autonomyMode === 'HIGH_RISK_MANUAL' &&\n t.assignedTo &&\n t.assignedTo.startsWith('agent-') &&\n t.assignedTo !== 'pair-human-agent'\n ) {\n safetyViolation = `[${t.id}] HIGH RISK task assigned to autonomous agent without human supervisor.`;\n }\n if (t.autonomyMode === 'AMBIGUOUS' && t.status === 'IN_PROGRESS') {\n safetyViolation = `[${t.id}] AMBIGUOUS task in progress: Must halt until clarification.`;\n }\n if (!hasVerification) {\n safetyViolation = `[${t.id}] Missing concrete verification criterion or command.`;\n unverifiedCount++;\n }\n if (!isModeValid) {\n safetyViolation = `[${t.id}] Invalid autonomy mode: \"${t.autonomyMode}\".`;\n }\n\n if (safetyViolation) {\n violationsList.push(safetyViolation);\n }\n\n if (t.autonomyMode && modeCounts[t.autonomyMode] !== undefined) {\n modeCounts[t.autonomyMode]++;\n }\n const risk = (t.riskLevel || 'MEDIUM').toUpperCase();\n if (riskCounts[risk] !== undefined) {\n riskCounts[risk]++;\n }\n\n taskSummaries.push({\n file: relPath,\n task: t,\n hasVerification,\n validAutonomy: isModeValid,\n riskAnomaly: Boolean(safetyViolation),\n });\n }\n }\n\n const reportMarkdown = generateGovernanceReportMarkdown(\n taskSummaries,\n violationsList.length,\n modeCounts,\n totalTasks\n );\n\n return {\n success: violationsList.length === 0,\n totalTasks,\n verifiedCount: totalTasks - unverifiedCount,\n unverifiedCount,\n riskCounts,\n modeCounts,\n tasks: taskSummaries,\n violations: violationsList,\n reportMarkdown,\n };\n}\n","/**\n * AI-SDLC: Test Linkage and Coverage Auditor for Requirements and Tasks\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n RequirementAuditItem,\n TaskAuditItem,\n TestingCoverageOptions,\n TestingCoverageResult,\n} from '../types/index.js';\nimport { walkMdFiles } from '../utils/fs.js';\n\ninterface ParsedTaskItem {\n id: string;\n title?: string;\n verification?: {\n method?: string;\n criteria?: string;\n };\n}\n\ninterface GenericFrontmatter {\n id?: string;\n title?: string;\n type?: string;\n 'cucumber-feature-file'?: string;\n 'verified-by-tests'?: string[];\n 'verifiable-by'?: string;\n 'acceptance-format'?: string;\n tasks?: ParsedTaskItem[];\n [key: string]: unknown;\n}\n\nexport function parseGenericDoc(content: string): { frontmatter: GenericFrontmatter; body: string } {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return { frontmatter: {}, body: content };\n\n let parsed: unknown;\n try {\n parsed = yaml.load(match[1]);\n } catch {\n return { frontmatter: {}, body: content };\n }\n\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return { frontmatter: {}, body: content };\n }\n\n const raw = parsed as Record<string, unknown>;\n\n const rawTasks = Array.isArray(raw['tasks']) ? (raw['tasks'] as Record<string, unknown>[]) : [];\n const tasks: ParsedTaskItem[] = rawTasks.map((t) => {\n const verification: ParsedTaskItem['verification'] = {};\n if (t['verification'] && typeof t['verification'] === 'object') {\n const v = t['verification'] as Record<string, unknown>;\n if (typeof v['method'] === 'string') verification.method = v['method'];\n if (typeof v['command-or-criteria'] === 'string') verification.criteria = v['command-or-criteria'];\n }\n return {\n id: typeof t['id'] === 'string' ? t['id'] : String(t['id'] ?? ''),\n title: typeof t['title'] === 'string' ? t['title'] : undefined,\n verification,\n };\n });\n\n const verifiedBy = raw['verified-by-tests'];\n const frontmatter: GenericFrontmatter = {\n ...raw,\n tasks,\n 'verified-by-tests': Array.isArray(verifiedBy)\n ? (verifiedBy as unknown[]).map(String)\n : typeof verifiedBy === 'string'\n ? [verifiedBy]\n : undefined,\n };\n\n return { frontmatter, body: content.substring(match[0].length) };\n}\n\n\n\nexport function generateTestingCoverageReportMarkdown(\n reqAudit: RequirementAuditItem[],\n taskAudit: TaskAuditItem[],\n reqErrors: number,\n taskErrors: number\n): string {\n const totalErrors = reqErrors + taskErrors;\n const reportLines: string[] = [\n `# 🧪 Deterministic Test Coverage Audit for Requirements and Tasks`,\n ``,\n `> **Audit Date:** ${new Date().toISOString()}`,\n `> **Overall Verdict:** ${\n totalErrors === 0\n ? '100% VERIFIED WITH TESTS (PASSED)'\n : `BLOCKED: Detected ${totalErrors} items without tests (${reqErrors} Requirements, ${taskErrors} Tasks)`\n }`,\n ``,\n `---`,\n ``,\n `## 1. Requirements Audit (Product, Quality, and Security)`,\n ``,\n `| Requirement ID | Title | Source File | Declared Method | Linked Test Files | Status |`,\n `| :--- | :--- | :--- | :---: | :--- | :---: |`,\n ];\n\n for (const r of reqAudit) {\n const icon = r.status === 'VERIFICADO_CON_PRUEBA' ? '✅ VERIFIED' : '❌ NO TESTS';\n reportLines.push(\n `| **\\`${r.id}\\`** | ${r.title} | \\`${r.file}\\` | \\`${r.method}\\` | \\`${r.testRefs}\\` | ${icon} |`\n );\n }\n\n reportLines.push('');\n reportLines.push('---');\n reportLines.push('');\n reportLines.push('## 2. Tasks Audit (SDD Delivery Engineering)');\n reportLines.push('');\n reportLines.push(\n '| Task ID | Title | tasks.md File | Method | Verification Command / Criterion | Status |'\n );\n reportLines.push('| :--- | :--- | :--- | :---: | :--- | :---: |');\n\n for (const t of taskAudit) {\n const icon = t.status === 'VERIFICADO_CON_PRUEBA' ? '✅ VERIFIED' : '❌ NO TESTS';\n reportLines.push(\n `| **\\`${t.id}\\`** | ${t.title} | \\`${t.file}\\` | \\`${t.method}\\` | \\`${t.commandOrCriteria}\\` | ${icon} |`\n );\n }\n\n return reportLines.join('\\n');\n}\n\nexport function scanAllTestArtifacts(rootDir: string): Map<string, string[]> {\n const reqToTestsMap = new Map<string, string[]>();\n\n function walk(dir: string) {\n if (!fs.existsSync(dir)) return;\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const e of entries) {\n const fullPath = path.join(dir, e.name);\n if (e.isDirectory()) {\n if (!['node_modules', '.git', 'dist', '.changeset', 'scratch', 'fixtures', 'templates', 'examples'].includes(e.name)) {\n walk(fullPath);\n }\n } else {\n const isFeature = e.name.endsWith('.feature');\n const isCodeTest =\n e.name.endsWith('.spec.ts') ||\n e.name.endsWith('.spec.js') ||\n e.name.endsWith('.test.ts') ||\n e.name.endsWith('.test.js') ||\n e.name.endsWith('_test.py') ||\n e.name.endsWith('_test.go');\n\n if (isFeature || isCodeTest) {\n try {\n const content = fs.readFileSync(fullPath, 'utf-8');\n const relTest = path.relative(rootDir, fullPath).replace(/\\\\/g, '/');\n\n if (isFeature) {\n const lines = content.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.startsWith('@')) {\n const tags = trimmed.split(/\\s+/).filter((t) => t.startsWith('@'));\n for (const t of tags) {\n const reqId = t.substring(1);\n const existing = reqToTestsMap.get(reqId) || [];\n if (!existing.includes(relTest)) existing.push(relTest);\n reqToTestsMap.set(reqId, existing);\n }\n }\n }\n }\n\n const idMatches = content.match(/\\b(FR|QR|CON|SEC-REQ)-[A-Z0-9]+(-[A-Z0-9]+)*\\b/g);\n if (idMatches) {\n for (const reqId of idMatches) {\n const existing = reqToTestsMap.get(reqId) || [];\n if (!existing.includes(relTest)) existing.push(relTest);\n reqToTestsMap.set(reqId, existing);\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n }\n }\n\n walk(rootDir);\n return reqToTestsMap;\n}\n\nexport function verifyTestingCoverage(options: TestingCoverageOptions = {}): TestingCoverageResult {\n const rootDir = options.rootDir || process.cwd();\n const allMdFiles = walkMdFiles(rootDir);\n const reqToTestsMap = scanAllTestArtifacts(rootDir);\n\n const reqAudit: RequirementAuditItem[] = [];\n const taskAudit: TaskAuditItem[] = [];\n\n let reqErrors = 0;\n let taskErrors = 0;\n\n for (const file of allMdFiles) {\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const { frontmatter } = parseGenericDoc(content);\n const relPath = path.relative(rootDir, file).replace(/\\\\/g, '/');\n const isTemplate = relPath.includes('templates/');\n\n const id = frontmatter.id || '';\n const isRequirement =\n frontmatter.type === 'requirement' ||\n frontmatter.type === 'security-requirement' ||\n id.startsWith('FR-') ||\n id.startsWith('QR-') ||\n id.startsWith('CON-') ||\n id.startsWith('SEC-REQ-');\n\n if (isRequirement) {\n const matchingTests = reqToTestsMap.get(id) || [];\n const isVerified = isTemplate || matchingTests.length > 0;\n\n if (!isVerified) reqErrors++;\n\n reqAudit.push({\n id: id || 'SIN-ID',\n title: frontmatter.title || 'Sin título',\n file: relPath,\n isTemplate,\n method:\n (frontmatter['verifiable-by'] as string) ||\n (matchingTests.some((t) => t.endsWith('.feature')) ? 'BDD_CUCUMBER' : 'TEST_EXECUTION'),\n testRefs: matchingTests.join(', ') || 'NINGUNA DETECTADA',\n existingCount: matchingTests.length,\n status: isVerified ? 'VERIFICADO_CON_PRUEBA' : 'FALLO_SIN_PRUEBA',\n });\n }\n\n if (Array.isArray(frontmatter.tasks) && frontmatter.tasks.length > 0) {\n for (const t of frontmatter.tasks) {\n const crit = t.verification?.criteria || '';\n const meth = t.verification?.method || 'TEST_EXECUTION';\n const hasProof = isTemplate || (crit.length > 4 && !crit.includes('TODO') && !crit.includes('TBD'));\n\n if (!hasProof) taskErrors++;\n\n taskAudit.push({\n id: t.id,\n title: t.title || 'Sin título',\n file: relPath,\n method: meth,\n commandOrCriteria: crit || 'AUSENTE',\n status: hasProof ? 'VERIFICADO_CON_PRUEBA' : 'FALLO_SIN_PRUEBA',\n });\n }\n }\n } catch {\n // Ignore unparseable files\n }\n }\n\n const reportMarkdown = generateTestingCoverageReportMarkdown(reqAudit, taskAudit, reqErrors, taskErrors);\n\n return {\n success: reqErrors === 0 && taskErrors === 0,\n totalRequirements: reqAudit.length,\n passedRequirements: reqAudit.length - reqErrors,\n failedRequirements: reqErrors,\n totalTasks: taskAudit.length,\n passedTasks: taskAudit.length - taskErrors,\n failedTasks: taskErrors,\n requirements: reqAudit,\n tasks: taskAudit,\n reportMarkdown,\n };\n}\n","/**\n * AI-SDLC: Dynamic Software Composition Analysis (SCA) Scanner\n * Inspects installed dependencies in node_modules, lockfiles, or external SCA tools (Trivy, Syft).\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as child_process from 'child_process';\nimport { ScannedDependency, ScaTool } from '../../types/index.js';\n\nexport interface ScanOptions {\n depth?: 'direct' | 'transitive';\n tool?: ScaTool;\n productionOnly?: boolean;\n}\n\nexport function isToolAvailable(toolName: string): boolean {\n try {\n const cmd = process.platform === 'win32' ? 'where' : 'which';\n child_process.execFileSync(cmd, [toolName], { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function normalizeSpdxLicense(raw: any): string {\n if (!raw) return 'UNKNOWN';\n if (typeof raw === 'string') {\n const trimmed = raw.trim();\n return trimmed.length > 0 ? trimmed : 'UNKNOWN';\n }\n if (Array.isArray(raw)) {\n const parts = raw.map((item) => normalizeSpdxLicense(item)).filter((id) => id !== 'UNKNOWN');\n if (parts.length === 0) return 'UNKNOWN';\n if (parts.length === 1) return parts[0];\n return `(${parts.join(' OR ')})`;\n }\n if (typeof raw === 'object') {\n if (raw.type && typeof raw.type === 'string') return raw.type.trim();\n if (raw.name && typeof raw.name === 'string') return raw.name.trim();\n if (raw.license && typeof raw.license === 'string') return raw.license.trim();\n }\n return 'UNKNOWN';\n}\n\nexport function findLicenseFile(pkgDir: string): string | undefined {\n const candidates = [\n 'LICENSE',\n 'LICENSE.md',\n 'LICENSE.txt',\n 'LICENCE',\n 'LICENCE.md',\n 'LICENCE.txt',\n 'license',\n 'license.md',\n 'license.txt',\n ];\n for (const c of candidates) {\n const full = path.join(pkgDir, c);\n if (fs.existsSync(full)) {\n return full;\n }\n }\n return undefined;\n}\n\nexport function resolveLicenseFromFile(licenseFilePath?: string): string | undefined {\n if (!licenseFilePath || !fs.existsSync(licenseFilePath)) return undefined;\n try {\n const text = fs.readFileSync(licenseFilePath, 'utf-8');\n if (text.includes('Apache License') && text.includes('Version 2.0')) {\n return 'Apache-2.0';\n }\n if (text.includes('MIT License') || text.includes('Permission is hereby granted, free of charge')) {\n return 'MIT';\n }\n if (text.includes('Blue Oak Model License 1.0.0')) {\n return 'BlueOak-1.0.0';\n }\n if (text.includes('Python Software Foundation License') || text.includes('PSF LICENSE AGREEMENT')) {\n return 'Python-2.0';\n }\n if (text.includes('Redistribution and use in source and binary forms') && text.includes('Neither the name')) {\n return 'BSD-3-Clause';\n }\n if (text.includes('ISC License')) {\n return 'ISC';\n }\n if (text.includes('Microsoft Public License') || text.includes('MS-PL')) {\n return 'MS-PL';\n }\n if (text.includes('Microsoft Reciprocal License') || text.includes('MS-RL')) {\n return 'MS-RL';\n }\n } catch {\n // Ignore read error\n }\n return undefined;\n}\n\nexport function readPackageJson(filePath: string): any | null {\n if (!fs.existsSync(filePath)) return null;\n try {\n return JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function extractDirectDepNames(rootDir: string, productionOnly?: boolean): Set<string> {\n const names = new Set<string>();\n const pkgPath = path.join(rootDir, 'package.json');\n const pkg = readPackageJson(pkgPath);\n if (!pkg) return names;\n\n if (pkg.dependencies && typeof pkg.dependencies === 'object') {\n Object.keys(pkg.dependencies).forEach((d) => names.add(d));\n }\n if (!productionOnly && pkg.devDependencies && typeof pkg.devDependencies === 'object') {\n Object.keys(pkg.devDependencies).forEach((d) => names.add(d));\n }\n return names;\n}\n\nexport function processPackageDir(pkgDir: string, directNames: Set<string>, seen: Map<string, ScannedDependency>): void {\n const pkgJsonPath = path.join(pkgDir, 'package.json');\n const pkg = readPackageJson(pkgJsonPath);\n if (!pkg || !pkg.name || !pkg.version) return;\n\n const key = `${pkg.name}@${pkg.version}`;\n if (seen.has(key)) return;\n\n const licFile = findLicenseFile(pkgDir);\n let spdx = normalizeSpdxLicense(pkg.license || pkg.licenses);\n\n if (spdx === 'UNKNOWN' || spdx.toUpperCase().includes('SEE LICENSE')) {\n const inferred = resolveLicenseFromFile(licFile);\n if (inferred) spdx = inferred;\n }\n\n const repoUrl = typeof pkg.repository === 'string' ? pkg.repository : pkg.repository?.url;\n const authorStr = typeof pkg.author === 'string' ? pkg.author : pkg.author?.name;\n\n seen.set(key, {\n name: pkg.name,\n version: pkg.version,\n spdxLicense: spdx,\n purl: `pkg:npm/${pkg.name}@${pkg.version}`,\n path: pkgDir,\n licenseFile: licFile,\n repository: repoUrl,\n author: authorStr,\n isDirect: directNames.has(pkg.name),\n });\n}\n\nexport function scanSubdirectories(baseDir: string, directNames: Set<string>, seen: Map<string, ScannedDependency>): void {\n if (!fs.existsSync(baseDir)) return;\n const entries = fs.readdirSync(baseDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (entry.name.startsWith('@')) {\n const scopeDir = path.join(baseDir, entry.name);\n const scopedEntries = fs.readdirSync(scopeDir, { withFileTypes: true });\n for (const scoped of scopedEntries) {\n if (scoped.isDirectory()) {\n processPackageDir(path.join(scopeDir, scoped.name), directNames, seen);\n }\n }\n } else if (entry.name !== '.bin' && entry.name !== '.pnpm') {\n processPackageDir(path.join(baseDir, entry.name), directNames, seen);\n }\n }\n}\n\nexport function scanPnpmStore(pnpmDir: string, directNames: Set<string>, seen: Map<string, ScannedDependency>): void {\n if (!fs.existsSync(pnpmDir)) return;\n const entries = fs.readdirSync(pnpmDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const candidateModules = path.join(pnpmDir, entry.name, 'node_modules');\n if (fs.existsSync(candidateModules)) {\n scanSubdirectories(candidateModules, directNames, seen);\n }\n }\n}\n\nexport function scanWithNativeFs(rootDir: string, options: ScanOptions = {}): ScannedDependency[] {\n const directNames = extractDirectDepNames(rootDir, options.productionOnly);\n const seen = new Map<string, ScannedDependency>();\n const nmDir = path.join(rootDir, 'node_modules');\n\n if (fs.existsSync(nmDir)) {\n scanSubdirectories(nmDir, directNames, seen);\n if (options.depth !== 'direct') {\n scanPnpmStore(path.join(nmDir, '.pnpm'), directNames, seen);\n }\n }\n\n const allDeps = Array.from(seen.values());\n if (options.depth === 'direct') {\n return allDeps.filter((d) => d.isDirect);\n }\n return allDeps.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function scanWithTrivy(rootDir: string): { dependencies: ScannedDependency[]; executed: boolean } {\n if (!isToolAvailable('trivy')) {\n return { dependencies: [], executed: false };\n }\n try {\n const res = child_process.spawnSync(\n 'trivy',\n ['fs', '--format', 'json', '--security-checks', 'license', rootDir],\n { encoding: 'utf-8', timeout: 30000 }\n );\n if (res.status !== 0 || !res.stdout) {\n return { dependencies: [], executed: false };\n }\n const data = JSON.parse(res.stdout);\n const deps: ScannedDependency[] = [];\n if (Array.isArray(data.Results)) {\n for (const r of data.Results) {\n if (Array.isArray(r.Packages)) {\n for (const p of r.Packages) {\n deps.push({\n name: p.Name,\n version: p.Version || 'unknown',\n spdxLicense: normalizeSpdxLicense(p.Licenses?.[0] || 'UNKNOWN'),\n purl: p.Identifier?.PURL || `pkg:npm/${p.Name}@${p.Version || 'unknown'}`,\n });\n }\n }\n }\n }\n return { dependencies: deps, executed: true };\n } catch {\n return { dependencies: [], executed: false };\n }\n}\n\nexport function scanWithSyft(rootDir: string): { dependencies: ScannedDependency[]; executed: boolean } {\n if (!isToolAvailable('syft')) {\n return { dependencies: [], executed: false };\n }\n try {\n const res = child_process.spawnSync('syft', [`dir:${rootDir}`, '-o', 'json'], {\n encoding: 'utf-8',\n timeout: 30000,\n });\n if (res.status !== 0 || !res.stdout) {\n return { dependencies: [], executed: false };\n }\n const data = JSON.parse(res.stdout);\n const deps: ScannedDependency[] = [];\n if (Array.isArray(data.artifacts)) {\n for (const a of data.artifacts) {\n const lic = a.licenses?.[0]?.value || 'UNKNOWN';\n deps.push({\n name: a.name,\n version: a.version || 'unknown',\n spdxLicense: normalizeSpdxLicense(lic),\n purl: a.purl || `pkg:npm/${a.name}@${a.version || 'unknown'}`,\n author: a.metadata?.author,\n });\n }\n }\n return { dependencies: deps, executed: true };\n } catch {\n return { dependencies: [], executed: false };\n }\n}\n\nexport function scanInstalledLicenses(rootDir: string, options: ScanOptions = {}): ScannedDependency[] {\n const selectedTool = options.tool || 'native';\n\n if (selectedTool === 'trivy') {\n const trivyResult = scanWithTrivy(rootDir);\n if (trivyResult.executed && trivyResult.dependencies.length > 0) {\n return trivyResult.dependencies;\n }\n }\n\n if (selectedTool === 'syft') {\n const syftResult = scanWithSyft(rootDir);\n if (syftResult.executed && syftResult.dependencies.length > 0) {\n return syftResult.dependencies;\n }\n }\n\n return scanWithNativeFs(rootDir, {\n depth: options.depth || 'transitive',\n productionOnly: options.productionOnly,\n });\n}\n","/**\n * AI-SDLC: CycloneDX 1.5 JSON SBOM & Third-Party Notices Generator\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport { CycloneDxBom, CycloneDxComponent, ScannedDependency } from '../../types/index.js';\n\nexport interface SbomGenerateOptions {\n rootDir?: string;\n projectName?: string;\n projectVersion?: string;\n}\n\nexport function buildCycloneDxComponent(dep: ScannedDependency): CycloneDxComponent {\n const comp: CycloneDxComponent = {\n type: 'library',\n name: dep.name,\n version: dep.version,\n purl: dep.purl || `pkg:npm/${dep.name}@${dep.version}`,\n author: dep.author,\n };\n\n if (dep.spdxLicense && dep.spdxLicense !== 'UNKNOWN') {\n comp.licenses = [\n {\n license: {\n id: dep.spdxLicense,\n },\n },\n ];\n } else {\n comp.licenses = [\n {\n license: {\n name: 'NOASSERTION',\n },\n },\n ];\n }\n\n return comp;\n}\n\nexport function generateCycloneDxSbom(\n dependencies: ScannedDependency[],\n options: SbomGenerateOptions = {}\n): CycloneDxBom {\n let name = options.projectName || 'ai-sdlc-project';\n let version = options.projectVersion || '1.0.0';\n\n if (options.rootDir) {\n const pkgPath = path.join(options.rootDir, 'package.json');\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n if (pkg.name) name = pkg.name;\n if (pkg.version) version = pkg.version;\n } catch {\n // Ignore read error\n }\n }\n }\n\n const components = dependencies.map(buildCycloneDxComponent);\n\n return {\n bomFormat: 'CycloneDX',\n specVersion: '1.5',\n version: 1,\n serialNumber: `urn:uuid:${crypto.randomUUID()}`,\n metadata: {\n timestamp: new Date().toISOString(),\n tools: [\n {\n vendor: 'AI-SDLC',\n name: '@aisdlc/core',\n version: '1.0.0',\n },\n ],\n component: {\n type: 'application',\n name,\n version,\n },\n },\n components,\n };\n}\n\nfunction safeWriteFileSync(filePath: string, content: string): void {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n let attempts = 10;\n while (attempts > 0) {\n try {\n const tempPath = `${filePath}.${process.pid}.${Math.random().toString(36).substring(2)}.tmp`;\n fs.writeFileSync(tempPath, content, 'utf-8');\n try {\n if (fs.existsSync(filePath)) {\n fs.rmSync(filePath, { force: true });\n }\n fs.renameSync(tempPath, filePath);\n } catch {\n try {\n fs.copyFileSync(tempPath, filePath);\n fs.unlinkSync(tempPath);\n } catch {\n // ignore fallback error\n }\n }\n return;\n } catch {\n attempts--;\n if (attempts === 0) {\n try {\n fs.writeFileSync(filePath, content, 'utf-8');\n } catch {\n // Ignore transient lock error if another worker already wrote the report\n }\n return;\n }\n const delay = Math.floor(Math.random() * 50) + 50;\n const start = Date.now();\n while (Date.now() - start < delay) {\n // wait\n }\n }\n }\n}\n\nexport function writeCycloneDxSbom(sbom: CycloneDxBom, outputPath: string): void {\n safeWriteFileSync(outputPath, JSON.stringify(sbom, null, 2));\n}\n\nexport function generateThirdPartyNotices(\n dependencies: ScannedDependency[],\n projectName = 'AI-SDLC'\n): string {\n const lines = [\n `# 📜 Third-Party Software Notices and Information`,\n ``,\n `> **Proyecto:** ${projectName}`,\n `> **Fecha:** ${new Date().toISOString().split('T')[0]}`,\n `> **Total Componentes:** ${dependencies.length}`,\n ``,\n `Este documento contiene los avisos de copyright y términos de licencia aplicables a los componentes de terceros utilizados en este proyecto.`,\n ``,\n `---`,\n ``,\n `## Resumen de Licencias de Terceros`,\n ``,\n `| Paquete | Versión | Licencia SPDX |`,\n `| :--- | :--- | :---: |`,\n ];\n\n for (const dep of dependencies) {\n lines.push(`| **\\`${dep.name}\\`** | \\`${dep.version}\\` | \\`${dep.spdxLicense}\\` |`);\n }\n\n lines.push('');\n lines.push('---');\n lines.push('');\n lines.push('## Textos de Licencia y Atribuciones');\n lines.push('');\n\n for (const dep of dependencies) {\n lines.push(`### ${dep.name}@${dep.version}`);\n lines.push(`- **Licencia:** \\`${dep.spdxLicense}\\``);\n if (dep.author) lines.push(`- **Autor:** ${dep.author}`);\n if (dep.repository) lines.push(`- **Repositorio:** ${dep.repository}`);\n\n if (dep.licenseFile && fs.existsSync(dep.licenseFile)) {\n try {\n const text = fs.readFileSync(dep.licenseFile, 'utf-8').trim();\n lines.push('');\n lines.push('```');\n lines.push(text.slice(0, 1000) + (text.length > 1000 ? '\\n... (texto truncado)' : ''));\n lines.push('```');\n } catch {\n // Ignore read error\n }\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nexport function writeThirdPartyNotices(content: string, outputPath: string): void {\n safeWriteFileSync(outputPath, content);\n}\n","/**\n * AI-SDLC: Open Source License Compliance & Governance Verifier\n * Supports dynamic Software Composition Analysis (SCA) with CycloneDX SBOM generation.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n LicensePolicy,\n LicenseVerificationOptions,\n LicenseVerificationResult,\n LicenseViolation,\n ScannedDependency,\n} from '../types/index.js';\nimport { scanInstalledLicenses } from './sca/scanner.js';\nimport {\n generateCycloneDxSbom,\n generateThirdPartyNotices,\n writeCycloneDxSbom,\n writeThirdPartyNotices,\n} from './sca/sbom.js';\n\ninterface RawPolicyCategory {\n action: 'ALLOW' | 'REVIEW_REQUIRED' | 'DENY' | 'COMMERCIAL_APPROVAL_REQUIRED' | string;\n description?: string;\n spdx_identifiers: string[];\n}\n\ninterface RawLicensePolicy {\n version?: string;\n categories?: Record<string, RawPolicyCategory>;\n exceptions?: {\n approved_commercial_packages?: { package: string; license: string; reason?: string }[];\n };\n ci_gates?: {\n generate_sbom?: boolean;\n sbom_format?: string;\n output_notices_file?: string;\n allowed_depth?: 'DIRECT' | 'TRANSITIVE' | string;\n };\n}\n\ninterface ManifestDependency {\n package: string;\n version?: string;\n spdx_license: string;\n category?: string;\n status: string;\n usage?: string;\n commercial_payment_required?: boolean;\n rejection_reason?: string;\n}\n\ninterface ManifestFile {\n evaluated_dependencies?: ManifestDependency[];\n}\n\nconst DEFAULT_PERMITTED = [\n 'MIT',\n 'Apache-2.0',\n 'BSD-2-Clause',\n 'BSD-3-Clause',\n 'ISC',\n 'Unlicense',\n 'CC0-1.0',\n '0BSD',\n 'Zlib',\n 'BlueOak-1.0.0',\n 'Python-2.0',\n 'CC-BY-3.0',\n 'CC-BY-4.0',\n 'MS-PL',\n];\n\nconst DEFAULT_RESTRICTED = [\n 'LGPL-2.1-only',\n 'LGPL-2.1-or-later',\n 'LGPL-3.0-only',\n 'LGPL-3.0-or-later',\n 'MPL-2.0',\n 'EPL-2.0',\n 'CDDL-1.0',\n 'MS-RL',\n 'MS-LPL',\n 'MS-LRL',\n 'SSPL-1.0',\n 'BSL-1.1',\n 'Elastic-2.0',\n 'Redis-Source-Available-1.0',\n 'CockroachDB-BSL',\n 'Commons-Clause',\n];\n\nconst DEFAULT_BLOCKED = [\n 'GPL-2.0-only',\n 'GPL-2.0-or-later',\n 'GPL-3.0-only',\n 'GPL-3.0-or-later',\n 'AGPL-3.0-only',\n 'AGPL-3.0-or-later',\n 'EUPL-1.2',\n 'OSL-3.0',\n];\n\nexport function parseLicensePolicy(content: string): LicensePolicy & { rawPolicy?: RawLicensePolicy } {\n try {\n const doc = yaml.load(content) as RawLicensePolicy;\n const permitted: string[] = [];\n const restricted: string[] = [];\n const blocked: string[] = [];\n const exception_packages: Record<string, string> = {};\n\n if (doc?.categories) {\n for (const [, cat] of Object.entries(doc.categories)) {\n if (cat.action === 'ALLOW') {\n permitted.push(...(cat.spdx_identifiers || []));\n } else if (cat.action === 'REVIEW_REQUIRED' || cat.action === 'COMMERCIAL_APPROVAL_REQUIRED') {\n restricted.push(...(cat.spdx_identifiers || []));\n } else if (cat.action === 'DENY') {\n blocked.push(...(cat.spdx_identifiers || []));\n }\n }\n }\n\n if (doc?.exceptions?.approved_commercial_packages) {\n for (const exp of doc.exceptions.approved_commercial_packages) {\n exception_packages[exp.package] = exp.reason || 'APPROVED';\n }\n }\n\n return {\n version: doc?.version || '1.0',\n permitted: permitted.length > 0 ? permitted : DEFAULT_PERMITTED,\n restricted: restricted.length > 0 ? restricted : DEFAULT_RESTRICTED,\n blocked: blocked.length > 0 ? blocked : DEFAULT_BLOCKED,\n exception_packages,\n rawPolicy: doc,\n };\n } catch {\n return {\n version: '1.0',\n permitted: DEFAULT_PERMITTED,\n restricted: DEFAULT_RESTRICTED,\n blocked: DEFAULT_BLOCKED,\n exception_packages: {},\n };\n }\n}\n\nexport function evaluateCompoundLicense(\n lic: string,\n policy: LicensePolicy\n): { isPermitted: boolean; isBlocked: boolean; isRestricted: boolean } {\n const cleanLic = lic.replace(/[()]/g, '').trim();\n\n if (cleanLic.includes(' OR ')) {\n const parts = cleanLic.split(' OR ').map((p) => p.trim());\n const anyPermitted = parts.some((p) => policy.permitted.includes(p));\n const allBlocked = parts.every((p) => policy.blocked.includes(p));\n return { isPermitted: anyPermitted, isBlocked: allBlocked && !anyPermitted, isRestricted: false };\n }\n\n if (cleanLic.includes(' AND ')) {\n const parts = cleanLic.split(' AND ').map((p) => p.trim());\n const anyBlocked = parts.some((p) => policy.blocked.includes(p));\n const allPermitted = parts.every((p) => policy.permitted.includes(p));\n return { isPermitted: allPermitted, isBlocked: anyBlocked, isRestricted: false };\n }\n\n return {\n isPermitted: policy.permitted.includes(cleanLic),\n isBlocked: policy.blocked.includes(cleanLic),\n isRestricted: policy.restricted.includes(cleanLic),\n };\n}\n\nexport function evaluateSingleDependency(dep: ScannedDependency, policy: LicensePolicy): LicenseViolation | null {\n const lic = dep.spdxLicense;\n if (lic === 'UNKNOWN' || !lic) {\n return {\n packageName: dep.name,\n version: dep.version,\n license: 'UNKNOWN',\n category: 'UNRECOGNIZED',\n reason: `Unknown or unidentified license for \"${dep.name}\". Formal license resolution required.`,\n };\n }\n\n const evalResult = evaluateCompoundLicense(lic, policy);\n\n if (evalResult.isBlocked) {\n return {\n packageName: dep.name,\n version: dep.version,\n license: lic,\n category: 'BLOCKED',\n reason: `License \"${lic}\" is classified as Strong Copyleft / Viral. Prohibited in commercial code or SaaS.`,\n };\n }\n\n if (evalResult.isRestricted) {\n if (policy.exception_packages?.[dep.name]) {\n return null;\n }\n return {\n packageName: dep.name,\n version: dep.version,\n license: lic,\n category: 'RESTRICTED',\n reason: `License \"${lic}\" requires explicit commercial or architecture approval in license-policy.yaml.`,\n };\n }\n\n if (evalResult.isPermitted) {\n return null;\n }\n\n return {\n packageName: dep.name,\n version: dep.version,\n license: lic,\n category: 'UNRECOGNIZED',\n reason: `License \"${lic}\" is not registered in the permitted categories of license-policy.yaml.`,\n };\n}\n\nexport function generateLicenseReportMarkdown(\n dependencies: ScannedDependency[],\n violations: LicenseViolation[],\n policy: LicensePolicy,\n sbomPath?: string\n): string {\n const isOk = violations.length === 0;\n const lines: string[] = [\n `# 📜 Open Source License Compliance Audit (Dynamic SCA)`,\n ``,\n `> **Verification Date:** ${new Date().toISOString()}`,\n `> **Status:** ${isOk ? '✅ COMPLIANT (100% Permitted / Authorized Licenses)' : `❌ NON-COMPLIANT (${violations.length} Violations Detected)`}`,\n `> **Total Audited Dependencies:** ${dependencies.length}`,\n sbomPath ? `> **Generated CycloneDX SBOM:** \\`${sbomPath}\\`` : '',\n ``,\n `---`,\n ``,\n `## 1. Evaluated Dependencies Summary`,\n ``,\n `| Package | Version | SPDX License | Type | AI-SDLC Verdict |`,\n `| :--- | :--- | :---: | :---: | :---: |`,\n ];\n\n for (const dep of dependencies) {\n const violation = violations.find((v) => v.packageName === dep.name);\n const verdict = violation ? `❌ ${violation.category}` : '✅ PERMITTED';\n const depType = dep.isDirect ? 'Direct' : 'Transitive';\n lines.push(`| **\\`${dep.name}\\`** | \\`${dep.version}\\` | \\`${dep.spdxLicense}\\` | ${depType} | ${verdict} |`);\n }\n\n if (violations.length > 0) {\n lines.push('', '---', '', '## 2. License Violations and Alerts', '');\n lines.push('| Package | License | Category | Violation Details |');\n lines.push('| :--- | :---: | :---: | :--- |');\n for (const v of violations) {\n lines.push(`| **\\`${v.packageName}\\`** | \\`${v.license}\\` | \\`${v.category}\\` | ${v.reason} |`);\n }\n }\n\n lines.push('', '---', '', '## 3. Active SPDX Policies');\n lines.push(`- **Permissive (${policy.permitted.length}):** \\`${policy.permitted.slice(0, 8).join('`, `')}${policy.permitted.length > 8 ? '...' : ''}\\``);\n lines.push(`- **Restricted (${policy.restricted.length}):** \\`${policy.restricted.join('`, `')}\\``);\n lines.push(`- **Blocked/Viral (${policy.blocked.length}):** \\`${policy.blocked.join('`, `')}\\``);\n\n return lines.filter(Boolean).join('\\n');\n}\n\nfunction verifyStaticManifest(\n manifestFile: string,\n policy: LicensePolicy\n): { dependencies: ScannedDependency[]; violations: LicenseViolation[]; permittedCount: number } {\n const scanned: ScannedDependency[] = [];\n const violations: LicenseViolation[] = [];\n let permittedCount = 0;\n\n if (fs.existsSync(manifestFile)) {\n try {\n const doc = yaml.load(fs.readFileSync(manifestFile, 'utf-8')) as ManifestFile;\n if (Array.isArray(doc?.evaluated_dependencies)) {\n for (const dep of doc.evaluated_dependencies) {\n const item: ScannedDependency = {\n name: dep.package,\n version: dep.version || 'unknown',\n spdxLicense: dep.spdx_license,\n isDirect: true,\n };\n scanned.push(item);\n\n if (dep.status !== 'APPROVED') {\n continue;\n }\n\n const v = evaluateSingleDependency(item, policy);\n if (v) {\n violations.push(v);\n } else {\n permittedCount++;\n }\n }\n }\n } catch {\n // Ignore unparseable manifest\n }\n }\n\n return { dependencies: scanned, violations, permittedCount };\n}\n\nexport function verifyLicenses(options: LicenseVerificationOptions = {}): LicenseVerificationResult {\n const rootDir = options.rootDir || process.cwd();\n const policyFile = options.policyPath || path.join(rootDir, 'license-policy.yaml');\n\n let policyWithRaw = fs.existsSync(policyFile)\n ? parseLicensePolicy(fs.readFileSync(policyFile, 'utf-8'))\n : parseLicensePolicy('');\n\n const policy: LicensePolicy = {\n version: policyWithRaw.version,\n permitted: policyWithRaw.permitted,\n restricted: policyWithRaw.restricted,\n blocked: policyWithRaw.blocked,\n exception_packages: policyWithRaw.exception_packages,\n };\n\n const isExplicitManifest = Boolean(options.manifestPath || options.dynamic === false);\n\n if (isExplicitManifest) {\n let manifestFile = options.manifestPath;\n if (!manifestFile) {\n const candidatePaths = [\n path.join(rootDir, 'compliance', 'license-manifest.yaml'),\n path.join(rootDir, 'license-manifest.yaml'),\n ];\n manifestFile = candidatePaths.find((p) => fs.existsSync(p)) || candidatePaths[0];\n }\n\n const { dependencies, violations, permittedCount } = verifyStaticManifest(manifestFile, policy);\n const reportMarkdown = generateLicenseReportMarkdown(dependencies, violations, policy);\n\n return {\n success: violations.length === 0,\n totalEvaluated: dependencies.length,\n permittedCount,\n violations,\n reportMarkdown,\n scannedDependencies: dependencies,\n };\n }\n\n // Dynamic SCA Execution\n const depth = options.depth || (policyWithRaw.rawPolicy?.ci_gates?.allowed_depth?.toLowerCase() === 'direct' ? 'direct' : 'transitive');\n const dependencies = scanInstalledLicenses(rootDir, {\n tool: options.tool || 'native',\n depth,\n productionOnly: options.productionOnly,\n });\n\n const violations: LicenseViolation[] = [];\n let permittedCount = 0;\n\n for (const dep of dependencies) {\n const violation = evaluateSingleDependency(dep, policy);\n if (violation) {\n violations.push(violation);\n } else {\n permittedCount++;\n }\n }\n\n // SBOM Generation\n let sbomPath: string | undefined;\n const shouldGenSbom = options.generateSbom !== false && (options.generateSbom === true || Boolean(options.sbomPath) || policyWithRaw.rawPolicy?.ci_gates?.generate_sbom === true);\n if (shouldGenSbom) {\n sbomPath = options.sbomPath || path.join(rootDir, 'reports', 'sbom.cdx.json');\n const sbom = generateCycloneDxSbom(dependencies, { rootDir });\n writeCycloneDxSbom(sbom, sbomPath);\n }\n\n // Notices Generation\n let noticesPath: string | undefined;\n const shouldGenNotices = options.generateNotices === true || Boolean(options.noticesPath) || Boolean(policyWithRaw.rawPolicy?.ci_gates?.output_notices_file);\n if (shouldGenNotices) {\n const noticesFileName = policyWithRaw.rawPolicy?.ci_gates?.output_notices_file || 'THIRD_PARTY_NOTICES.md';\n noticesPath = options.noticesPath || path.join(rootDir, noticesFileName);\n const noticesContent = generateThirdPartyNotices(dependencies);\n writeThirdPartyNotices(noticesContent, noticesPath);\n }\n\n const reportMarkdown = generateLicenseReportMarkdown(dependencies, violations, policy, sbomPath);\n\n return {\n success: violations.length === 0,\n totalEvaluated: dependencies.length,\n permittedCount,\n violations,\n reportMarkdown,\n sbomPath,\n noticesPath,\n scannedDependencies: dependencies,\n };\n}\n","/**\n * AI-SDLC: Progressive Friction & Anti-Bypass Verifier\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n ChangeProfile,\n ProgressiveFrictionOptions,\n ProgressiveFrictionResult,\n} from '../types/index.js';\n\nexport const PROTECTED_BYPASS_PATTERNS: RegExp[] = [\n /^schemas[\\\\/]/i,\n /^examples[\\\\/]security[\\\\/]/i,\n /^specs[\\\\/]security[\\\\/]/i,\n /enclaves?[\\\\/]/i,\n /SEC-ENC-/i,\n /quality-policy\\.ya?ml$/i,\n /license-policy\\.ya?ml$/i,\n /08_security_concept\\.md$/i,\n /09_decisions[\\\\/]/i,\n /migrations?[\\\\/]/i,\n];\n\nexport function detectProfileFromChange(changeDir: string): ChangeProfile {\n if (!fs.existsSync(changeDir)) return 'standard';\n\n const specFile = path.join(changeDir, 'spec.md');\n if (fs.existsSync(specFile)) {\n try {\n const rawSpec = fs.readFileSync(specFile, 'utf-8').replace(/^\\uFEFF/, '');\n const match = rawSpec.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (match) {\n const parsedFm = yaml.load(match[1]) as any;\n if (\n parsedFm &&\n parsedFm.profile &&\n ['patch', 'standard', 'critical'].includes(parsedFm.profile)\n ) {\n return parsedFm.profile as ChangeProfile;\n }\n }\n } catch {\n // Ignore parse failure, fallback\n }\n }\n\n return 'standard';\n}\n\nexport function isPathProtectedFromPatch(filePath: string): boolean {\n const normalized = filePath.replace(/\\\\/g, '/');\n return PROTECTED_BYPASS_PATTERNS.some((pattern) => pattern.test(normalized));\n}\n\nexport function verifyProgressiveFriction(\n options: ProgressiveFrictionOptions = {}\n): ProgressiveFrictionResult {\n const rootDir = options.rootDir || process.cwd();\n let changeDir = options.changeDir;\n\n if (!changeDir && options.changeId) {\n const candidates = [\n path.join(rootDir, 'specs', options.changeId),\n path.join(rootDir, 'specs', 'changes', 'active', options.changeId),\n path.join(rootDir, 'examples', 'specs', options.changeId),\n path.join(rootDir, 'specs', 'changes', 'completed', options.changeId),\n ];\n for (const c of candidates) {\n if (fs.existsSync(c)) {\n changeDir = c;\n break;\n }\n }\n }\n\n const modifiedFiles = options.diffFiles || options.modifiedFiles || [];\n\n const profile: ChangeProfile = changeDir\n ? detectProfileFromChange(changeDir)\n : 'standard';\n\n const violations: string[] = [];\n\n if (profile === 'patch') {\n for (const rawFile of modifiedFiles) {\n const relPath = path.isAbsolute(rawFile)\n ? path.relative(rootDir, rawFile)\n : rawFile;\n\n if (isPathProtectedFromPatch(relPath)) {\n violations.push(\n `[ANTI-PATCH-BYPASS] File '${relPath}' is a protected path (security, schemas, architectural decisions, or master policies). Changes with 'patch' profile are strictly prohibited from modifying these paths. Must be reclassified to 'standard' or 'critical'.`\n );\n }\n }\n }\n\n const bypassed = violations.length > 0;\n const success = !bypassed;\n\n const reportMarkdown = [\n `# 🛡️ Progressive Friction and Anti-Bypass Verification Report`,\n ``,\n `> **Date:** ${new Date().toISOString()}`,\n `> **Evaluated Profile:** \\`${profile.toUpperCase()}\\``,\n `> **Verdict:** ${success ? 'COMPLIANT ✅' : 'BLOCKED ❌'}`,\n ``,\n `---`,\n ``,\n `## 1. Evaluation of Modified Paths (${modifiedFiles.length} files)`,\n ``,\n ];\n\n if (violations.length === 0) {\n reportMarkdown.push(`✔ No Anti-Patch Bypass guardrail violations detected.`);\n } else {\n reportMarkdown.push(`### Detected Violations:`);\n for (const v of violations) {\n reportMarkdown.push(`- ❌ ${v}`);\n }\n }\n\n return {\n success,\n profile,\n bypassed,\n violations,\n bypassedRules: violations,\n evaluatedFiles: modifiedFiles,\n errors: [],\n reportMarkdown: reportMarkdown.join('\\n'),\n };\n}\n","/**\n * AI-SDLC: Deterministic Duplicate Requirements Verifier (Shift-Left Pre-Implementation Gate)\n *\n * Verifies that requirements do not collide or duplicate before coding starts:\n * 1. ID Collisions: Different files declaring the same canonical ID (ERROR)\n * 2. Exact Content / Hash Collisions: Different IDs with identical body / SHA-256 (ERROR)\n * 3. Title Redundancy: High lexical similarity (>= 85%) on normalized titles (ERROR)\n * 4. BDD Tag Collisions: Distinct requirements claiming the same specific cucumber-tags (ERROR)\n * 5. Shared Business Rules: Distinct requirements governing the same atomic BR-* (WARNING)\n *\n * NOTE: Multiple requirements under the same Use Case (UC-*) are EXPLICITLY VALID (SRP).\n */\n\nimport * as crypto from 'crypto';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n ArtifactFrontmatter,\n DuplicateIssue,\n DuplicateVerifierOptions,\n DuplicateVerifierResult,\n} from '../types/index.js';\nimport { walkMdFiles } from '../utils/fs.js';\n\nconst STOP_WORDS = new Set([\n // Spanish\n 'el', 'la', 'los', 'las', 'un', 'una', 'unos', 'unas', 'de', 'del', 'al', 'en',\n 'y', 'o', 'e', 'u', 'a', 'para', 'con', 'por', 'que', 'se', 'su', 'sus',\n // English\n 'the', 'a', 'an', 'and', 'or', 'in', 'on', 'at', 'to', 'for', 'with', 'by',\n 'of', 'is', 'are', 'that', 'this', 'it',\n]);\n\nconst GENERIC_BDD_TAGS = new Set([\n 'automated',\n 'bdd',\n 'manual',\n 'wip',\n 'ignore',\n 'skip',\n 'smoke',\n 'regression',\n 'unit',\n 'e2e',\n 'integration',\n]);\n\nexport interface ScannedRequirement {\n id: string;\n file: string;\n relFile: string;\n title: string;\n version: string;\n type?: string;\n category?: string;\n derivesFrom: string[];\n cucumberTags: string[];\n canonicalHash: string;\n normalizedNormativeText: string;\n}\n\nexport function computeSha256(content: string): string {\n const normalized = content.replace(/\\r\\n/g, '\\n');\n return crypto.createHash('sha256').update(normalized, 'utf-8').digest('hex');\n}\n\nexport function tokenizeTitle(title: string): Set<string> {\n const words = title\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '') // strip accents\n .replace(/[^a-z0-9\\s]/g, ' ')\n .split(/\\s+/)\n .filter((w) => w.length > 2 && !STOP_WORDS.has(w));\n return new Set(words);\n}\n\nexport function calculateJaccardSimilarity(setA: Set<string>, setB: Set<string>): number {\n if (setA.size === 0 && setB.size === 0) return 0;\n let intersectionSize = 0;\n for (const item of setA) {\n if (setB.has(item)) {\n intersectionSize++;\n }\n }\n const unionSize = setA.size + setB.size - intersectionSize;\n return unionSize === 0 ? 0 : intersectionSize / unionSize;\n}\n\nexport function extractNormativeText(body: string): string {\n const secMatch = body.match(/##\\s+1\\.\\s+([^\\n]+)\\r?\\n([\\s\\S]*?)(?=\\r?\\n---|\\r?\\n##|$)/);\n if (secMatch) {\n return secMatch[2].trim().toLowerCase().replace(/\\s+/g, ' ');\n }\n const paragraphs = body\n .split(/\\r?\\n\\r?\\n/)\n .filter((p) => !p.startsWith('#') && p.trim().length > 0);\n return (paragraphs[0] || '').trim().toLowerCase().replace(/\\s+/g, ' ');\n}\n\nexport function isRequirementArtifact(frontmatter: ArtifactFrontmatter): boolean {\n const id = String(frontmatter.id || '');\n const type = String(frontmatter.type || '').toLowerCase();\n const category = String((frontmatter as Record<string, unknown>).category || '').toLowerCase();\n\n return (\n id.startsWith('FR-') ||\n id.startsWith('QR-') ||\n id.startsWith('CON-') ||\n id.startsWith('SEC-REQ-') ||\n id.startsWith('SAF-REQ-') ||\n type === 'requirement' ||\n type === 'security-requirement' ||\n type === 'safety-requirement' ||\n category === 'functional' ||\n category === 'quality' ||\n category === 'constraint' ||\n category === 'security' ||\n category === 'safety'\n );\n}\n\nexport function parseRequirementFile(filePath: string, rootDir: string): ScannedRequirement | null {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return null;\n\n const parsed = yaml.load(match[1]);\n if (!parsed || typeof parsed !== 'object') return null;\n\n const frontmatter = parsed as ArtifactFrontmatter;\n if (!frontmatter.id || !isRequirementArtifact(frontmatter)) {\n return null;\n }\n\n const body = content.substring(match[0].length);\n const relFile = path.relative(rootDir, filePath).replace(/\\\\/g, '/');\n\n const derivesRaw = frontmatter['derives-from'];\n const derivesFrom: string[] = Array.isArray(derivesRaw)\n ? derivesRaw.map(String)\n : derivesRaw\n ? [String(derivesRaw)]\n : [];\n\n const tagsRaw = frontmatter['cucumber-tags'];\n const cucumberTags: string[] = Array.isArray(tagsRaw)\n ? tagsRaw.map((t) => String(t).replace(/^@/, '').toLowerCase().trim())\n : [];\n\n return {\n id: String(frontmatter.id).trim(),\n file: filePath,\n relFile,\n title: String(frontmatter.title || '').trim(),\n version: String(frontmatter.version || '1.0.0').trim(),\n type: frontmatter.type ? String(frontmatter.type) : undefined,\n category: frontmatter.category ? String(frontmatter.category) : undefined,\n derivesFrom,\n cucumberTags,\n canonicalHash: computeSha256(content),\n normalizedNormativeText: extractNormativeText(body),\n };\n } catch {\n return null;\n }\n}\n\nexport function verifyArtifactDuplicates(\n options: DuplicateVerifierOptions = {}\n): DuplicateVerifierResult {\n const rootDir = options.rootDir || process.cwd();\n const threshold = options.titleSimilarityThreshold ?? 0.85;\n\n const allMdFiles = walkMdFiles(rootDir);\n const requirements: ScannedRequirement[] = [];\n\n for (const file of allMdFiles) {\n const relFile = path.relative(rootDir, file).replace(/\\\\/g, '/');\n\n // Skip templates, node_modules, dist, and process documentation\n if (\n relFile.includes('node_modules/') ||\n relFile.includes('dist/') ||\n relFile.includes('.template.') ||\n relFile.startsWith('templates/') ||\n relFile.startsWith('process/') ||\n relFile.startsWith('reports/') ||\n relFile.startsWith('.changeset/')\n ) {\n continue;\n }\n\n const req = parseRequirementFile(file, rootDir);\n if (req) {\n requirements.push(req);\n }\n }\n\n const issues: DuplicateIssue[] = [];\n\n // 1. Check ID collisions across different files\n const idMap = new Map<string, ScannedRequirement>();\n for (const req of requirements) {\n const existing = idMap.get(req.id);\n if (existing) {\n if (existing.relFile !== req.relFile) {\n issues.push({\n type: 'ID_COLLISION',\n severity: 'ERROR',\n id: req.id,\n file: req.relFile,\n conflictingId: existing.id,\n conflictingFile: existing.relFile,\n message: `Identificador duplicado '${req.id}' presente en dos archivos distintos: '${req.relFile}' y '${existing.relFile}'.`,\n });\n }\n } else {\n idMap.set(req.id, req);\n }\n }\n\n // 2. Cross-comparisons between different requirements\n for (let i = 0; i < requirements.length; i++) {\n const a = requirements[i];\n const tokensA = tokenizeTitle(a.title);\n\n for (let j = i + 1; j < requirements.length; j++) {\n const b = requirements[j];\n\n // If they have the same ID, it was already reported as ID_COLLISION\n if (a.id === b.id) continue;\n\n // Check Exact Content / SHA-256 / identical normative text\n if (\n (a.canonicalHash === b.canonicalHash && a.canonicalHash.length > 0) ||\n (a.normalizedNormativeText.length > 20 &&\n a.normalizedNormativeText === b.normalizedNormativeText)\n ) {\n issues.push({\n type: 'EXACT_CONTENT',\n severity: 'ERROR',\n id: a.id,\n file: a.relFile,\n conflictingId: b.id,\n conflictingFile: b.relFile,\n message: `Cuerpo normativo idéntico (copia-pega) detectado entre '${a.id}' (${a.relFile}) y '${b.id}' (${b.relFile}).`,\n });\n continue;\n }\n\n // Check Title Lexical Similarity\n const tokensB = tokenizeTitle(b.title);\n const similarity = calculateJaccardSimilarity(tokensA, tokensB);\n\n if (similarity >= threshold && tokensA.size > 0 && tokensB.size > 0) {\n issues.push({\n type: 'TITLE_SIMILARITY',\n severity: 'ERROR',\n id: a.id,\n file: a.relFile,\n conflictingId: b.id,\n conflictingFile: b.relFile,\n similarityScore: Math.round(similarity * 100) / 100,\n message: `Titles with high lexical redundancy (${Math.round(similarity * 100)}% similarity) between '${a.id}' (\"${a.title}\") and '${b.id}' (\"${b.title}\").`,\n });\n }\n\n // Check BDD tag collision (excluding generic and self tags)\n const specificTagsA = new Set(\n a.cucumberTags.filter((t) => !GENERIC_BDD_TAGS.has(t) && t !== a.id.toLowerCase())\n );\n const specificTagsB = new Set(\n b.cucumberTags.filter((t) => !GENERIC_BDD_TAGS.has(t) && t !== b.id.toLowerCase())\n );\n\n if (specificTagsA.size > 0 && specificTagsB.size > 0 && specificTagsA.size === specificTagsB.size) {\n let allMatch = true;\n for (const tag of specificTagsA) {\n if (!specificTagsB.has(tag)) {\n allMatch = false;\n break;\n }\n }\n if (allMatch) {\n issues.push({\n type: 'BDD_TAG_COLLISION',\n severity: 'ERROR',\n id: a.id,\n file: a.relFile,\n conflictingId: b.id,\n conflictingFile: b.relFile,\n message: `BDD test tag collision: '${a.id}' and '${b.id}' claim the same specific tags: @${Array.from(specificTagsA).join(' @')}.`,\n });\n }\n }\n\n // Check Shared Business Rule (WARNING only)\n const brA = a.derivesFrom.filter((r) => r.startsWith('BR-'));\n const brB = new Set(b.derivesFrom.filter((r) => r.startsWith('BR-')));\n for (const br of brA) {\n if (brB.has(br)) {\n issues.push({\n type: 'SHARED_BUSINESS_RULE',\n severity: 'WARNING',\n id: a.id,\n file: a.relFile,\n conflictingId: b.id,\n conflictingFile: b.relFile,\n message: `Potential logic overlap: both '${a.id}' and '${b.id}' govern the same atomic business rule '${br}'.`,\n });\n }\n }\n }\n }\n\n const errorCount = issues.filter((i) => i.severity === 'ERROR').length;\n const warningCount = issues.filter((i) => i.severity === 'WARNING').length;\n\n const result: DuplicateVerifierResult = {\n success: errorCount === 0,\n totalRequirements: requirements.length,\n errorCount,\n warningCount,\n issues,\n };\n\n result.reportMarkdown = generateDuplicatesReportMarkdown(result);\n return result;\n}\n\nexport function generateDuplicatesReportMarkdown(result: DuplicateVerifierResult): string {\n const isOk = result.success;\n const lines: string[] = [\n `# 🛡️ Duplicate Requirements and Redundancy Audit (Shift-Left Pre-Flight)`,\n ``,\n `> **Evaluation Date:** ${new Date().toISOString()}`,\n `> **Verdict:** ${isOk ? '✅ COMPLIANT (No blocking duplicates)' : `❌ BLOCKED (${result.errorCount} duplicate errors detected)`}`,\n `> **Audited Requirements:** ${result.totalRequirements} | **Errors:** ${result.errorCount} | **Warnings:** ${result.warningCount}`,\n ``,\n `---`,\n ];\n\n if (result.issues.length === 0) {\n lines.push(\n ``,\n `## Compliance Summary`,\n ``,\n `All analyzed requirements respect the unique identifier principle, distinguish titles and normative statements, and present decoupled BDD test scenarios.`,\n `The breakdown of multiple atomic requirements per Use Case (SRP) is compliant.`\n );\n } else {\n lines.push(\n ``,\n `## Violations and Warnings Detail`,\n ``,\n `| Severity | Collision Type | Requirement A | Requirement B | Message |`,\n `| :---: | :--- | :--- | :--- | :--- |`\n );\n\n for (const issue of result.issues) {\n const badge = issue.severity === 'ERROR' ? '🛑 ERROR' : '⚠️ WARNING';\n lines.push(\n `| **${badge}** | \\`${issue.type}\\` | **\\`${issue.id}\\`** (\\`${issue.file}\\`) | ${\n issue.conflictingId ? `\\`${issue.conflictingId}\\` (\\`${issue.conflictingFile}\\`)` : 'N/A'\n } | ${issue.message} |`\n );\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * AI-SDLC: Deterministic Secret Scanning & Credential Leak Verifier (Gitleaks Gate)\n *\n * Implements deterministic secret scanning for:\n * 1. Cloud & SaaS API Keys (AWS, GitHub, Slack, Google, OpenAI, Stripe)\n * 2. Private Keys (RSA, DSA, EC, OPENSSH PEM blocks)\n * 3. JSON Web Tokens (JWT)\n * 4. Generic High-Entropy Tokens & Credentials\n * 5. Git Diff analysis against base branches (shift-left task verification)\n * 6. Seamless delegation/augmentation with native Gitleaks CLI if available.\n */\n\nimport { execFileSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {\n SecretFindingType,\n SecretVerifierOptions,\n SecretVerifierResult,\n SecretViolation,\n} from '../types/index.js';\n\nexport interface SecretRule {\n id: string;\n type: SecretFindingType;\n description: string;\n regex: RegExp;\n minEntropy?: number;\n captureIndex?: number;\n}\n\nexport const SECRET_RULES: readonly SecretRule[] = [\n {\n id: 'SEC-001-PRIVATE-KEY',\n type: 'PRIVATE_KEY',\n description: 'Bloque de clave privada detectado (PEM / RSA / DSA / EC / OPENSSH)',\n regex: /-----BEGIN (?:[A-Z0-9_-]+ )?PRIVATE KEY-----/g,\n },\n {\n id: 'SEC-002-AWS-ACCESS-KEY',\n type: 'AWS_CREDENTIAL',\n description: 'Identificador de clave de acceso AWS (AKIA...)',\n regex: /\\b(AKIA[0-9A-Z]{16})\\b/g,\n captureIndex: 1,\n },\n {\n id: 'SEC-003-AWS-SECRET-KEY',\n type: 'AWS_CREDENTIAL',\n description: 'Clave secreta de acceso AWS asignada en código',\n regex: /(?:aws_secret_access_key|aws_secret_key|secret_key)\\s*[:=]\\s*['\"]([0-9a-zA-Z/+=]{40})['\"]/gi,\n captureIndex: 1,\n minEntropy: 4.2,\n },\n {\n id: 'SEC-004-GITHUB-TOKEN',\n type: 'GITHUB_TOKEN',\n description: 'Token de autenticación personal o de aplicación de GitHub (ghp_, github_pat_, etc.)',\n regex: /\\b(gh[pousr]_[A-Za-z0-9_]{36,255}|github_pat_[0-9a-zA-Z_]{82})\\b/g,\n captureIndex: 1,\n },\n {\n id: 'SEC-005-SLACK-TOKEN',\n type: 'SLACK_TOKEN',\n description: 'Token de bot o webhook de Slack (xox[baprs]-...)',\n regex: /\\b(xox[baprs]-[0-9]{10,13}-[0-9]{10,13}[a-zA-Z0-9-]*)\\b/g,\n captureIndex: 1,\n },\n {\n id: 'SEC-006-GOOGLE-API-KEY',\n type: 'GOOGLE_API_KEY',\n description: 'Clave de API de Google Cloud Platform (AIza...)',\n regex: /\\b(AIza[0-9A-Za-z_-]{35,36})\\b/g,\n captureIndex: 1,\n },\n {\n id: 'SEC-007-OPENAI-API-KEY',\n type: 'OPENAI_API_KEY',\n description: 'Clave de API de OpenAI / Azure OpenAI (sk-...)',\n regex: /\\b(sk-(?:proj-|live-)?[a-zA-Z0-9_-]{32,})\\b/g,\n captureIndex: 1,\n },\n {\n id: 'SEC-008-STRIPE-API-KEY',\n type: 'STRIPE_API_KEY',\n description: 'Clave secreta de API de Stripe (sk_live_... / rk_live_...)',\n regex: /\\b((?:sk|rk)_(?:live|test)_[0-9a-zA-Z]{24,99})\\b/g,\n captureIndex: 1,\n },\n {\n id: 'SEC-009-JWT-TOKEN',\n type: 'JWT_TOKEN',\n description: 'Token JSON Web Token (JWT) con firma criptográfica en texto plano',\n regex: /\\b(eyJ[A-Za-z0-9_-]{10,}\\.eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,})\\b/g,\n captureIndex: 1,\n minEntropy: 4.0,\n },\n {\n id: 'SEC-010-GENERIC-SECRET',\n type: 'GENERIC_HIGH_ENTROPY_SECRET',\n description: 'Asignación de credencial o contraseña genérica con alta entropía de Shannon',\n regex: /(?:api[_-]?key|secret|token|password|auth[_-]?token|access[_-]?token)\\s*[:=]\\s*['\"]([a-zA-Z0-9_\\-=+]{16,})['\"]/gi,\n captureIndex: 1,\n minEntropy: 4.3,\n },\n] as const;\n\nexport const DEFAULT_EXCLUDED_PATTERNS = [\n 'node_modules/',\n 'dist/',\n '.git/',\n '.changeset/',\n 'reports/',\n 'coverage/',\n 'pnpm-lock.yaml',\n 'package-lock.json',\n 'yarn.lock',\n 'tests/secrets.spec.ts',\n];\n\nconst PLACEHOLDER_KEYWORDS = new Set([\n 'placeholder',\n 'your-api-key',\n 'your_secret_key',\n 'test-secret',\n 'sample-token',\n 'dummy_token',\n 'xxxx',\n 'changeme',\n]);\n\n/**\n * Calculates Shannon entropy of a string: H(X) = - sum(p(x) * log2(p(x)))\n */\nexport function calculateShannonEntropy(str: string): number {\n if (!str || str.length === 0) return 0;\n\n const freqMap = new Map<string, number>();\n for (let i = 0; i < str.length; i++) {\n const char = str[i];\n freqMap.set(char, (freqMap.get(char) || 0) + 1);\n }\n\n let entropy = 0;\n const len = str.length;\n for (const count of freqMap.values()) {\n const p = count / len;\n entropy -= p * Math.log2(p);\n }\n\n return Math.round(entropy * 100) / 100;\n}\n\n/**\n * Masks a secret string for safe display and logging (e.g. ghp_1234...5678)\n */\nexport function maskSecret(secret: string): string {\n if (secret.length <= 8) {\n return '***[REDACTED]***';\n }\n const prefixLen = Math.min(6, Math.floor(secret.length / 4));\n const suffixLen = Math.min(4, Math.floor(secret.length / 6));\n const prefix = secret.slice(0, prefixLen);\n const suffix = secret.slice(-suffixLen);\n return `${prefix}****${suffix}`;\n}\n\nexport function isPlaceholderOrIgnored(secret: string, line: string): boolean {\n const lowerSecret = secret.toLowerCase();\n for (const placeholder of PLACEHOLDER_KEYWORDS) {\n if (lowerSecret.includes(placeholder)) return true;\n }\n\n // Check inline suppression comments\n if (\n line.includes('ai-sdlc:allow-secret') ||\n line.includes('gitleaks:allow') ||\n line.includes('pragma: allowlist secret')\n ) {\n return true;\n }\n\n return false;\n}\n\nexport interface DiffLineItem {\n file: string;\n lineNumber: number;\n content: string;\n}\n\nexport function getGitDiffLines(rootDir: string, baseBranch?: string): DiffLineItem[] {\n const lines: DiffLineItem[] = [];\n try {\n const targetBase = baseBranch || 'origin/main';\n let diffOutput = '';\n\n // Check if targetBase exists\n try {\n diffOutput = execFileSync('git', ['diff', '-U0', `${targetBase}...HEAD`], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n });\n } catch {\n // Fallback to diff against HEAD or working tree\n try {\n diffOutput = execFileSync('git', ['diff', '-U0', 'HEAD'], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n });\n } catch {\n diffOutput = '';\n }\n }\n\n if (!diffOutput) {\n // Check unstaged changes as fallback\n diffOutput = execFileSync('git', ['diff', '-U0'], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n });\n }\n\n let currentFile = '';\n let currentLine = 1;\n\n for (const rawLine of diffOutput.split('\\n')) {\n if (rawLine.startsWith('+++ b/')) {\n currentFile = rawLine.substring(6).trim();\n } else if (rawLine.startsWith('@@ ')) {\n // Parse hunk header: @@ -1,1 +15,3 @@\n const match = rawLine.match(/@@ -\\d+(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/);\n if (match) {\n currentLine = parseInt(match[1], 10);\n }\n } else if (rawLine.startsWith('+') && !rawLine.startsWith('+++')) {\n const content = rawLine.substring(1);\n if (currentFile) {\n lines.push({\n file: currentFile,\n lineNumber: currentLine,\n content,\n });\n }\n currentLine++;\n }\n }\n } catch {\n // Git diff failure fallback\n }\n\n return lines;\n}\n\nexport function walkProjectFiles(\n dir: string,\n rootDir: string,\n excludedPatterns: string[] = DEFAULT_EXCLUDED_PATTERNS\n): string[] {\n const results: string[] = [];\n\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relPath = path.relative(rootDir, fullPath).replace(/\\\\/g, '/');\n\n let isExcluded = false;\n for (const pat of excludedPatterns) {\n if (relPath.includes(pat) || relPath.startsWith(pat)) {\n isExcluded = true;\n break;\n }\n }\n\n if (isExcluded) continue;\n\n if (entry.isDirectory()) {\n results.push(...walkProjectFiles(fullPath, rootDir, excludedPatterns));\n } else if (entry.isFile()) {\n results.push(fullPath);\n }\n }\n } catch {\n // Skip inaccessible folders\n }\n\n return results;\n}\n\nexport function isGitleaksInstalled(): boolean {\n try {\n const cmd = process.platform === 'win32' ? 'where' : 'which';\n execFileSync(cmd, ['gitleaks'], { stdio: ['pipe', 'pipe', 'ignore'] });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function runGitleaksCli(rootDir: string): SecretViolation[] {\n const violations: SecretViolation[] = [];\n try {\n const output = execFileSync(\n 'gitleaks',\n ['detect', '--no-git', '--report-format', 'json', '--report-path', 'stdout'],\n {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n }\n );\n\n if (output) {\n const parsed = JSON.parse(output);\n if (Array.isArray(parsed)) {\n for (const item of parsed) {\n const filePath = path.resolve(rootDir, item.File || item.file);\n const relPath = path.relative(rootDir, filePath).replace(/\\\\/g, '/');\n violations.push({\n filePath,\n relPath,\n lineNumber: item.StartLine || item.line || 1,\n type: 'GITLEAKS_FINDING',\n ruleId: item.RuleID || item.ruleID || 'GITLEAKS-MATCH',\n maskedMatch: maskSecret(item.Secret || item.secret || item.Match || ''),\n entropy: item.Entropy || item.entropy,\n message: `Gitleaks detectó credencial [${item.RuleID || 'SECRET'}]: ${item.Description || ''}`,\n });\n }\n }\n }\n } catch {\n // If gitleaks exits with code > 0 it typically means secrets were found or syntax error\n }\n return violations;\n}\n\nexport function scanContentForSecrets(\n content: string,\n filePath: string,\n rootDir: string,\n entropyThreshold = 4.3\n): SecretViolation[] {\n const violations: SecretViolation[] = [];\n const lines = content.split(/\\r?\\n/);\n const relPath = path.relative(rootDir, filePath).replace(/\\\\/g, '/');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line || line.trim().length === 0) continue;\n\n for (const rule of SECRET_RULES) {\n rule.regex.lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = rule.regex.exec(line)) !== null) {\n const rawMatch = rule.captureIndex ? match[rule.captureIndex] : match[0];\n if (!rawMatch || rawMatch.length < 8) continue;\n\n if (isPlaceholderOrIgnored(rawMatch, line)) continue;\n\n const entropy = calculateShannonEntropy(rawMatch);\n if (rule.minEntropy && entropy < (entropyThreshold || rule.minEntropy)) {\n continue;\n }\n\n violations.push({\n filePath,\n relPath,\n lineNumber: i + 1,\n type: rule.type,\n ruleId: rule.id,\n maskedMatch: maskSecret(rawMatch),\n entropy,\n message: `${rule.description} (Entropía: ${entropy})`,\n });\n }\n }\n }\n\n return violations;\n}\n\nexport function verifySecrets(options: SecretVerifierOptions = {}): SecretVerifierResult {\n const rootDir = options.rootDir || process.cwd();\n const entropyThreshold = options.entropyThreshold ?? 4.3;\n const excludePatterns = options.excludePatterns || DEFAULT_EXCLUDED_PATTERNS;\n\n const findings: SecretViolation[] = [];\n let totalFilesScanned = 0;\n let scannedWithGitleaks = false;\n\n // 1. If diff mode is requested, scan git diff lines\n if (options.diff) {\n const diffLines = getGitDiffLines(rootDir, options.baseBranch);\n const fileGroups = new Map<string, DiffLineItem[]>();\n\n for (const item of diffLines) {\n const list = fileGroups.get(item.file) || [];\n list.push(item);\n fileGroups.set(item.file, list);\n }\n\n totalFilesScanned = fileGroups.size;\n\n for (const [relFile, items] of fileGroups) {\n let isExcluded = false;\n for (const pat of excludePatterns) {\n if (relFile.includes(pat) || relFile.startsWith(pat)) {\n isExcluded = true;\n break;\n }\n }\n if (isExcluded) continue;\n\n for (const item of items) {\n const line = item.content;\n for (const rule of SECRET_RULES) {\n rule.regex.lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = rule.regex.exec(line)) !== null) {\n const rawMatch = rule.captureIndex ? match[rule.captureIndex] : match[0];\n if (!rawMatch || rawMatch.length < 8) continue;\n\n if (isPlaceholderOrIgnored(rawMatch, line)) continue;\n\n const entropy = calculateShannonEntropy(rawMatch);\n if (rule.minEntropy && entropy < (entropyThreshold || rule.minEntropy)) {\n continue;\n }\n\n findings.push({\n filePath: path.resolve(rootDir, item.file),\n relPath: item.file,\n lineNumber: item.lineNumber,\n type: rule.type,\n ruleId: rule.id,\n maskedMatch: maskSecret(rawMatch),\n entropy,\n message: `[DIFF] ${rule.description} (Entropía: ${entropy})`,\n });\n }\n }\n }\n }\n } else {\n // 2. Full project scan\n const allFiles = walkProjectFiles(rootDir, rootDir, excludePatterns);\n totalFilesScanned = allFiles.length;\n\n for (const file of allFiles) {\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const fileViolations = scanContentForSecrets(content, file, rootDir, entropyThreshold);\n findings.push(...fileViolations);\n } catch {\n // Skip unreadable files\n }\n }\n }\n\n // 3. Delegate to Gitleaks CLI if requested or available\n if (options.gitleaks || (options.gitleaks === undefined && isGitleaksInstalled())) {\n try {\n const gitleaksFindings = runGitleaksCli(rootDir);\n if (gitleaksFindings.length > 0) {\n scannedWithGitleaks = true;\n // Merge without duplicating same file and line\n for (const gf of gitleaksFindings) {\n const exists = findings.some(\n (f) => f.relPath === gf.relPath && Math.abs(f.lineNumber - gf.lineNumber) <= 1\n );\n if (!exists) {\n findings.push(gf);\n }\n }\n }\n } catch {\n // Gitleaks failure fallback\n }\n }\n\n const result: SecretVerifierResult = {\n success: findings.length === 0,\n totalFilesScanned,\n findingsCount: findings.length,\n findings,\n scannedWithGitleaks,\n };\n\n result.reportMarkdown = generateSecretsReportMarkdown(result);\n return result;\n}\n\nexport function generateSecretsReportMarkdown(result: SecretVerifierResult): string {\n const isOk = result.success;\n const lines: string[] = [\n `# 🔐 Deterministic Secrets and Credentials Audit (Gitleaks Gate)`,\n ``,\n `> **Evaluation Date:** ${new Date().toISOString()}`,\n `> **Verdict:** ${isOk ? '✅ COMPLIANT (No exposed secrets or credentials)' : `❌ BLOCKED (${result.findingsCount} exposed credentials detected)`}`,\n `> **Audited Files:** ${result.totalFilesScanned} | **Security Violations:** ${result.findingsCount}`,\n `> **Native Gitleaks Engine:** ${result.scannedWithGitleaks ? '🟢 Active / Integrated' : '⚪ Deterministic Native Scanner (@aisdlc/core)'}`,\n ``,\n `---`,\n ];\n\n if (result.findings.length === 0) {\n lines.push(\n ``,\n `## Compliance Summary`,\n ``,\n `The repository and analyzed diffs are free of private keys, Cloud/SaaS provider API tokens (AWS, GitHub, Google, OpenAI, Slack, Stripe), plaintext JWTs, or high-entropy secrets.`,\n `Credentials security Quality Gate is APPROVED (EXIT 0).`\n );\n } else {\n lines.push(\n ``,\n `## Detected Secret Leaks Detail`,\n ``,\n `| Severity | Rule | Type | File:Line | Token (Masked) | Details |`,\n `| :---: | :--- | :--- | :--- | :--- | :--- |`\n );\n\n for (const f of result.findings) {\n lines.push(\n `| 🛑 **CRITICAL** | \\`${f.ruleId}\\` | \\`${f.type}\\` | \\`${f.relPath}:${f.lineNumber}\\` | \\`${f.maskedMatch}\\` | ${f.message} |`\n );\n }\n\n lines.push(\n ``,\n `## 🚨 Mandatory Remediation Protocol (Exit Code 4)`,\n ``,\n `1. **Immediate Revocation**: Any credential or token detected above must be considered compromised and immediately revoked at the respective provider.`,\n `2. **Rotation and Secure Storage**: Migrate credentials to protected environment variables or secrets management vaults (Vault, AWS Secrets Manager, GitHub Secrets).`,\n `3. **Git History Purge**: If the secret was committed, purge it from Git history with \\`git filter-repo\\` or BFG before merging.`,\n `4. **False Positives**: For legitimate test fixtures or non-secret strings, add \\`// ai-sdlc:allow-secret\\` on the offending line or add the path to \\`.secretsignore\\`.`\n );\n }\n\n return lines.join('\\n');\n}\n","/**\n * AI-SDLC: Shift-Left SAST (Static Application Security Testing) Verifier\n *\n * Deterministic semantic analysis for AI-generated vulnerability hotspots:\n * 1. SQL Injection via dynamic string concatenation / interpolation\n * 2. OS Command Injection (eval, exec, spawn with shell: true)\n * 3. Server-Side Request Forgery (SSRF) via unvalidated external fetches\n * 4. Path Traversal in filesystem operations\n * 5. Optional delegation to Semgrep CLI if installed.\n */\n\nimport { execFileSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {\n PromptInjectionFinding,\n SastFindingType,\n SastSeverity,\n SastVerifierOptions,\n SastVerifierResult,\n SastViolation,\n} from '../types/index.js';\n\nexport const GENERAL_SOURCE_EXTENSIONS: readonly string[] = [\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs',\n '.py',\n '.cs',\n '.java',\n '.kt',\n '.scala',\n '.c',\n '.cpp',\n '.cc',\n '.cxx',\n '.h',\n '.hpp',\n '.go',\n '.rs',\n '.php',\n '.rb',\n '.swift',\n '.prompt',\n];\n\nexport interface SastRule {\n id: string;\n type: SastFindingType;\n severity: SastSeverity;\n description: string;\n pattern: RegExp;\n fileExtensions?: readonly string[];\n}\n\nexport const SAST_RULES: readonly SastRule[] = [\n {\n id: 'SAST-001-SQL-INJECTION',\n type: 'SQL_INJECTION',\n severity: 'CRITICAL',\n description: 'Concatenación o interpolación directa de variables en consulta SQL dinámica',\n pattern: /(?:\\.query|\\.execute|\\.raw)\\s*\\(\\s*(?:`[^`]*(?:SELECT|INSERT|UPDATE|DELETE|DROP|ALTER)[^`]*\\$\\{[^}]+\\}[^`]*`|['\"][^'\"]*(?:SELECT|INSERT|UPDATE|DELETE|DROP|ALTER)[^'\"]*['\"]\\s*\\+)/i,\n fileExtensions: ['.ts', '.js', '.tsx', '.jsx', '.py', '.go', '.java', '.kt', '.cs', '.php', '.rb', '.cpp', '.c'],\n },\n {\n id: 'SAST-002-COMMAND-INJECTION',\n type: 'COMMAND_INJECTION',\n severity: 'CRITICAL',\n description: 'Ejecución dinámica de comandos del sistema operativo con argumentos variables',\n pattern: /(?:child_process\\.(?:exec|execSync)|(?<!\\.)\\b(?:exec|execSync))\\s*\\(\\s*(?:`[^`]*\\$\\{[^}]+\\}[^`]*`|[a-zA-Z0-9_]+\\s*\\+|[a-zA-Z0-9_]+\\))/i,\n fileExtensions: ['.ts', '.js', '.mjs', '.cjs', '.py', '.go', '.java', '.cs', '.php', '.rb'],\n },\n {\n id: 'SAST-003-UNSAFE-EVAL',\n type: 'UNSAFE_EVAL',\n severity: 'CRITICAL',\n description: 'Uso de evaluación dinámica de código (eval o Function constructor)',\n pattern: /(?<!\\.)\\b(?:eval\\s*\\(|new\\s+Function\\s*\\()/g,\n fileExtensions: ['.ts', '.js', '.py', '.php', '.rb', '.cs'],\n },\n {\n id: 'SAST-004-SSRF-UNVALIDATED-FETCH',\n type: 'SSRF',\n severity: 'HIGH',\n description: 'Petición de red saliente (fetch/http/axios) con URL dinámica sin validación previa',\n pattern: /(?:fetch|axios\\.(?:get|post|put|delete)|http\\.(?:get|request))\\s*\\(\\s*(?:req\\.(?:query|params|body)|urlParam|targetUrl|userInput|remoteUrl)\\b/i,\n fileExtensions: ['.ts', '.js', '.py', '.go', '.java', '.cs', '.php', '.rb'],\n },\n {\n id: 'SAST-005-PATH-TRAVERSAL',\n type: 'PATH_TRAVERSAL',\n severity: 'HIGH',\n description: 'Lectura o escritura en sistema de archivos construida directamente desde parámetros no saneados',\n pattern: /fs\\.(?:readFileSync|readFile|createReadStream|writeFileSync)\\s*\\(\\s*(?:path\\.join\\([^)]*req\\.(?:query|params|body)|req\\.(?:query|params|body))/i,\n fileExtensions: ['.ts', '.js', '.py', '.go', '.java', '.cs'],\n },\n {\n id: 'SAST-006-PROMPT-INJECTION-CONCAT',\n type: 'PROMPT_INJECTION_RISK',\n severity: 'HIGH',\n description: 'Interpolación o concatenación directa de entradas de usuario en llamadas a LLM o plantillas de prompts sin delimitación defensiva (OWASP LLM01)',\n pattern: /(?:(?:(?:\\b(?:prompt|system_?prompt|user_?prompt|prompt_?template|prompt_?text|llm_?prompt)\\b\\s*(?::=|\\+=|\\+|=))|(?:messages\\s*:\\s*\\[[^\\n]*content\\s*:\\s*)|(?:generateContent|chat\\.completions\\.create)\\s*\\()\\s*(?:`[^`]*\\$\\{[^}]*(?:req\\.|user_?input|raw_?input|client_?input)[^}]*\\}`|f[\"'][^\"']*\\{[^}]*(?:req|user_?input|raw_?input|client_?input)[^}]*\\}[\"']|\\$[\"'][^\"']*\\{[^}]*(?:req|user_?input|raw_?input|client_?input)[^}]*\\}[\"']|format!\\s*\\([^)]*(?:user_?input|raw_?input|req)[^)]*\\)|(?:fmt\\.)?Sprintf\\s*\\([^)]*(?:user_?input|raw_?input|req)[^)]*\\)|(?:[\"'][^\"']*[\"']\\s*\\+\\s*|\\+\\s*[\"'][^\"']*[\"']\\s*\\+?\\s*|\\s*\\+=\\s*)(?:req\\.(?:body|query|params|getParameter)|user_?input|raw_?input|client_?input)))/i,\n fileExtensions: GENERAL_SOURCE_EXTENSIONS,\n },\n {\n id: 'SAST-007-PROMPT-INJECTION-JAILBREAK',\n type: 'PROMPT_INJECTION_RISK',\n severity: 'CRITICAL',\n description:\n 'Firma o vector adversarial de inyección de prompt o anulación de directivas de sistema (Jailbreak / Inyección LLM01)', // ai-sdlc:allow-prompt-injection\n pattern: /(?:\\b(?:ignore|disregard|forget)\\s+(?:all\\s+)?(?:previous|prior|above)\\s+(?:instructions|prompts|directions|rules)\\b|\\b(?:system\\s+(?:prompt\\s+)?override|override\\s+system\\s+prompt|developer\\s+mode\\s+enabled|dan\\s+mode(?:\\s+enabled)?|unfiltered\\s+(?:ai\\s+)?mode)\\b|\\b(?:reveal|print|output)\\s+(?:your\\s+)?(?:system\\s+prompt|initial\\s+instructions)\\b|<\\/(?:system|instructions)>\\s*(?:new\\s+instructions|you\\s+are\\s+now|system:)|\\[(?:SYSTEM|SYSTEM_OVERRIDE)\\])/i,\n fileExtensions: GENERAL_SOURCE_EXTENSIONS,\n },\n] as const;\n\nexport const DEFAULT_SAST_EXCLUDES = [\n 'node_modules/',\n 'dist/',\n '.git/',\n 'reports/',\n 'coverage/',\n 'templates/',\n 'fixtures/',\n 'tests/',\n];\n\nexport function isSemgrepInstalled(): boolean {\n try {\n const cmd = process.platform === 'win32' ? 'where' : 'which';\n execFileSync(cmd, ['semgrep'], { stdio: ['pipe', 'pipe', 'ignore'] });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function runSemgrepCli(rootDir: string): SastViolation[] {\n const violations: SastViolation[] = [];\n try {\n const output = execFileSync(\n 'semgrep',\n ['scan', '--config', 'auto', '--json', '--quiet'],\n {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n }\n );\n\n if (output) {\n const parsed = JSON.parse(output);\n if (Array.isArray(parsed.results)) {\n for (const item of parsed.results) {\n const filePath = path.resolve(rootDir, item.path);\n const relPath = path.relative(rootDir, filePath).replace(/\\\\/g, '/');\n violations.push({\n filePath,\n relPath,\n lineNumber: item.start?.line || 1,\n ruleId: item.check_id || 'SEMGREP-RULE',\n type: 'SEMGREP_FINDING',\n severity: (item.extra?.severity?.toUpperCase() || 'HIGH') as SastSeverity,\n snippet: (item.extra?.lines || '').trim(),\n message: `Semgrep [${item.check_id}]: ${item.extra?.message || ''}`,\n });\n }\n }\n }\n } catch {\n // Semgrep CLI failure fallback\n }\n return violations;\n}\n\nexport function walkSourceFiles(\n dir: string,\n rootDir: string,\n excludes: string[] = DEFAULT_SAST_EXCLUDES\n): string[] {\n const files: string[] = [];\n\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relPath = path.relative(rootDir, fullPath).replace(/\\\\/g, '/');\n\n let isExcluded = false;\n for (const exc of excludes) {\n if (relPath.includes(exc) || relPath.startsWith(exc)) {\n isExcluded = true;\n break;\n }\n }\n if (isExcluded) continue;\n\n if (entry.isDirectory()) {\n files.push(...walkSourceFiles(fullPath, rootDir, excludes));\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name).toLowerCase();\n if (GENERAL_SOURCE_EXTENSIONS.includes(ext)) {\n files.push(fullPath);\n }\n }\n }\n } catch {\n // Skip\n }\n\n return files;\n}\n\nexport function scanFileForSast(\n filePath: string,\n rootDir: string,\n minSeverity: SastSeverity = 'HIGH'\n): SastViolation[] {\n const violations: SastViolation[] = [];\n const ext = path.extname(filePath).toLowerCase();\n\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const lines = content.split(/\\r?\\n/);\n const relPath = path.relative(rootDir, filePath).replace(/\\\\/g, '/');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (\n line.includes('ai-sdlc:allow-sast') ||\n line.includes('ai-sdlc:allow-prompt-injection') ||\n line.includes('nosec')\n )\n continue;\n\n for (const rule of SAST_RULES) {\n if (rule.fileExtensions && !rule.fileExtensions.includes(ext)) continue;\n\n if (minSeverity === 'CRITICAL' && rule.severity !== 'CRITICAL') continue;\n\n rule.pattern.lastIndex = 0;\n if (rule.pattern.test(line)) {\n violations.push({\n filePath,\n relPath,\n lineNumber: i + 1,\n ruleId: rule.id,\n type: rule.type,\n severity: rule.severity,\n snippet: line.trim(),\n message: rule.description,\n });\n }\n }\n }\n } catch {\n // Skip\n }\n\n return violations;\n}\n\nexport function verifySast(options: SastVerifierOptions = {}): SastVerifierResult {\n const rootDir = options.rootDir || process.cwd();\n const minSeverity = options.minSeverity || 'HIGH';\n const targetDirs = options.targetDirectories || ['src', 'packages', 'prompts'];\n\n const filesToScan: string[] = [];\n for (const tDir of targetDirs) {\n const fullDir = path.join(rootDir, tDir);\n if (fs.existsSync(fullDir)) {\n filesToScan.push(...walkSourceFiles(fullDir, rootDir));\n }\n }\n\n const violations: SastViolation[] = [];\n for (const file of filesToScan) {\n violations.push(...scanFileForSast(file, rootDir, minSeverity));\n }\n\n // Delegate to Semgrep if requested or available\n if (options.semgrep || (options.semgrep === undefined && isSemgrepInstalled())) {\n try {\n const semgrepFindings = runSemgrepCli(rootDir);\n violations.push(...semgrepFindings);\n } catch {\n // Semgrep failure fallback\n }\n }\n\n const result: SastVerifierResult = {\n success: violations.length === 0,\n totalFilesScanned: filesToScan.length,\n violationsCount: violations.length,\n violations,\n };\n\n result.reportMarkdown = generateSastReportMarkdown(result);\n return result;\n}\n\nexport function generateSastReportMarkdown(result: SastVerifierResult): string {\n const isOk = result.success;\n const lines: string[] = [\n `# 🛡️ Shift-Left SAST Audit (Static Application Security Testing)`,\n ``,\n `> **Evaluation Date:** ${new Date().toISOString()}`,\n `> **Verdict:** ${isOk ? '✅ COMPLIANT (No vulnerable patterns detected)' : `❌ BLOCKED (${result.violationsCount} vulnerabilities detected)`}`,\n `> **Audited Code Files:** ${result.totalFilesScanned} | **SAST Violations:** ${result.violationsCount}`,\n ``,\n `---`,\n ];\n\n if (result.violations.length === 0) {\n lines.push(\n ``,\n `## Compliance Summary`,\n ``,\n `No SQL injection, arbitrary dynamic command execution (eval/exec), SSRF, path traversal, or prompt injection (OWASP LLM01) patterns detected in analyzed code modules.`,\n `Code generated by humans and agents complies with OWASP Top 10 and OWASP Top 10 for LLMs secure coding standards.`\n );\n } else {\n lines.push(\n ``,\n `## Detected Security Findings Detail`,\n ``,\n `| Severity | Rule | Type | File:Line | Snippet | Details |`,\n `| :---: | :--- | :--- | :--- | :--- | :--- |`\n );\n\n for (const v of result.violations) {\n const badge = v.severity === 'CRITICAL' ? '🛑 CRITICAL' : '⚠️ HIGH';\n lines.push(\n `| **${badge}** | \\`${v.ruleId}\\` | \\`${v.type}\\` | \\`${v.relPath}:${v.lineNumber}\\` | \\`${v.snippet.replace(/\\|/g, '\\\\|')}\\` | ${v.message} |`\n );\n }\n }\n\n return lines.join('\\n');\n}\n\nexport const PROMPT_INJECTION_SIGNATURES: readonly {\n ruleId: string;\n severity: SastSeverity;\n regex: RegExp;\n message: string;\n}[] = [\n {\n ruleId: 'PROMPT-INJ-JAILBREAK',\n severity: 'CRITICAL',\n regex: /(?:\\b(?:ignore|disregard|forget)\\s+(?:all\\s+)?(?:previous|prior|above)\\s+(?:instructions|prompts|directions|rules)\\b)/i,\n message: 'Attempted bypass or disregard of prior system instructions',\n },\n {\n ruleId: 'PROMPT-INJ-MODE-OVERRIDE',\n severity: 'CRITICAL',\n regex: /(?:\\b(?:system\\s+(?:prompt\\s+)?override|override\\s+system\\s+prompt|developer\\s+mode\\s+enabled|dan\\s+mode(?:\\s+enabled)?|unfiltered\\s+(?:ai\\s+)?mode)\\b)/i,\n message: 'Attempted system prompt override, developer mode, or unrestricted mode activation', // ai-sdlc:allow-prompt-injection\n },\n {\n ruleId: 'PROMPT-INJ-LEAK',\n severity: 'HIGH',\n regex: /(?:\\b(?:reveal|print|output|display)\\s+(?:your\\s+)?(?:system\\s+prompt|initial\\s+instructions|base\\s+prompt)\\b)/i,\n message: 'Attempted extraction or exfiltration of system prompt or instructions (Prompt Leaking)',\n },\n {\n ruleId: 'PROMPT-INJ-DELIMITER-ESCAPE',\n severity: 'CRITICAL',\n regex: /(?:<\\/(?:system|instructions|prompt|context)>\\s*(?:new\\s+instructions|you\\s+are\\s+now|system:)|\\[(?:SYSTEM|SYSTEM_OVERRIDE|ADMIN)\\])/i,\n message: 'Delimiter injection attempt to escape context boundaries or inject roles',\n },\n {\n ruleId: 'PROMPT-INJ-ROLE-SPOOFING',\n severity: 'HIGH',\n regex: /(?:\\r?\\n|^)\\s*(?:System|Admin|Root):\\s*(?:You\\s+are|Override|Ignore|Execute)/i,\n message: 'Attempted role spoofing or privileged role impersonation',\n },\n];\n\nexport function detectPromptInjection(content: string): PromptInjectionFinding[] {\n const findings: PromptInjectionFinding[] = [];\n if (!content) return findings;\n\n const lines = content.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line.includes('ai-sdlc:allow-prompt-injection') || line.includes('nosec')) continue;\n\n for (const sig of PROMPT_INJECTION_SIGNATURES) {\n sig.regex.lastIndex = 0;\n if (sig.regex.test(line)) {\n findings.push({\n ruleId: sig.ruleId,\n severity: sig.severity,\n pattern: sig.regex.source,\n snippet: line.trim(),\n lineNumber: i + 1,\n message: sig.message,\n });\n }\n }\n }\n\n // Multiline checks\n for (const sig of PROMPT_INJECTION_SIGNATURES) {\n if (sig.ruleId === 'PROMPT-INJ-ROLE-SPOOFING') {\n sig.regex.lastIndex = 0;\n if (sig.regex.test(content)) {\n const alreadyFound = findings.some((f) => f.ruleId === sig.ruleId);\n if (!alreadyFound) {\n findings.push({\n ruleId: sig.ruleId,\n severity: sig.severity,\n pattern: sig.regex.source,\n snippet: content.slice(0, 100).trim(),\n message: sig.message,\n });\n }\n }\n }\n }\n\n return findings;\n}\n\n","/**\n * AI-SDLC: Automated Formal Quality Report Generator (Polyglot)\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { QualityReportOptions, QualityReportResult } from '../types/index.js';\nimport { verifyQualityGate } from '../verifiers/quality-gate.js';\n\nexport function calculateRating(mi: number, cc: number): 'A' | 'B' | 'C' | 'D' | 'F' {\n if (mi >= 75 && cc <= 5) return 'A';\n if (mi >= 60 && cc <= 10) return 'B';\n if (mi >= 50 && cc <= 15) return 'C';\n if (mi >= 40 && cc <= 20) return 'D';\n return 'F';\n}\n\nexport function detectLanguage(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n switch (ext) {\n case '.ts':\n return 'TypeScript';\n case '.js':\n return 'JavaScript';\n case '.py':\n return 'Python';\n case '.java':\n return 'Java';\n case '.go':\n return 'Go';\n case '.cs':\n return 'C#';\n case '.rs':\n return 'Rust';\n case '.cpp':\n case '.c':\n return 'C/C++';\n default:\n return 'Unknown';\n }\n}\n\nexport function generateQualityReport(options: QualityReportOptions = {}): QualityReportResult {\n const rootDir = options.rootDir || process.cwd();\n const gateResult = verifyQualityGate({\n rootDir,\n policyPath: options.policyPath,\n thresholds: options.thresholds,\n });\n\n const totalFiles = gateResult.totalFiles;\n const totalFunctions = gateResult.totalFunctions;\n\n let totalMi = 0;\n let totalCc = 0;\n let totalCognitive = 0;\n let totalLoc = 0;\n\n const langMap = new Map<string, { fns: number; loc: number; miSum: number; ccSum: number }>();\n const violationsList: string[] = [];\n\n for (const fn of gateResult.results) {\n totalMi += fn.maintainability;\n totalCc += fn.cyclomatic;\n totalCognitive += fn.cognitive;\n totalLoc += fn.loc;\n\n const lang = detectLanguage(fn.filePath);\n const existing = langMap.get(lang) || { fns: 0, loc: 0, miSum: 0, ccSum: 0 };\n existing.fns++;\n existing.loc += fn.loc;\n existing.miSum += fn.maintainability;\n existing.ccSum += fn.cyclomatic;\n langMap.set(lang, existing);\n\n if (fn.violations.length > 0) {\n violationsList.push(`- **\\`${fn.relPath}\\`** [\\`${fn.functionName}\\`]: ${fn.violations.join(', ')}`);\n }\n }\n\n const avgMaintainability = totalFunctions > 0 ? Math.round((totalMi / totalFunctions) * 10) / 10 : 100;\n const avgCyclomatic = totalFunctions > 0 ? Math.round((totalCc / totalFunctions) * 10) / 10 : 1;\n const avgCognitive = totalFunctions > 0 ? Math.round((totalCognitive / totalFunctions) * 10) / 10 : 0;\n const globalRating = calculateRating(avgMaintainability, avgCyclomatic);\n const verdict = gateResult.success ? 'PASS' : 'FAIL';\n\n const lines: string[] = [\n `# 📊 Formal Quality and Release Gate Report (AI-SDLC)`,\n ``,\n `> **Generation Date:** ${new Date().toISOString()}`,\n `> **Release Gate Verdict:** ${verdict === 'PASS' ? '🟢 APPROVED (RELEASE READY)' : '🔴 BLOCKED (VIOLATIONS DETECTED)'}`,\n `> **Global Rating:** **\\`${globalRating}\\`** (MI Index: ${avgMaintainability}/100, Average CC: ${avgCyclomatic})`,\n ``,\n `---`,\n ``,\n `## 1. Executive Metric Summary`,\n ``,\n `| Key Metric | Measured Value | Policy Threshold | Compliance |`,\n `| :--- | :---: | :---: | :---: |`,\n `| **Analyzed Files** | \\`${totalFiles}\\` | N/A | ℹ️ |`,\n `| **Evaluated Functions** | \\`${totalFunctions}\\` | N/A | ℹ️ |`,\n `| **Lines of Code (LOC)** | \\`${totalLoc}\\` | N/A | ℹ️ |`,\n `| **Cyclomatic Complexity (Average)** | \\`${avgCyclomatic}\\` | $\\\\le ${gateResult.policy.max_cyclomatic}$ | ${avgCyclomatic <= gateResult.policy.max_cyclomatic ? '✅ COMPLIANT' : '❌ EXCEEDED'} |`,\n `| **Cognitive Complexity (Average)** | \\`${avgCognitive}\\` | $\\\\le ${gateResult.policy.max_cognitive}$ | ${avgCognitive <= gateResult.policy.max_cognitive ? '✅ COMPLIANT' : '❌ EXCEEDED'} |`,\n `| **Maintainability Index (SEI MI)** | \\`${avgMaintainability} / 100\\` | $\\\\ge ${gateResult.policy.min_maintainability}$ | ${avgMaintainability >= gateResult.policy.min_maintainability ? '✅ COMPLIANT' : '❌ INSUFFICIENT'} |`,\n `| **Functions in Violation** | \\`${gateResult.failCount}\\` | $0$ (Mode ${gateResult.policy.enforce_mode}) | ${gateResult.failCount === 0 ? '✅ 0 VIOLATIONS' : '❌ BLOCKED'} |`,\n ``,\n `---`,\n ``,\n `## 2. Polyglot Breakdown by Language Ecosystem`,\n ``,\n `| Language | Functions | Total LOC | Average MI | Average CC | Rating |`,\n `| :--- | :---: | :---: | :---: | :---: | :---: |`,\n ];\n\n for (const [lang, stats] of langMap.entries()) {\n const langMi = Math.round((stats.miSum / stats.fns) * 10) / 10;\n const langCc = Math.round((stats.ccSum / stats.fns) * 10) / 10;\n const rating = calculateRating(langMi, langCc);\n lines.push(\n `| **${lang}** | \\`${stats.fns}\\` | \\`${stats.loc}\\` | \\`${langMi}\\` | \\`${langCc}\\` | \\`${rating}\\` |`\n );\n }\n\n if (violationsList.length > 0) {\n lines.push('');\n lines.push('---');\n lines.push('');\n lines.push('## 3. Quality Gate Violations Log');\n lines.push('');\n lines.push(...violationsList);\n }\n\n lines.push('');\n lines.push('---');\n lines.push('');\n lines.push('## 4. Evaluation Criteria and Standards');\n lines.push('- **McCabe Cyclomatic Complexity (CC)**: Number of linearly independent paths.');\n lines.push('- **Maintainability Index (SEI MI)**: Normalized formula [0 - 100] combining Halstead Volume, CC, and LOC.');\n lines.push('- **Clean Code Guardrails**: Prohibition of implicit `any` typing, function length limits ($\\le 40$ lines), and zero unjustified suppressions.');\n\n const markdown = lines.join('\\n');\n\n // Optionally write to reports/QUALITY_REPORT.md\n const reportsDir = path.join(rootDir, 'reports');\n fs.mkdirSync(reportsDir, { recursive: true });\n fs.writeFileSync(path.join(reportsDir, 'QUALITY_REPORT.md'), markdown, 'utf-8');\n\n return {\n markdown,\n totalFiles,\n totalFunctions,\n avgMaintainability,\n avgCyclomatic,\n verdict,\n };\n}\n","/**\n * AI-SDLC: 4-Tier Git Branching Model & Hierarchy Planner\n */\n\nimport {\n BranchClassificationResult,\n BranchHierarchyPlan,\n} from '../types/index.js';\n\nexport const BRANCH_PATTERNS = {\n MAIN: /^main$/,\n RELEASE: /^release\\/v[0-9]+\\.[0-9]+\\.[0-9]+(-[0-9A-Za-z.-]+)?$/,\n FEATURE: /^(feat|feature)\\/(?:v[0-9]+\\.[0-9]+\\.[0-9]+\\/)?([a-zA-Z0-9]+-[a-zA-Z0-9-]+)$/,\n BUG: /^(bug|fix)\\/(?:v[0-9]+\\.[0-9]+\\.[0-9]+\\/)?([a-zA-Z0-9]+-[a-zA-Z0-9-]+)$/,\n PATCH: /^(patch)\\/(?:v[0-9]+\\.[0-9]+\\.[0-9]+\\/)?([a-zA-Z0-9]+-[a-zA-Z0-9-]+)$/,\n TASK: /^task\\/([a-zA-Z0-9]+-[a-zA-Z0-9-]+)\\/([a-zA-Z0-9]+-[a-zA-Z0-9-]+)$/,\n} as const;\n\nexport function classifyBranch(branchName: string): BranchClassificationResult {\n if (BRANCH_PATTERNS.MAIN.test(branchName)) {\n return {\n valid: true,\n tier: 1,\n tierName: 'Main (Producción)',\n parentRequirement: 'Ninguno (Rama Raíz)',\n targetMerge: 'Despliegue a Producción',\n };\n }\n\n if (BRANCH_PATTERNS.RELEASE.test(branchName)) {\n return {\n valid: true,\n tier: 2,\n tierName: 'Versión / Release',\n parentRequirement: 'Debe originarse desde main',\n targetMerge: 'main',\n };\n }\n\n const featMatch = branchName.match(BRANCH_PATTERNS.FEATURE);\n if (featMatch) {\n return {\n valid: true,\n tier: 3,\n tierName: 'Feature (Funcionalidad)',\n id: featMatch[2],\n parentRequirement: 'Debe originarse desde una rama release/vX.Y.Z activa',\n targetMerge: 'release/vX.Y.Z',\n };\n }\n\n const bugMatch = branchName.match(BRANCH_PATTERNS.BUG);\n if (bugMatch) {\n return {\n valid: true,\n tier: 3,\n tierName: 'Bug (Defecto)',\n id: bugMatch[2],\n parentRequirement: 'Debe originarse desde una rama release/vX.Y.Z activa',\n targetMerge: 'release/vX.Y.Z',\n };\n }\n\n const patchMatch = branchName.match(BRANCH_PATTERNS.PATCH);\n if (patchMatch) {\n return {\n valid: true,\n tier: 3,\n tierName: 'Patch (Parche Rápido)',\n id: patchMatch[2],\n parentRequirement: 'Debe originarse desde una rama release/vX.Y.Z activa o main según criticidad',\n targetMerge: 'release/vX.Y.Z o main',\n };\n }\n\n const taskMatch = branchName.match(BRANCH_PATTERNS.TASK);\n if (taskMatch) {\n return {\n valid: true,\n tier: 4,\n tierName: 'Task (Tarea Atómica)',\n parentId: taskMatch[1],\n taskId: taskMatch[2],\n parentRequirement: `Debe originarse desde la rama de feature, bug o patch: feat/${taskMatch[1]}, bug/${taskMatch[1]} o patch/${taskMatch[1]}`,\n targetMerge: `feat/${taskMatch[1]}, bug/${taskMatch[1]} o patch/${taskMatch[1]}`,\n };\n }\n\n return {\n valid: false,\n tier: 0,\n tierName: 'Inválido',\n error: `El nombre '${branchName}' no cumple con los estándares del modelo de 4 tiers.`,\n };\n}\n\nexport function generateBranchHierarchyPlan(\n version: string,\n feature: string,\n tasks: string[]\n): BranchHierarchyPlan {\n const vBranch = `release/${version}`;\n const fBranch = `feat/${feature}`;\n\n const lines: string[] = [\n '================================================================',\n 'AI-SDLC: Plan de Ramificación Jerárquico',\n '================================================================\\n',\n `1. [TIER 1] Rama Base Estable: main`,\n `2. [TIER 2] Rama de Versión Abierta: ${vBranch} (originada de main)`,\n `3. [TIER 3] Rama de Feature: ${fBranch} (originada de ${vBranch})\\n`,\n `4. [TIER 4] Ramas de Tareas Atómicas (originadas de ${fBranch}):`,\n ];\n\n for (const t of tasks) {\n const parentSlug = feature.split('-').slice(0, 2).join('-');\n const taskBranch = `task/${parentSlug}/${t.toLowerCase()}`;\n lines.push(` ├── ${taskBranch}`);\n lines.push(` │ Comando git: git checkout ${fBranch} && git checkout -b ${taskBranch}`);\n }\n\n lines.push(`\\nFlujo de Integración (Merges):`);\n lines.push(` task/* ➔ [PR Tarea] ➔ ${fBranch} ➔ [PR Feature + Quality Gate] ➔ ${vBranch} ➔ [PR Release] ➔ main\\n`);\n\n return {\n version,\n feature,\n tasks,\n planText: lines.join('\\n'),\n };\n}\n","/**\n * AI-SDLC: Automated Task Navigation & Cascading 4-Tier Git Branch Creation Engine\n */\n\nimport { execFileSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport { slugify } from '../adapters/sdd/scaffold.js';\nimport { classifyBranch } from './workflow.js';\nimport {\n ActiveTaskMatch,\n GitCheckoutTaskOptions,\n GitCheckoutTaskResult,\n} from '../types/index.js';\n\ninterface RawTasksFrontmatter {\n id?: string;\n 'change-id'?: string;\n changeId?: string;\n version?: string | number;\n 'target-release'?: string;\n release?: string;\n tasks?: Array<{\n id: string;\n title?: string;\n [key: string]: unknown;\n }>;\n [key: string]: unknown;\n}\n\nexport interface TaskLocateResult {\n found: boolean;\n match?: ActiveTaskMatch;\n availableTasks?: Array<{ id: string; title: string; changeId: string }>;\n error?: string;\n}\n\n/**\n * Locate which active SDD change (CHG-*) a task belongs to by inspecting\n * specs/changes/active/<change-dir>/tasks.md.\n */\nexport function locateTaskInActiveChanges(\n taskId: string,\n rootDir: string = process.cwd()\n): TaskLocateResult {\n const cleanTaskId = (taskId || '').trim();\n if (!cleanTaskId) {\n return {\n found: false,\n error: 'Debe especificar un identificador de tarea válido (ej. TSK-001).',\n };\n }\n\n const activeChangesDir = path.join(rootDir, 'specs', 'changes', 'active');\n if (!fs.existsSync(activeChangesDir)) {\n return {\n found: false,\n error: `No se encontró el directorio de cambios activos en '${activeChangesDir}'.`,\n };\n }\n\n const availableTasks: Array<{ id: string; title: string; changeId: string }> = [];\n const candidateDirs = fs.readdirSync(activeChangesDir, { withFileTypes: true });\n\n let matchedTask: ActiveTaskMatch | undefined;\n\n for (const entry of candidateDirs) {\n if (!entry.isDirectory()) continue;\n const changeDir = path.join(activeChangesDir, entry.name);\n const tasksFile = path.join(changeDir, 'tasks.md');\n\n if (!fs.existsSync(tasksFile)) continue;\n\n try {\n const content = fs.readFileSync(tasksFile, 'utf-8');\n const fmMatch = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!fmMatch) continue;\n\n const fm = yaml.load(fmMatch[1]) as RawTasksFrontmatter;\n if (!fm || !Array.isArray(fm.tasks)) continue;\n\n const rawChangeId =\n fm['change-id'] ||\n fm.changeId ||\n entry.name.replace(/^(chg|CHG)-/i, 'CHG-').toUpperCase();\n\n // Resolve version from tasks.md frontmatter, or fallback to proposal.md / package.json\n let versionStr = '1.0.0';\n if (fm.version) {\n versionStr = String(fm.version);\n } else if (fm['target-release'] || fm.release) {\n versionStr = String(fm['target-release'] || fm.release);\n } else {\n const proposalFile = path.join(changeDir, 'proposal.md');\n if (fs.existsSync(proposalFile)) {\n const propContent = fs.readFileSync(proposalFile, 'utf-8');\n const propFm = propContent.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (propFm) {\n const parsedProp = yaml.load(propFm[1]) as Record<string, unknown>;\n if (parsedProp?.version) versionStr = String(parsedProp.version);\n }\n }\n }\n\n for (const t of fm.tasks) {\n if (!t || !t.id) continue;\n const currentId = String(t.id).trim();\n const currentTitle = String(t.title || '').trim();\n\n availableTasks.push({\n id: currentId,\n title: currentTitle,\n changeId: String(rawChangeId),\n });\n\n const targetLower = cleanTaskId.toLowerCase();\n const currentLower = currentId.toLowerCase();\n\n // Exact match or prefix match (e.g. TSK-001 matches TSK-001-dto or vice versa)\n const isMatch =\n currentLower === targetLower ||\n currentLower.startsWith(`${targetLower}-`) ||\n targetLower.startsWith(`${currentLower}-`);\n\n if (isMatch && !matchedTask) {\n matchedTask = {\n taskId: currentId,\n taskTitle: currentTitle,\n changeId: String(rawChangeId),\n changeDir,\n version: versionStr,\n };\n }\n }\n } catch {\n // Ignore unparseable change files\n }\n }\n\n if (matchedTask) {\n return {\n found: true,\n match: matchedTask,\n availableTasks,\n };\n }\n\n return {\n found: false,\n availableTasks,\n error: `No se encontró la tarea '${cleanTaskId}' en ningún cambio activo bajo 'specs/changes/active/'.`,\n };\n}\n\n/**\n * Resolves the 4-tier branch hierarchy for a matched task:\n * Tier 1: main\n * Tier 2: release/vX.Y.Z\n * Tier 3: feat/<FEAT-ID>-<slug>\n * Tier 4: task/<PARENT-ID>/<TSK-ID>-<slug>\n */\nexport function resolveBranchHierarchy(\n match: ActiveTaskMatch,\n rootDir: string = process.cwd()\n): {\n baseBranch: string;\n releaseBranch: string;\n featureBranch: string;\n taskBranch: string;\n} {\n // Tier 1: Base branch\n const baseBranch = 'main';\n\n // Tier 2: Release branch\n // Check if an existing release branch exists locally or remotely\n let existingReleaseBranch: string | undefined;\n try {\n const branchesOutput = execFileSync('git', ['branch', '-a'], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n });\n const releaseMatches = branchesOutput.match(/(?:remotes\\/origin\\/)?(release\\/v[0-9]+\\.[0-9]+\\.[0-9]+[^\\s]*)/g);\n if (releaseMatches && releaseMatches.length > 0) {\n existingReleaseBranch = releaseMatches[0].replace(/^remotes\\/origin\\//, '');\n }\n } catch {\n // Git command failure fallback\n }\n\n const cleanVersion = (match.version || '1.0.0').replace(/^v/, '');\n const candidateReleaseBranch = `release/v${cleanVersion}`;\n const releaseBranch =\n existingReleaseBranch && classifyBranch(existingReleaseBranch).valid\n ? existingReleaseBranch\n : candidateReleaseBranch;\n\n // Tier 3: Feature branch\n // Normalize change ID into feat/<CHG-XXX-slug>\n const dirName = path.basename(match.changeDir);\n const changeSlug = dirName.replace(/^(chg|CHG)-/i, (m) => m.toUpperCase());\n\n // Check if a branch for this change already exists in git\n let existingFeatureBranch: string | undefined;\n try {\n const branchesOutput = execFileSync('git', ['branch', '-a'], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n });\n const lines = branchesOutput.split('\\n');\n for (const line of lines) {\n const cleanLine = line.trim().replace(/^[*+]\\s+/, '').replace(/^remotes\\/origin\\//, '');\n if (\n cleanLine.startsWith('feat/') &&\n (cleanLine.toLowerCase().includes(dirName.toLowerCase()) ||\n cleanLine.toLowerCase().includes(match.changeId.toLowerCase()))\n ) {\n existingFeatureBranch = cleanLine;\n break;\n }\n }\n } catch {\n // Git command failure fallback\n }\n\n let featureBranch: string;\n if (existingFeatureBranch && classifyBranch(existingFeatureBranch).valid) {\n featureBranch = existingFeatureBranch;\n } else {\n // Construct standardized feature branch\n const normalizedName = slugify(changeSlug).replace(/^(chg|bug|feat)-(\\d+)/i, (_, p, n) => `${p.toUpperCase()}-${n}`);\n featureBranch = `feat/${normalizedName}`;\n }\n\n // Tier 4: Task branch: task/<PARENT-ID>/<TSK-ID>-<slug>\n const parentIdMatch = featureBranch.replace(/^(feat|feature)\\//i, '').match(/^[a-zA-Z0-9]+-[a-zA-Z0-9]+/);\n const parentId = parentIdMatch ? parentIdMatch[0] : match.changeId.split('-').slice(0, 2).join('-');\n\n let existingTaskBranch: string | undefined;\n try {\n const branchesOutput = execFileSync('git', ['branch', '-a'], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n });\n const lines = branchesOutput.split('\\n');\n for (const line of lines) {\n const cleanLine = line.trim().replace(/^[*+]\\s+/, '').replace(/^remotes\\/origin\\//, '');\n if (\n cleanLine.startsWith(`task/${parentId}/`) &&\n cleanLine.toLowerCase().includes(match.taskId.toLowerCase())\n ) {\n existingTaskBranch = cleanLine;\n break;\n }\n }\n } catch {\n // Git command failure fallback\n }\n\n let taskBranch: string;\n if (existingTaskBranch && classifyBranch(existingTaskBranch).valid) {\n taskBranch = existingTaskBranch;\n } else {\n let taskSuffix = match.taskId.toLowerCase();\n const hasSlug = taskSuffix.includes('-') && taskSuffix.split('-').length > 2;\n if (!hasSlug && match.taskTitle) {\n const titleSlug = slugify(match.taskTitle).split('-').slice(0, 4).join('-');\n if (titleSlug) {\n taskSuffix = `${taskSuffix}-${titleSlug}`;\n }\n }\n taskBranch = `task/${parentId}/${taskSuffix}`;\n }\n\n return {\n baseBranch,\n releaseBranch,\n featureBranch,\n taskBranch,\n };\n}\n\n/**\n * Creates missing branches in cascade (Tier 1 -> Tier 2 -> Tier 3 -> Tier 4)\n * and switches to the Tier 4 task branch automatically.\n */\nexport function checkoutTaskBranch(\n taskId: string,\n options: GitCheckoutTaskOptions = {}\n): GitCheckoutTaskResult {\n const rootDir = options.rootDir || process.cwd();\n\n const locateRes = locateTaskInActiveChanges(taskId, rootDir);\n if (!locateRes.found || !locateRes.match) {\n return {\n success: false,\n taskId,\n createdBranches: [],\n error: locateRes.error,\n availableTasks: locateRes.availableTasks,\n };\n }\n\n const match = locateRes.match;\n const { baseBranch, releaseBranch, featureBranch, taskBranch } = resolveBranchHierarchy(match, rootDir);\n\n const createdBranches: string[] = [];\n\n const runGit = (args: string[]) => {\n return execFileSync('git', args, {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n };\n\n const branchExistsLocally = (branch: string): boolean => {\n try {\n runGit(['show-ref', '--verify', '--quiet', `refs/heads/${branch}`]);\n return true;\n } catch {\n return false;\n }\n };\n\n const branchExistsRemotely = (branch: string): boolean => {\n try {\n runGit(['show-ref', '--verify', '--quiet', `refs/remotes/origin/${branch}`]);\n return true;\n } catch {\n return false;\n }\n };\n\n try {\n // 1. Ensure Tier 2 (release) branch exists\n if (!branchExistsLocally(releaseBranch)) {\n if (branchExistsRemotely(releaseBranch)) {\n runGit(['branch', '--track', releaseBranch, `origin/${releaseBranch}`]);\n } else {\n runGit(['branch', releaseBranch, baseBranch]);\n }\n createdBranches.push(releaseBranch);\n }\n\n // 2. Ensure Tier 3 (feature) branch exists\n if (!branchExistsLocally(featureBranch)) {\n if (branchExistsRemotely(featureBranch)) {\n runGit(['branch', '--track', featureBranch, `origin/${featureBranch}`]);\n } else {\n runGit(['branch', featureBranch, releaseBranch]);\n }\n createdBranches.push(featureBranch);\n }\n\n // 3. Ensure Tier 4 (task) branch exists\n if (!branchExistsLocally(taskBranch)) {\n if (branchExistsRemotely(taskBranch)) {\n runGit(['branch', '--track', taskBranch, `origin/${taskBranch}`]);\n } else {\n runGit(['branch', taskBranch, featureBranch]);\n }\n createdBranches.push(taskBranch);\n }\n\n // 4. Perform checkout to Tier 4 task branch\n runGit(['checkout', taskBranch]);\n\n return {\n success: true,\n taskId: match.taskId,\n changeId: match.changeId,\n releaseBranch,\n featureBranch,\n taskBranch,\n createdBranches,\n switchedBranch: taskBranch,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n taskId: match.taskId,\n changeId: match.changeId,\n releaseBranch,\n featureBranch,\n taskBranch,\n createdBranches,\n error: `Error durante la creación o checkout de ramas Git: ${message}`,\n };\n }\n}\n","/**\n * AI-SDLC: Git Commit Trailers Parser and Extraction Engine\n */\n\nimport { execFileSync } from 'child_process';\n\nexport interface CommitTrailers {\n taskId?: string;\n parentRef?: string;\n authorType: 'human' | 'agent';\n aiModel?: string;\n promptTokens: number;\n completionTokens: number;\n activeTimeSeconds: number;\n}\n\nexport interface CommitKpiRecord {\n sha: string;\n authorName: string;\n authorEmail: string;\n date: string;\n subject: string;\n trailers: CommitTrailers;\n linesAdded: number;\n linesDeleted: number;\n isBugFix: boolean;\n}\n\nconst TRAILER_REGEXES = {\n taskId: /^\\s*Task-ID:\\s*(.+)$/im,\n parentRef: /^\\s*Parent-Ref:\\s*(.+)$/im,\n authorType: /^\\s*Author-Type:\\s*(human|agent)/im,\n aiModel: /^\\s*AI-Model:\\s*(.+)$/im,\n promptTokens: /^\\s*Prompt-Tokens:\\s*([0-9]+)/im,\n completionTokens: /^\\s*Completion-Tokens:\\s*([0-9]+)/im,\n activeTimeSeconds: /^\\s*Active-Time-Seconds:\\s*([0-9]+)/im,\n};\n\n/**\n * Parses structured AI-SDLC git trailers from a commit message.\n */\nexport function parseCommitTrailers(rawMessage: string): CommitTrailers {\n const text = rawMessage || '';\n const taskIdMatch = text.match(TRAILER_REGEXES.taskId);\n const parentRefMatch = text.match(TRAILER_REGEXES.parentRef);\n const authorTypeMatch = text.match(TRAILER_REGEXES.authorType);\n const aiModelMatch = text.match(TRAILER_REGEXES.aiModel);\n const promptTokensMatch = text.match(TRAILER_REGEXES.promptTokens);\n const completionTokensMatch = text.match(TRAILER_REGEXES.completionTokens);\n const activeTimeMatch = text.match(TRAILER_REGEXES.activeTimeSeconds);\n\n let authorType: 'human' | 'agent' = 'human';\n if (authorTypeMatch) {\n authorType = authorTypeMatch[1].toLowerCase() as 'human' | 'agent';\n } else if (aiModelMatch && aiModelMatch[1].trim() !== 'n/a') {\n authorType = 'agent';\n }\n\n const aiModel = aiModelMatch ? aiModelMatch[1].trim() : undefined;\n const promptTokens = promptTokensMatch ? parseInt(promptTokensMatch[1], 10) : 0;\n const completionTokens = completionTokensMatch ? parseInt(completionTokensMatch[1], 10) : 0;\n const activeTimeSeconds = activeTimeMatch ? parseInt(activeTimeMatch[1], 10) : 0;\n\n return {\n taskId: taskIdMatch ? taskIdMatch[1].trim() : undefined,\n parentRef: parentRefMatch ? parentRefMatch[1].trim() : undefined,\n authorType,\n aiModel: aiModel && aiModel !== 'n/a' ? aiModel : undefined,\n promptTokens: isNaN(promptTokens) ? 0 : promptTokens,\n completionTokens: isNaN(completionTokens) ? 0 : completionTokens,\n activeTimeSeconds: isNaN(activeTimeSeconds) ? 0 : activeTimeSeconds,\n };\n}\n\n/**\n * Formats structured git trailers into text suitable for git interpret-trailers.\n */\nexport function formatCommitTrailers(trailers: Partial<CommitTrailers>): string {\n const lines: string[] = [];\n if (trailers.taskId) lines.push(`Task-ID: ${trailers.taskId}`);\n if (trailers.parentRef) lines.push(`Parent-Ref: ${trailers.parentRef}`);\n lines.push(`Author-Type: ${trailers.authorType || 'human'}`);\n lines.push(`AI-Model: ${trailers.aiModel || 'n/a'}`);\n lines.push(`Prompt-Tokens: ${trailers.promptTokens ?? 0}`);\n lines.push(`Completion-Tokens: ${trailers.completionTokens ?? 0}`);\n lines.push(`Active-Time-Seconds: ${trailers.activeTimeSeconds ?? 0}`);\n return lines.join('\\n');\n}\n\ninterface ParsedCommitChunk {\n header: string;\n body: string;\n numstatLines: string[];\n}\n\nfunction parseRawLogChunks(rawLog: string): ParsedCommitChunk[] {\n const rawCommits = rawLog.split('---AI_SDLC_COMMIT---').filter((c) => c.trim().length > 0);\n const chunks: ParsedCommitChunk[] = [];\n\n for (const raw of rawCommits) {\n const endBodyIdx = raw.indexOf('---AI_SDLC_BODY_END---');\n if (endBodyIdx === -1) continue;\n\n const beforeEnd = raw.slice(0, endBodyIdx).trimStart();\n const afterEnd = raw.slice(endBodyIdx + '---AI_SDLC_BODY_END---'.length);\n\n const firstNewline = beforeEnd.indexOf('\\n');\n const header = firstNewline === -1 ? beforeEnd : beforeEnd.slice(0, firstNewline);\n const body = firstNewline === -1 ? '' : beforeEnd.slice(firstNewline + 1);\n\n const numstatLines = afterEnd.split('\\n').filter((l) => /^\\d+\\s+\\d+\\s+/.test(l.trim()));\n chunks.push({ header, body, numstatLines });\n }\n\n return chunks;\n}\n\nfunction sumNumstatLines(lines: string[]): { added: number; deleted: number } {\n let added = 0;\n let deleted = 0;\n for (const line of lines) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length >= 2) {\n const a = parseInt(parts[0], 10);\n const d = parseInt(parts[1], 10);\n if (!isNaN(a)) added += a;\n if (!isNaN(d)) deleted += d;\n }\n }\n return { added, deleted };\n}\n\nfunction evaluateIsBugFix(subject: string, parentRef?: string): boolean {\n if (parentRef && /^(BUG|FIX)-/i.test(parentRef)) return true;\n return /^(fix|bug)(\\([^)]+\\))?:/i.test(subject.trim());\n}\n\n/**\n * Infers or estimates missing KPI metrics (tokens and active development time)\n * when not explicitly declared in commit trailers.\n */\nexport function inferMissingTrailers(\n trailers: CommitTrailers,\n linesAdded: number,\n linesDeleted: number\n): CommitTrailers {\n const result: CommitTrailers = { ...trailers };\n const linesChanged = linesAdded + linesDeleted;\n\n if (result.authorType === 'agent') {\n // If prompt and completion tokens are 0, estimate based on lines changed\n if (result.promptTokens === 0 && result.completionTokens === 0) {\n if (linesChanged > 0) {\n result.completionTokens = Math.max(linesAdded * 10, 50);\n result.promptTokens = Math.max(2500 + linesChanged * 25, 3000);\n } else {\n result.completionTokens = 0;\n result.promptTokens = 1000;\n }\n }\n // If active time is 0, estimate based on lines changed\n if (result.activeTimeSeconds === 0) {\n result.activeTimeSeconds = linesChanged > 0 ? Math.round(30 + linesChanged * 0.5) : 30;\n }\n } else {\n // Human developer: tokens are always 0, estimate active development time\n if (result.activeTimeSeconds === 0) {\n result.activeTimeSeconds = linesChanged > 0 ? Math.round(180 + linesChanged * 2) : 120;\n }\n }\n\n return result;\n}\n\n/**\n * Extracts all commit records and their KPIs in a git revision range (e.g. main..HEAD).\n */\nexport function extractCommitKpisFromRange(\n baseRef: string,\n headRef: string = 'HEAD',\n options: { cwd?: string } = {}\n): CommitKpiRecord[] {\n const cwd = options.cwd || process.cwd();\n const format = '---AI_SDLC_COMMIT---%n%H%x1f%an%x1f%ae%x1f%aI%x1f%s%n%B%n---AI_SDLC_BODY_END---';\n let rawOutput = '';\n const rangeArg = baseRef ? `${baseRef}..${headRef}` : headRef;\n try {\n rawOutput = execFileSync(\n 'git',\n ['log', rangeArg, `--format=${format}`, '--numstat'],\n { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n } catch {\n if (baseRef && !baseRef.includes('/')) {\n try {\n rawOutput = execFileSync(\n 'git',\n ['log', `origin/${baseRef}..${headRef}`, `--format=${format}`, `--numstat`],\n { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n } catch {\n return [];\n }\n } else {\n return [];\n }\n }\n\n const chunks = parseRawLogChunks(rawOutput);\n const records: CommitKpiRecord[] = [];\n\n for (const chunk of chunks) {\n const fields = chunk.header.split('\\x1f');\n if (fields.length < 5) continue;\n const sha = fields[0];\n const authorName = fields[1];\n const authorEmail = fields[2];\n const date = fields[3];\n const subject = fields[4];\n\n const rawTrailers = parseCommitTrailers(chunk.body);\n const { added, deleted } = sumNumstatLines(chunk.numstatLines);\n const trailers = inferMissingTrailers(rawTrailers, added, deleted);\n const isBugFix = evaluateIsBugFix(subject, trailers.parentRef);\n\n records.push({\n sha,\n authorName,\n authorEmail,\n date,\n subject,\n trailers,\n linesAdded: added,\n linesDeleted: deleted,\n isBugFix,\n });\n }\n\n return records;\n}\n","/**\n * AI-SDLC: Universal, IDE-Agnostic Human vs. Agent Author Detection Engine\n */\n\nimport { execFileSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface AuthorIdentity {\n authorType: 'human' | 'agent';\n model: string;\n source: string;\n confidence: 'HIGH' | 'MEDIUM' | 'LOW';\n promptTokens: number;\n completionTokens: number;\n activeTimeSeconds: number;\n}\n\nconst AGENT_ENV_MAPPINGS: Array<{ envKey: string; defaultModel: string; source: string }> = [\n { envKey: 'ANTIGRAVITY_AGENT', defaultModel: 'gemini-3.8-flash', source: 'antigravity' },\n { envKey: 'ANTIGRAVITY_CONVERSATION_ID', defaultModel: 'gemini-3.8-flash', source: 'antigravity' },\n { envKey: 'ANTIGRAVITY_AGENT_ID', defaultModel: 'gemini-3.8-flash', source: 'antigravity' },\n { envKey: 'CORTEX_SESSION_ID', defaultModel: 'antigravity-agent', source: 'cortex' },\n { envKey: 'CLAUDE_CODE', defaultModel: 'claude-3-7-sonnet', source: 'claude-code' },\n { envKey: 'CLAUDE_AGENT', defaultModel: 'claude-3-7-sonnet', source: 'claude-agent' },\n { envKey: 'CURSOR_AGENT', defaultModel: 'cursor-agent', source: 'cursor' },\n { envKey: 'CURSOR_SESSION_ID', defaultModel: 'cursor-agent', source: 'cursor' },\n { envKey: 'WINDSURF_AGENT', defaultModel: 'windsurf-cascade', source: 'windsurf' },\n { envKey: 'CASCADE_AGENT', defaultModel: 'windsurf-cascade', source: 'cascade' },\n { envKey: 'GITHUB_COPILOT_AGENT', defaultModel: 'github-copilot', source: 'copilot' },\n { envKey: 'COPILOT_AGENT_NAME', defaultModel: 'github-copilot', source: 'copilot' },\n { envKey: 'AIDER_MODEL', defaultModel: 'aider-agent', source: 'aider' },\n { envKey: 'GEMINI_CLI', defaultModel: 'gemini-1.5-pro', source: 'gemini' },\n { envKey: 'AI_AGENT_NAME', defaultModel: 'agent-developer', source: 'ai-sdlc-agent' },\n { envKey: 'AI_MODEL', defaultModel: 'agent-developer', source: 'ai-sdlc-model' },\n];\n\nconst BOT_NAME_REGEX = /\\b(bot|agent|copilot|assistant|llm|claude|gpt|cortex|gemini)\\b/i;\n\nfunction getGitConfigValue(key: string, cwd: string): string | undefined {\n try {\n const val = execFileSync('git', ['config', '--get', key], {\n cwd,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n return val.length > 0 ? val : undefined;\n } catch {\n return undefined;\n }\n}\n\ninterface TelemetrySessionData {\n model?: string;\n promptTokens?: number;\n completionTokens?: number;\n activeTimeSeconds?: number;\n}\n\nfunction readSessionTelemetry(cwd: string): TelemetrySessionData | null {\n const possiblePaths = [\n path.join(cwd, '.ai-sdlc', 'session-telemetry.json'),\n path.join(cwd, '.ai-sdlc', 'agent-session.json'),\n ];\n for (const p of possiblePaths) {\n if (fs.existsSync(p)) {\n try {\n const raw = fs.readFileSync(p, 'utf-8');\n return JSON.parse(raw) as TelemetrySessionData;\n } catch {\n // Ignore parsing errors\n }\n }\n }\n return null;\n}\n\nfunction resolveModelFromBotString(str: string): string {\n if (/claude/i.test(str)) return 'claude-3-7-sonnet';\n if (/gpt/i.test(str)) return 'gpt-4o';\n if (/copilot/i.test(str)) return 'github-copilot';\n if (/gemini/i.test(str)) return 'gemini-1.5-pro';\n if (/cortex/i.test(str)) return 'antigravity-agent';\n return 'agent-developer';\n}\n\n/**\n * Universally detects whether the current author is an AI Agent or a Human,\n * regardless of IDE (VSCode, Cursor, Windsurf, Claude Code, CLI, JetBrains).\n */\nexport function detectAuthorIdentity(\n options: { cwd?: string; env?: NodeJS.ProcessEnv } = {}\n): AuthorIdentity {\n const env = options.env || process.env;\n const cwd = options.cwd || process.cwd();\n\n // 1. Explicit Override via Environment Variable\n const explicitEnv = env.AI_SDLC_AUTHOR_TYPE || env.AUTHOR_TYPE;\n if (explicitEnv === 'human' || explicitEnv === 'agent') {\n const model = explicitEnv === 'agent' ? (env.AI_MODEL || 'agent-developer') : 'n/a';\n return {\n authorType: explicitEnv,\n model,\n source: 'explicit-env',\n confidence: 'HIGH',\n promptTokens: 0,\n completionTokens: 0,\n activeTimeSeconds: 0,\n };\n }\n\n // 2. Explicit Git Config (git config ai-sdlc.author-type [human|agent])\n const gitConfigType = getGitConfigValue('ai-sdlc.author-type', cwd);\n if (gitConfigType === 'human' || gitConfigType === 'agent') {\n const gitConfigModel = getGitConfigValue('ai-sdlc.model', cwd) || (gitConfigType === 'agent' ? 'agent-developer' : 'n/a');\n return {\n authorType: gitConfigType,\n model: gitConfigModel,\n source: 'git-config',\n confidence: 'HIGH',\n promptTokens: 0,\n completionTokens: 0,\n activeTimeSeconds: 0,\n };\n }\n\n // 3. Local Session Telemetry File (.ai-sdlc/session-telemetry.json)\n const telemetry = readSessionTelemetry(cwd);\n if (telemetry) {\n const model = telemetry.model || env.AI_MODEL || 'agent-developer';\n return {\n authorType: 'agent',\n model,\n source: 'session-telemetry-file',\n confidence: 'HIGH',\n promptTokens: telemetry.promptTokens || 0,\n completionTokens: telemetry.completionTokens || 0,\n activeTimeSeconds: telemetry.activeTimeSeconds || 0,\n };\n }\n\n // 4. IDE & Toolchain Environment Variables\n for (const mapping of AGENT_ENV_MAPPINGS) {\n const envVal = env[mapping.envKey];\n if (envVal && envVal !== '0' && envVal !== 'false') {\n const model = env.AI_MODEL || (mapping.envKey === 'AIDER_MODEL' ? envVal : mapping.defaultModel);\n return {\n authorType: 'agent',\n model,\n source: `env-${mapping.source}`,\n confidence: 'HIGH',\n promptTokens: parseInt(env.PROMPT_TOKENS || '0', 10) || 0,\n completionTokens: parseInt(env.COMPLETION_TOKENS || '0', 10) || 0,\n activeTimeSeconds: parseInt(env.ACTIVE_TIME_SECONDS || env.ACTIVE_TIME_SEC || '0', 10) || 0,\n };\n }\n }\n\n // 5. Git Author / Committer Signature Inspection\n const authorName = env.GIT_AUTHOR_NAME || getGitConfigValue('user.name', cwd) || '';\n const authorEmail = env.GIT_AUTHOR_EMAIL || getGitConfigValue('user.email', cwd) || '';\n\n if (BOT_NAME_REGEX.test(authorName) || BOT_NAME_REGEX.test(authorEmail)) {\n const inferredModel = resolveModelFromBotString(`${authorName} ${authorEmail}`);\n return {\n authorType: 'agent',\n model: inferredModel,\n source: 'git-user-signature',\n confidence: 'MEDIUM',\n promptTokens: 0,\n completionTokens: 0,\n activeTimeSeconds: 0,\n };\n }\n\n // 6. Default Fallback: Human Developer\n return {\n authorType: 'human',\n model: 'n/a',\n source: 'default-human',\n confidence: 'HIGH',\n promptTokens: 0,\n completionTokens: 0,\n activeTimeSeconds: 0,\n };\n}\n","/**\n * AI-SDLC: Automated Git Hook Installer for Commit Trailers\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface HookInstallResult {\n success: boolean;\n hookPath?: string;\n error?: string;\n}\n\nexport const PREPARE_COMMIT_MSG_SCRIPT = `#!/usr/bin/env bash\n# ==============================================================================\n# AI-SDLC: Automated Commit Trailers Injection Hook\n# ==============================================================================\n\nCOMMIT_MSG_FILE=$1\nCOMMIT_SOURCE=$2\n\n# Bypass if this is an automated merge commit\nif [ \"$COMMIT_SOURCE\" = \"merge\" ]; then\n exit 0\nfi\n\nCURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo \"\")\nif [ -z \"$CURRENT_BRANCH\" ]; then\n exit 0\nfi\n\n# Extract Task-ID and Parent-Ref from 4-tier branch hierarchy\n# Patterns: task/<PARENT-ID>/<TSK-ID>-slug | feat/<FEAT-ID>-slug | bug/<BUG-ID>-slug\nTASK_ID=$(echo \"$CURRENT_BRANCH\" | grep -oE \"TSK-[0-9A-Za-z-]+\" || echo \"\")\nPARENT_REF=$(echo \"$CURRENT_BRANCH\" | grep -oE \"(CHG|FEAT|BUG|FIX|PATCH)-[0-9A-Za-z-]+\" | head -n 1 || echo \"\")\n\nTELEMETRY_FILE=\".ai-sdlc/session-telemetry.json\"\nAUTHOR_TYPE=\"human\"\nAI_MODEL_NAME=\"n/a\"\nPROMPT_TOKENS=0\nCOMPLETION_TOKENS=0\nACTIVE_TIME_SEC=0\n\n# Execute universal IDE-agnostic author detection engine\nDETECTED=$(node packages/cli/bin/aisdlc.js git detect-author 2>/dev/null || npx aisdlc git detect-author 2>/dev/null || node -e \"try { const { detectAuthorIdentity } = require('@aisdlc/core'); const id = detectAuthorIdentity(); console.log([id.authorType, id.model, id.promptTokens, id.completionTokens, id.activeTimeSeconds].join('|')); } catch {}\" 2>/dev/null || echo \"\")\n\nif [ -n \"$DETECTED\" ]; then\n IFS='|' read -r DET_AUTHOR DET_MODEL DET_PROMPT DET_COMPL DET_TIME <<< \"$DETECTED\"\n AUTHOR_TYPE=\"\\${DET_AUTHOR:-\\$AUTHOR_TYPE}\"\n AI_MODEL_NAME=\"\\${DET_MODEL:-\\$AI_MODEL_NAME}\"\n PROMPT_TOKENS=\"\\${DET_PROMPT:-\\$PROMPT_TOKENS}\"\n COMPLETION_TOKENS=\"\\${DET_COMPL:-\\$COMPLETION_TOKENS}\"\n ACTIVE_TIME_SEC=\"\\${DET_TIME:-\\$ACTIVE_TIME_SEC}\"\nelse\n if [ -n \"$AI_MODEL\" ] || [ -n \"$AI_AGENT_NAME\" ] || [ -n \"$ANTIGRAVITY_AGENT\" ] || [ -n \"$ANTIGRAVITY_AGENT_ID\" ] || [ -n \"$ANTIGRAVITY_CONVERSATION_ID\" ] || [ -n \"$CLAUDE_CODE\" ] || [ -n \"$CURSOR_AGENT\" ] || [ -n \"$WINDSURF_AGENT\" ] || [ -n \"$AIDER_MODEL\" ] || [ -f \"$TELEMETRY_FILE\" ]; then\n AUTHOR_TYPE=\"agent\"\n AI_MODEL_NAME=\"\\${AI_MODEL:-\\${AI_AGENT_NAME:-\\${AIDER_MODEL:-agent-developer}}}\"\n fi\nfi\n\n# Estimate tokens and active time if not provided for agent\nif [ \"\\$PROMPT_TOKENS\" = \"0\" ] && [ \"\\$AUTHOR_TYPE\" = \"agent\" ]; then\n CHG_LINES=\\$(git diff --cached --shortstat 2>/dev/null | grep -oE '[0-9]+ (insertion|deletion)' | awk '{s+=\\$1} END {print s+0}')\n if [ -n \"\\$CHG_LINES\" ] && [ \"\\$CHG_LINES\" -gt 0 ]; then\n COMPLETION_TOKENS=\\$((CHG_LINES * 10))\n PROMPT_TOKENS=\\$((2500 + CHG_LINES * 25))\n ACTIVE_TIME_SEC=\\$((30 + CHG_LINES / 2))\n else\n PROMPT_TOKENS=1000\n COMPLETION_TOKENS=0\n ACTIVE_TIME_SEC=30\n fi\nfi\n\n# Inject missing trailers individually into the commit message\nTRAILERS_TO_ADD=\"\"\n\nif [ -n \"$TASK_ID\" ] && ! grep -qE \"^Task-ID:\" \"$COMMIT_MSG_FILE\" 2>/dev/null; then\n TRAILERS_TO_ADD=\"\\${TRAILERS_TO_ADD}Task-ID: $TASK_ID\\n\"\nfi\nif [ -n \"$PARENT_REF\" ] && ! grep -qE \"^Parent-Ref:\" \"$COMMIT_MSG_FILE\" 2>/dev/null; then\n TRAILERS_TO_ADD=\"\\${TRAILERS_TO_ADD}Parent-Ref: $PARENT_REF\\n\"\nfi\nif ! grep -qE \"^Author-Type:\" \"$COMMIT_MSG_FILE\" 2>/dev/null; then\n TRAILERS_TO_ADD=\"\\${TRAILERS_TO_ADD}Author-Type: $AUTHOR_TYPE\\n\"\nfi\nif [ \"$AUTHOR_TYPE\" = \"agent\" ] && ! grep -qE \"^AI-Model:\" \"$COMMIT_MSG_FILE\" 2>/dev/null; then\n TRAILERS_TO_ADD=\"\\${TRAILERS_TO_ADD}AI-Model: $AI_MODEL_NAME\\n\"\nfi\nif ! grep -qE \"^Prompt-Tokens:\" \"$COMMIT_MSG_FILE\" 2>/dev/null; then\n TRAILERS_TO_ADD=\"\\${TRAILERS_TO_ADD}Prompt-Tokens: $PROMPT_TOKENS\\n\"\nfi\nif ! grep -qE \"^Completion-Tokens:\" \"$COMMIT_MSG_FILE\" 2>/dev/null; then\n TRAILERS_TO_ADD=\"\\${TRAILERS_TO_ADD}Completion-Tokens: $COMPLETION_TOKENS\\n\"\nfi\nif ! grep -qE \"^Active-Time-Seconds:\" \"$COMMIT_MSG_FILE\" 2>/dev/null; then\n TRAILERS_TO_ADD=\"\\${TRAILERS_TO_ADD}Active-Time-Seconds: $ACTIVE_TIME_SEC\\n\"\nfi\n\nif [ -n \"$TRAILERS_TO_ADD\" ]; then\n echo \"\" >> \"$COMMIT_MSG_FILE\"\n printf \"$TRAILERS_TO_ADD\" >> \"$COMMIT_MSG_FILE\"\nfi\n\nif [ -f \"$TELEMETRY_FILE\" ]; then\n rm -f \"$TELEMETRY_FILE\" 2>/dev/null || true\nfi\n`;\n\n/**\n * Installs the AI-SDLC prepare-commit-msg hook in .git/hooks.\n */\nexport function installGitHooks(rootDir: string = process.cwd()): HookInstallResult {\n const gitDir = path.join(rootDir, '.git');\n if (!fs.existsSync(gitDir)) {\n return {\n success: false,\n error: `No se encontró el directorio Git en '${gitDir}'.`,\n };\n }\n\n const hooksDir = path.join(gitDir, 'hooks');\n if (!fs.existsSync(hooksDir)) {\n fs.mkdirSync(hooksDir, { recursive: true });\n }\n\n const hookPath = path.join(hooksDir, 'prepare-commit-msg');\n try {\n fs.writeFileSync(hookPath, PREPARE_COMMIT_MSG_SCRIPT, { encoding: 'utf-8', mode: 0o755 });\n return {\n success: true,\n hookPath,\n };\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n error: `Error al escribir el hook en '${hookPath}': ${msg}`,\n };\n }\n}\n","/**\n * AI-SDLC: Pull Request KPI Aggregator & Reporter\n */\n\nimport { CommitKpiRecord, extractCommitKpisFromRange } from '../git/trailers.js';\n\nexport interface AuthorKpiSummary {\n commits: number;\n linesAdded: number;\n linesDeleted: number;\n activeTimeSeconds: number;\n promptTokens: number;\n completionTokens: number;\n estimatedCostUsd: number;\n}\n\nexport interface PrKpiAggregation {\n baseRef: string;\n headRef: string;\n totalCommits: number;\n linesAdded: number;\n linesDeleted: number;\n totalActiveTimeSeconds: number;\n totalPromptTokens: number;\n totalCompletionTokens: number;\n totalTokens: number;\n estimatedCostUsd: number;\n humanSummary: AuthorKpiSummary;\n byModel: Record<string, AuthorKpiSummary>;\n isBugPr: boolean;\n commitRecords: CommitKpiRecord[];\n}\n\nexport const KPI_SUMMARY_START_TAG = '<!-- AI-SDLC-KPI-SUMMARY-START -->';\nexport const KPI_SUMMARY_END_TAG = '<!-- AI-SDLC-KPI-SUMMARY-END -->';\n\nfunction calculateEstimatedCost(promptTokens: number, completionTokens: number): number {\n const promptCost = (promptTokens / 1_000_000) * 3.0;\n const completionCost = (completionTokens / 1_000_000) * 15.0;\n return Math.round((promptCost + completionCost) * 10000) / 10000;\n}\n\nfunction createEmptySummary(): AuthorKpiSummary {\n return {\n commits: 0,\n linesAdded: 0,\n linesDeleted: 0,\n activeTimeSeconds: 0,\n promptTokens: 0,\n completionTokens: 0,\n estimatedCostUsd: 0,\n };\n}\n\nfunction accumulateRecord(target: AuthorKpiSummary, record: CommitKpiRecord): void {\n target.commits += 1;\n target.linesAdded += record.linesAdded;\n target.linesDeleted += record.linesDeleted;\n target.activeTimeSeconds += record.trailers.activeTimeSeconds;\n target.promptTokens += record.trailers.promptTokens;\n target.completionTokens += record.trailers.completionTokens;\n target.estimatedCostUsd = calculateEstimatedCost(target.promptTokens, target.completionTokens);\n}\n\n/**\n * Aggregates all commit KPIs in the revision range of a Pull Request.\n */\nexport function aggregatePrKpis(\n baseRef: string,\n headRef: string = 'HEAD',\n options: { cwd?: string } = {}\n): PrKpiAggregation {\n const records = extractCommitKpisFromRange(baseRef, headRef, options);\n const humanSummary = createEmptySummary();\n const byModel: Record<string, AuthorKpiSummary> = {};\n\n let totalLinesAdded = 0;\n let totalLinesDeleted = 0;\n let totalActiveTime = 0;\n let totalPrompt = 0;\n let totalCompletion = 0;\n let isBugPr = false;\n\n for (const record of records) {\n totalLinesAdded += record.linesAdded;\n totalLinesDeleted += record.linesDeleted;\n totalActiveTime += record.trailers.activeTimeSeconds;\n totalPrompt += record.trailers.promptTokens;\n totalCompletion += record.trailers.completionTokens;\n if (record.isBugFix) isBugPr = true;\n\n if (record.trailers.authorType === 'agent') {\n const modelName = record.trailers.aiModel || 'agent-generic';\n if (!byModel[modelName]) {\n byModel[modelName] = createEmptySummary();\n }\n accumulateRecord(byModel[modelName], record);\n } else {\n accumulateRecord(humanSummary, record);\n }\n }\n\n return {\n baseRef,\n headRef,\n totalCommits: records.length,\n linesAdded: totalLinesAdded,\n linesDeleted: totalLinesDeleted,\n totalActiveTimeSeconds: totalActiveTime,\n totalPromptTokens: totalPrompt,\n totalCompletionTokens: totalCompletion,\n totalTokens: totalPrompt + totalCompletion,\n estimatedCostUsd: calculateEstimatedCost(totalPrompt, totalCompletion),\n humanSummary,\n byModel,\n isBugPr,\n commitRecords: records,\n };\n}\n\nfunction formatMinutes(seconds: number): string {\n const mins = Math.round(seconds / 60);\n return mins > 0 ? `${mins} min` : `${seconds}s`;\n}\n\n/**\n * Formats the KPI aggregation into a standardized Markdown summary table.\n */\nexport function formatPrKpiMarkdown(kpi: PrKpiAggregation): string {\n const models = Object.keys(kpi.byModel);\n const modelHeaders = models.map((m) => `Agent (${m})`).join(' | ');\n const modelSeparator = models.map(() => ':---:').join(' | ');\n\n const headers = `| Metric | Human |${models.length > 0 ? ` ${modelHeaders} |` : ''} Total PR |`;\n const sep = `| :--- | :---: |${models.length > 0 ? ` ${modelSeparator} |` : ''} :---: |`;\n\n const human = kpi.humanSummary;\n const commitCols = models.map((m) => kpi.byModel[m].commits).join(' | ');\n const linesCols = models.map((m) => `+${kpi.byModel[m].linesAdded} / -${kpi.byModel[m].linesDeleted}`).join(' | ');\n const timeCols = models.map((m) => formatMinutes(kpi.byModel[m].activeTimeSeconds)).join(' | ');\n const tokenCols = models.map((m) => `${(kpi.byModel[m].promptTokens + kpi.byModel[m].completionTokens).toLocaleString('en-US')}`).join(' | ');\n const costCols = models.map((m) => `$${kpi.byModel[m].estimatedCostUsd.toFixed(2)}`).join(' | ');\n\n const totalLines = `+${kpi.linesAdded} / -${kpi.linesDeleted}`;\n const totalTime = formatMinutes(kpi.totalActiveTimeSeconds);\n const totalTokensStr = `${kpi.totalTokens.toLocaleString('en-US')} tokens`;\n const totalCostStr = `$${kpi.estimatedCostUsd.toFixed(2)} USD`;\n\n const rows = [\n `| **Commits** | ${human.commits} |${models.length > 0 ? ` ${commitCols} |` : ''} **${kpi.totalCommits}** |`,\n `| **Lines Added / Deleted** | +${human.linesAdded} / -${human.linesDeleted} |${models.length > 0 ? ` ${linesCols} |` : ''} **${totalLines}** |`,\n `| **Active Development Time** | ${formatMinutes(human.activeTimeSeconds)} |${models.length > 0 ? ` ${timeCols} |` : ''} **${totalTime}** |`,\n `| **Tokens Consumed (In+Out)** | 0 |${models.length > 0 ? ` ${tokenCols} |` : ''} **${totalTokensStr}** |`,\n `| **Estimated Cost (USD)** | — (Human labor) |${models.length > 0 ? ` ${costCols} |` : ''} **${totalCostStr}** |`,\n ];\n\n return [\n KPI_SUMMARY_START_TAG,\n '### 📊 AI-SDLC: Aggregated PR KPI Summary',\n '',\n headers,\n sep,\n ...rows,\n '',\n `> **Branch Attribution:** ${kpi.isBugPr ? '🚨 *Defect Fix / Bugfix*' : '✨ *New Feature*'} (Range: \\`${kpi.baseRef}..${kpi.headRef}\\`)`,\n KPI_SUMMARY_END_TAG,\n ].join('\\n');\n}\n\n/**\n * Injects or updates the KPI table in the body of a Pull Request.\n */\nexport function injectKpisIntoPrBody(originalBody: string, kpiMarkdown: string): string {\n const body = originalBody || '';\n const startIndex = body.indexOf(KPI_SUMMARY_START_TAG);\n const endIndex = body.indexOf(KPI_SUMMARY_END_TAG);\n\n if (startIndex !== -1 && endIndex !== -1) {\n const before = body.slice(0, startIndex);\n const after = body.slice(endIndex + KPI_SUMMARY_END_TAG.length);\n return `${before.trimEnd()}\\n\\n${kpiMarkdown}\\n\\n${after.trimStart()}`.trim();\n }\n\n return `${body.trimEnd()}\\n\\n${kpiMarkdown}\\n`;\n}\n","/**\n * AI-SDLC: Release Consolidated KPIs & Defect Attribution Engine\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { CommitKpiRecord, extractCommitKpisFromRange } from '../git/trailers.js';\n\nexport interface ModelDefectStats {\n authorOrModel: string;\n isAgent: boolean;\n commits: number;\n linesAdded: number;\n linesDeleted: number;\n klocProduced: number;\n bugsInjected: number;\n defectInjectionRate: number;\n totalTimeSeconds: number;\n totalTokens: number;\n estimatedCostUsd: number;\n}\n\nexport interface BugRecordSummary {\n sha: string;\n subject: string;\n author: string;\n parentRef?: string;\n timeSeconds: number;\n tokens: number;\n}\n\nexport interface ReleaseKpiReport {\n releaseBranch: string;\n baseBranch: string;\n generatedAt: string;\n totalCommits: number;\n totalLinesAdded: number;\n totalLinesDeleted: number;\n totalKloc: number;\n totalBugs: number;\n globalDefectDensity: number;\n totalTimeSeconds: number;\n totalTokens: number;\n totalCostUsd: number;\n reworkTimeSeconds: number;\n reworkTokens: number;\n reworkCostUsd: number;\n reworkTimePercent: number;\n reworkTokensPercent: number;\n reworkCostPercent: number;\n authorStats: ModelDefectStats[];\n bugList: BugRecordSummary[];\n}\n\nfunction calculateCost(prompt: number, completion: number): number {\n const promptCost = (prompt / 1_000_000) * 3.0;\n const completionCost = (completion / 1_000_000) * 15.0;\n return Math.round((promptCost + completionCost) * 10000) / 10000;\n}\n\nfunction resolveAuthorKey(record: CommitKpiRecord): { key: string; isAgent: boolean } {\n if (record.trailers.authorType === 'agent') {\n return { key: record.trailers.aiModel || 'agent-generic', isAgent: true };\n }\n return { key: `Human (${record.authorName || 'developer'})`, isAgent: false };\n}\n\nfunction createEmptyModelStats(key: string, isAgent: boolean): ModelDefectStats {\n return {\n authorOrModel: key,\n isAgent,\n commits: 0,\n linesAdded: 0,\n linesDeleted: 0,\n klocProduced: 0,\n bugsInjected: 0,\n defectInjectionRate: 0,\n totalTimeSeconds: 0,\n totalTokens: 0,\n estimatedCostUsd: 0,\n };\n}\n\n/**\n * Aggregates all commits in a release branch relative to base (e.g. main..release/vX.Y.Z).\n */\nexport function aggregateReleaseKpis(\n releaseBranch: string,\n baseBranch: string = 'main',\n options: { cwd?: string } = {}\n): ReleaseKpiReport {\n const records = extractCommitKpisFromRange(baseBranch, releaseBranch, options);\n const statsMap: Record<string, ModelDefectStats> = {};\n const bugList: BugRecordSummary[] = [];\n\n let totalLinesAdded = 0;\n let totalLinesDeleted = 0;\n let totalTime = 0;\n let totalTokens = 0;\n let reworkTime = 0;\n let reworkTokens = 0;\n\n for (const record of records) {\n const { key, isAgent } = resolveAuthorKey(record);\n if (!statsMap[key]) {\n statsMap[key] = createEmptyModelStats(key, isAgent);\n }\n const stat = statsMap[key];\n stat.commits += 1;\n stat.linesAdded += record.linesAdded;\n stat.linesDeleted += record.linesDeleted;\n stat.totalTimeSeconds += record.trailers.activeTimeSeconds;\n const tokens = record.trailers.promptTokens + record.trailers.completionTokens;\n stat.totalTokens += tokens;\n\n totalLinesAdded += record.linesAdded;\n totalLinesDeleted += record.linesDeleted;\n totalTime += record.trailers.activeTimeSeconds;\n totalTokens += tokens;\n\n if (record.isBugFix) {\n stat.bugsInjected += 1;\n reworkTime += record.trailers.activeTimeSeconds;\n reworkTokens += tokens;\n bugList.push({\n sha: record.sha.slice(0, 8),\n subject: record.subject,\n author: key,\n parentRef: record.trailers.parentRef,\n timeSeconds: record.trailers.activeTimeSeconds,\n tokens,\n });\n }\n }\n\n const authorStats = Object.values(statsMap).map((stat) => {\n stat.klocProduced = Math.round(((stat.linesAdded + stat.linesDeleted) / 1000) * 100) / 100;\n stat.defectInjectionRate = stat.klocProduced > 0\n ? Math.round((stat.bugsInjected / stat.klocProduced) * 100) / 100\n : stat.bugsInjected;\n stat.estimatedCostUsd = calculateCost(stat.totalTokens * 0.8, stat.totalTokens * 0.2);\n return stat;\n });\n\n const totalKloc = Math.round(((totalLinesAdded + totalLinesDeleted) / 1000) * 100) / 100;\n const totalBugs = bugList.length;\n const globalDefectDensity = totalKloc > 0 ? Math.round((totalBugs / totalKloc) * 100) / 100 : totalBugs;\n const totalCostUsd = calculateCost(totalTokens * 0.8, totalTokens * 0.2);\n const reworkCostUsd = calculateCost(reworkTokens * 0.8, reworkTokens * 0.2);\n\n const reworkTimePercent = totalTime > 0 ? Math.round((reworkTime / totalTime) * 10000) / 100 : 0;\n const reworkTokensPercent = totalTokens > 0 ? Math.round((reworkTokens / totalTokens) * 10000) / 100 : 0;\n const reworkCostPercent = totalCostUsd > 0 ? Math.round((reworkCostUsd / totalCostUsd) * 10000) / 100 : 0;\n\n return {\n releaseBranch,\n baseBranch,\n generatedAt: new Date().toISOString(),\n totalCommits: records.length,\n totalLinesAdded,\n totalLinesDeleted,\n totalKloc,\n totalBugs,\n globalDefectDensity,\n totalTimeSeconds: totalTime,\n totalTokens,\n totalCostUsd,\n reworkTimeSeconds: reworkTime,\n reworkTokens,\n reworkCostUsd,\n reworkTimePercent,\n reworkTokensPercent,\n reworkCostPercent,\n authorStats,\n bugList,\n };\n}\n\nfunction formatHours(seconds: number): string {\n const hours = (seconds / 3600).toFixed(1);\n return `${hours}h (${Math.round(seconds / 60)} min)`;\n}\n\n/**\n * Formats the Release KPI Report into standardized Markdown documentation.\n */\nexport function formatReleaseKpiMarkdown(report: ReleaseKpiReport): string {\n const authorRows = report.authorStats.map((stat) => {\n return `| **${stat.authorOrModel}** | ${stat.commits} | ${stat.klocProduced} | ${stat.bugsInjected} | **${stat.defectInjectionRate}** | ${formatHours(stat.totalTimeSeconds)} | ${stat.totalTokens.toLocaleString('en-US')} | $${stat.estimatedCostUsd.toFixed(2)} |`;\n });\n\n const bugRows = report.bugList.length > 0\n ? report.bugList.map((b) => `| \\`${b.sha}\\` | ${b.subject} | ${b.author} | ${b.parentRef || 'N/A'} | ${Math.round(b.timeSeconds / 60)} min | ${b.tokens.toLocaleString('en-US')} |`)\n : ['| — | *No defects detected in this cycle* | — | — | 0 min | 0 |'];\n\n return [\n `# 📈 Consolidated Release KPI Report: \\`${report.releaseBranch}\\``,\n '',\n `> **Baseline:** \\`${report.baseBranch}\\` ➔ \\`${report.releaseBranch}\\``,\n `> **Audit Date:** ${report.generatedAt}`,\n `> **Total Volume:** ${report.totalCommits} commits | ${report.totalKloc} KLoC (+${report.totalLinesAdded} / -${report.totalLinesDeleted})`,\n `> **Global Defect Density:** **${report.globalDefectDensity} bugs / KLoC** (${report.totalBugs} confirmed bugs)`,\n '',\n '---',\n '',\n '## 1. Authorship Distribution, Volume, and Defect Injection Rate (DIR)',\n '',\n '| Entity / Model | Commits | KLoC | Bugs | DIR (Bugs/KLoC) | Total Time | Tokens | Est. Cost ($) |',\n '| :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: |',\n ...authorRows,\n `| **TOTAL RELEASE** | **${report.totalCommits}** | **${report.totalKloc}** | **${report.totalBugs}** | **${report.globalDefectDensity}** | **${formatHours(report.totalTimeSeconds)}** | **${report.totalTokens.toLocaleString('en-US')}** | **$${report.totalCostUsd.toFixed(2)} USD** |`,\n '',\n '---',\n '',\n '## 2. Bug Rework Cost vs. Total Release Cost',\n '',\n '| Cost Dimension | Total Release Investment | Invested in Bug Fixes | Rework Cost Ratio | Observational Status |',\n '| :--- | :---: | :---: | :---: | :---: |',\n `| **Cycle Time** | ${formatHours(report.totalTimeSeconds)} | ${formatHours(report.reworkTimeSeconds)} | **${report.reworkTimePercent}%** | ${report.reworkTimePercent <= 10 ? '🟢 OPTIMAL (≤10%)' : '🟡 ALERT (>10%)'} |`,\n `| **AI Tokens** | ${report.totalTokens.toLocaleString('en-US')} tokens | ${report.reworkTokens.toLocaleString('en-US')} tokens | **${report.reworkTokensPercent}%** | ${report.reworkTokensPercent <= 10 ? '🟢 OPTIMAL (≤10%)' : '🟡 ALERT (>10%)'} |`,\n `| **Computational Cost ($)** | $${report.totalCostUsd.toFixed(2)} USD | $${report.reworkCostUsd.toFixed(2)} USD | **${report.reworkCostPercent}%** | ${report.reworkCostPercent <= 10 ? '🟢 OPTIMAL (≤10%)' : '🟡 ALERT (>10%)'} |`,\n '',\n '---',\n '',\n '## 3. Defects and Fix Commits Breakdown',\n '',\n '| Commit SHA | Description | Attribution | Reference | Fix Time | Fix Tokens |',\n '| :--- | :--- | :--- | :--- | :---: | :---: |',\n ...bugRows,\n ].join('\\n');\n}\n\n/**\n * Writes the release KPI report to reports/releases/ as Markdown and JSON.\n */\nexport function writeReleaseKpiReport(\n report: ReleaseKpiReport,\n options: { outputDir?: string } = {}\n): { markdownPath: string; jsonPath: string } {\n const root = options.outputDir || path.join(process.cwd(), 'reports', 'releases');\n if (!fs.existsSync(root)) {\n fs.mkdirSync(root, { recursive: true });\n }\n\n const cleanBranchName = report.releaseBranch.replace(/[^a-zA-Z0-9.-]/g, '_');\n const mdPath = path.join(root, `RELEASE_KPIS_${cleanBranchName}.md`);\n const jsonPath = path.join(root, `release_${cleanBranchName}.kpis.json`);\n\n const mdContent = formatReleaseKpiMarkdown(report);\n fs.writeFileSync(mdPath, mdContent, 'utf-8');\n fs.writeFileSync(jsonPath, JSON.stringify(report, null, 2), 'utf-8');\n\n return { markdownPath: mdPath, jsonPath };\n}\n","/**\n * AI-SDLC: Cytoscape.js Standalone Bundle Provider\n * Resolves and provides the minified Cytoscape.js library for offline, self-contained dashboard generation.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { createRequire } from 'module';\n\nlet cachedScript: string | null = null;\n\nconst FALLBACK_CDN_URL = 'https://cdnjs.cloudflare.com/ajax/libs/cytoscape/3.34.3/cytoscape.min.js';\n\n/**\n * Resolves the physical path of cytoscape.min.js from the package.\n */\nexport function resolveCytoscapePath(): string | null {\n try {\n const req = createRequire(import.meta.url);\n const entryPath = req.resolve('cytoscape');\n const dir = path.dirname(entryPath);\n const minPath = path.join(dir, 'cytoscape.min.js');\n if (fs.existsSync(minPath)) {\n return minPath;\n }\n } catch {\n // Fall through to secondary search\n }\n\n // Fallback check in current or parent node_modules\n const searchDirs = [\n path.join(process.cwd(), 'node_modules', 'cytoscape', 'dist', 'cytoscape.min.js'),\n path.join(process.cwd(), 'packages', 'core', 'node_modules', 'cytoscape', 'dist', 'cytoscape.min.js'),\n ];\n\n for (const candidate of searchDirs) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\n/**\n * Returns the raw Cytoscape.js script content for direct inlining in standalone HTML.\n */\nexport function getCytoscapeScript(): string {\n if (cachedScript) {\n return cachedScript;\n }\n\n const scriptPath = resolveCytoscapePath();\n if (scriptPath) {\n try {\n cachedScript = fs.readFileSync(scriptPath, 'utf-8');\n return cachedScript;\n } catch {\n // Fallback\n }\n }\n\n // Graceful fallback script loader if local resolution is not found\n cachedScript = `/* Cytoscape.js CDN Fallback Loader */\n(function() {\n if (typeof window.cytoscape === 'undefined') {\n var s = document.createElement('script');\n s.src = '${FALLBACK_CDN_URL}';\n s.async = false;\n document.head.appendChild(s);\n }\n})();`;\n\n return cachedScript;\n}\n","/**\n * AI-SDLC: Interactive Web Dashboard & Cytoscape Graph Generator\n * Compiles PDaC Graph, RTM 360° Matrix, Quality Gate metrics, and KPI telemetry into\n * a standalone, zero-infrastructure, offline-ready HTML dashboard (reports/dashboard.html).\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { execFileSync } from 'child_process';\nimport yaml from 'js-yaml';\nimport {\n CytoscapeEdgeData,\n CytoscapeElement,\n CytoscapeNodeData,\n DashboardHistoricalKpi,\n DashboardOptions,\n DashboardResult,\n GraphNodeLayer,\n GraphNodeStatus,\n} from '../types/index.js';\nimport { ReleaseKpiReport } from './release-kpis.js';\nimport { verifyPdacGraph } from '../verifiers/pdac-graph.js';\nimport { verifyTraceability } from '../verifiers/traceability.js';\nimport { verifyQualityGate } from '../verifiers/quality-gate.js';\nimport { verifyTasksGovernance } from '../verifiers/governance.js';\nimport { verifyTestingCoverage } from '../verifiers/testing-coverage.js';\nimport { walkMdFiles } from '../utils/fs.js';\nimport { aggregatePrKpis } from './pr-kpis.js';\nimport { getCytoscapeScript } from './cytoscape-bundle.js';\n\nexport interface GraphElementsResult {\n elements: CytoscapeElement[];\n nodesByLayer: Record<GraphNodeLayer, number>;\n conformingCount: number;\n issueCount: number;\n}\n\n/**\n * Builds the graph elements (nodes & edges) for Cytoscape.js.\n */\nexport function buildGraphElements(rootDir: string = process.cwd()): GraphElementsResult {\n const pdac = verifyPdacGraph({ rootDir });\n const trace = verifyTraceability({ rootDir });\n\n const nodeMap = new Map<string, CytoscapeNodeData>();\n const edges: CytoscapeEdgeData[] = [];\n const edgeKeySet = new Set<string>();\n const driftTargets = new Set(pdac.drifts.map((d) => d.targetId));\n\n function addEdge(e: CytoscapeEdgeData) {\n const key = `${e.source}->${e.target}:${e.relation}`;\n if (!edgeKeySet.has(key)) {\n edgeKeySet.add(key);\n edges.push(e);\n }\n }\n\n // 1. Process PDaC Baseline Nodes (Drifts)\n for (const n of pdac.drifts) {\n driftTargets.add(n.targetId);\n }\n\n // 2. Scan and catalog workspace artifacts (product, security, architecture, specs)\n interface ScannedArtifact {\n id: string;\n type: string;\n title: string;\n layer: GraphNodeLayer;\n filePath: string;\n content: string;\n frontmatter: Record<string, any>;\n }\n\n const scannedArtifactsMap = new Map<string, ScannedArtifact>();\n const artifactDirs = ['product', 'architecture', 'specs', 'security'];\n for (const dirName of artifactDirs) {\n const fullDirPath = path.join(rootDir, dirName);\n if (fs.existsSync(fullDirPath)) {\n const files = walkMdFiles(fullDirPath);\n for (const f of files) {\n try {\n const fileContent = fs.readFileSync(f, 'utf-8');\n const relPath = path.relative(rootDir, f).replace(/\\\\/g, '/');\n const match = fileContent.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) continue;\n let fm: Record<string, any> = {};\n try {\n fm = (yaml.load(match[1]) as Record<string, any>) || {};\n } catch {\n continue;\n }\n\n const id = typeof fm.id === 'string' ? fm.id.trim() : undefined;\n if (!id) continue;\n\n let type = typeof fm.type === 'string' ? fm.type.trim() : '';\n let layer: GraphNodeLayer = 'product';\n\n if (id.startsWith('JRN-') || type === 'journey') {\n type = 'journey';\n layer = 'product';\n } else if (id.startsWith('ACT-THREAT-') || type === 'threat-actor') {\n type = 'threat-actor';\n layer = 'product';\n } else if (id.startsWith('ACT-') || type === 'actor') {\n type = 'actor';\n layer = 'product';\n } else if (id.startsWith('UC-') || type === 'use-case' || type === 'usecase') {\n type = 'use-case';\n layer = 'product';\n } else if (id.startsWith('BR-') || type === 'business-rule' || type === 'rule') {\n type = 'business-rule';\n layer = 'product';\n } else if (id.startsWith('ABUSE-') || type === 'abuse-case') {\n type = 'abuse-case';\n layer = 'product';\n } else if (id.startsWith('HAZ-') || type === 'hazard') {\n type = 'hazard';\n layer = 'product';\n } else if (id.startsWith('SEC-ENC-') || type === 'security-enclave') {\n type = 'security-enclave';\n layer = 'architecture';\n } else if (id.startsWith('CMP-') || type === 'component') {\n type = 'component';\n layer = 'architecture';\n } else if (id.startsWith('ADR-') || type === 'architecture-decision-record' || type === 'adr') {\n type = 'adr';\n layer = 'architecture';\n } else if (id.startsWith('SEC-REQ-') || type === 'security-requirement') {\n type = 'security-requirement';\n layer = 'requirement';\n } else if (id.startsWith('FR-') || id.startsWith('QR-') || id.startsWith('CON-') || type === 'requirement') {\n type = 'requirement';\n layer = 'requirement';\n } else {\n type = type || 'product';\n layer = 'product';\n }\n\n const title = typeof fm.title === 'string' ? fm.title.trim() : id;\n const content = fileContent.replace(/^---\\r?\\n[\\s\\S]*?\\r?\\n---/, '').trim();\n\n scannedArtifactsMap.set(id, {\n id,\n type,\n title,\n layer,\n filePath: relPath,\n content,\n frontmatter: fm,\n });\n } catch {\n // Ignore unparseable files\n }\n }\n }\n }\n\n // 3. Process Traceability Requirements\n for (const r of trace.rows) {\n const isOk =\n (r.productStatus === 'COMPLIANT' || r.productStatus === 'CONFORME') &&\n (r.archStatus === 'COMPLIANT' || r.archStatus === 'CONFORME') &&\n (r.testStatus === 'COMPLIANT' || r.testStatus === 'CONFORME');\n const status: GraphNodeStatus = isOk ? 'COMPLIANT' : 'ORPHAN';\n const reqType = r.id.startsWith('SEC-REQ-') ? 'security-requirement' : (r.type || 'requirement');\n\n nodeMap.set(r.id, {\n id: r.id,\n label: r.id,\n title: r.title,\n type: reqType,\n layer: 'requirement',\n status,\n content: r.content,\n filePath: r.filePath,\n details: {\n productStatus: r.productStatus,\n archStatus: r.archStatus,\n testStatus: r.testStatus,\n hofId: r.hofId,\n },\n upstream: r.productTraces.split(',').map((s) => s.trim()).filter(Boolean),\n downstream: [\n ...r.archTraces.split(',').map((s) => s.trim()).filter(Boolean),\n ...r.testTraces.split(',').map((s) => s.trim()).filter(Boolean),\n ],\n });\n\n // Edges from upstream\n for (const up of r.productTraces.split(',')) {\n const u = up.trim();\n if (u && u !== 'NINGUNO' && u !== 'NONE') {\n const isAbuse = u.startsWith('ABUSE-');\n addEdge({\n id: `edge-${u}-${r.id}`,\n source: u,\n target: r.id,\n label: isAbuse ? 'mitigated-by' : 'derives-from',\n relation: isAbuse ? 'mitigated-by' : 'derives-from',\n status,\n });\n if (!nodeMap.has(u)) {\n const upType = u.startsWith('ACT-') ? 'actor' : u.startsWith('UC-') ? 'use-case' : u.startsWith('BR-') ? 'business-rule' : u.startsWith('ABUSE-') ? 'abuse-case' : 'product';\n nodeMap.set(u, {\n id: u,\n label: u,\n title: u,\n type: upType,\n layer: 'product',\n status: 'COMPLIANT',\n });\n }\n }\n }\n\n // Edges to architecture\n for (const arch of r.archTraces.split(',')) {\n const a = arch.trim();\n if (a && a !== 'NINGUNO' && a !== 'NONE') {\n addEdge({\n id: `edge-${r.id}-${a}`,\n source: r.id,\n target: a,\n label: 'satisfies',\n relation: 'satisfies',\n status,\n });\n if (!nodeMap.has(a)) {\n const aType = a.startsWith('CMP-') ? 'component' : a.startsWith('ADR-') ? 'adr' : a.startsWith('SEC-ENC-') ? 'security-enclave' : 'architecture';\n nodeMap.set(a, {\n id: a,\n label: a,\n title: a,\n type: aType,\n layer: 'architecture',\n status: 'COMPLIANT',\n });\n }\n }\n }\n\n // Edges to tests\n for (const tst of r.testTraces.split(',')) {\n const t = tst.trim();\n if (t && t !== 'NINGUNO' && t !== 'NONE') {\n const testId = t.replace(/[^a-zA-Z0-9_-]/g, '_');\n addEdge({\n id: `edge-${r.id}-${testId}`,\n source: r.id,\n target: testId,\n label: 'verified-by',\n relation: 'verified-by',\n status,\n });\n if (!nodeMap.has(testId)) {\n let testContent = undefined;\n const fullTestPath = path.isAbsolute(t) ? t : path.join(rootDir, t);\n if (fs.existsSync(fullTestPath)) {\n try {\n testContent = fs.readFileSync(fullTestPath, 'utf-8');\n } catch {}\n }\n nodeMap.set(testId, {\n id: testId,\n label: path.basename(t),\n title: t,\n type: t.endsWith('.feature') ? 'bdd-feature' : 'code-test',\n layer: 'test',\n status: 'COMPLIANT',\n filePath: t,\n content: testContent ? '```' + (t.endsWith('.feature') ? 'gherkin' : 'typescript') + '\\n' + testContent.substring(0, 1500) + (testContent.length > 1500 ? '\\n... (truncated)' : '') + '\\n```' : undefined,\n });\n }\n }\n }\n }\n\n // 4. Register all scanned artifacts into nodeMap and enrich existing ones\n for (const art of scannedArtifactsMap.values()) {\n if (!nodeMap.has(art.id)) {\n nodeMap.set(art.id, {\n id: art.id,\n label: art.id,\n title: art.title,\n type: art.type,\n layer: art.layer,\n status: 'COMPLIANT',\n filePath: art.filePath,\n content: art.content,\n });\n } else {\n const n = nodeMap.get(art.id)!;\n if (!n.filePath) n.filePath = art.filePath;\n if ((!n.title || n.title === n.id) && art.title) n.title = art.title;\n if (!n.content) n.content = art.content;\n if (art.type && (!n.type || n.type === 'product' || n.type === 'architecture' || n.type === 'usecase' || n.type === 'rule')) {\n n.type = art.type;\n }\n }\n }\n\n // 5. Connect product graph relationships: Journeys, Actors, Use Cases, Business Rules, Abuse Cases\n for (const art of scannedArtifactsMap.values()) {\n const fm = art.frontmatter;\n\n if (art.type === 'journey') {\n // Persona / Actor\n const persona = typeof fm.persona === 'string' ? fm.persona : (typeof fm.actor === 'string' ? fm.actor : undefined);\n if (persona) {\n if (!nodeMap.has(persona)) {\n nodeMap.set(persona, {\n id: persona,\n label: persona,\n title: persona,\n type: 'actor',\n layer: 'product',\n status: 'COMPLIANT',\n });\n }\n addEdge({\n id: `edge-${persona}-${art.id}`,\n source: persona,\n target: art.id,\n label: 'pursues',\n relation: 'pursues',\n status: 'COMPLIANT',\n });\n }\n\n // Related Use Cases\n const relatedUcs = Array.isArray(fm['related-use-cases']) ? fm['related-use-cases'] : (Array.isArray(fm['use-cases']) ? fm['use-cases'] : []);\n for (const ucId of relatedUcs) {\n if (typeof ucId === 'string' && ucId.trim()) {\n const u = ucId.trim();\n if (!nodeMap.has(u)) {\n nodeMap.set(u, {\n id: u,\n label: u,\n title: u,\n type: 'use-case',\n layer: 'product',\n status: 'COMPLIANT',\n });\n }\n addEdge({\n id: `edge-${art.id}-${u}`,\n source: art.id,\n target: u,\n label: 'decomposes-into',\n relation: 'decomposes-into',\n status: 'COMPLIANT',\n });\n }\n }\n } else if (art.type === 'use-case') {\n // Primary Actor\n const primaryActor = typeof fm['primary-actor'] === 'string' ? fm['primary-actor'] : (typeof fm.actor === 'string' ? fm.actor : undefined);\n if (primaryActor) {\n if (!nodeMap.has(primaryActor)) {\n nodeMap.set(primaryActor, {\n id: primaryActor,\n label: primaryActor,\n title: primaryActor,\n type: 'actor',\n layer: 'product',\n status: 'COMPLIANT',\n });\n }\n addEdge({\n id: `edge-${primaryActor}-${art.id}`,\n source: primaryActor,\n target: art.id,\n label: 'initiates',\n relation: 'initiates',\n status: 'COMPLIANT',\n });\n }\n\n // Governed By (Business Rules)\n const governedBy = Array.isArray(fm['governed-by']) ? fm['governed-by'] : [];\n for (const ruleId of governedBy) {\n if (typeof ruleId === 'string' && ruleId.trim()) {\n const r = ruleId.trim();\n if (!nodeMap.has(r)) {\n nodeMap.set(r, {\n id: r,\n label: r,\n title: r,\n type: 'business-rule',\n layer: 'product',\n status: 'COMPLIANT',\n });\n }\n addEdge({\n id: `edge-${r}-${art.id}`,\n source: r,\n target: art.id,\n label: 'governs',\n relation: 'governs',\n status: 'COMPLIANT',\n });\n }\n }\n } else if (art.type === 'business-rule') {\n const governsTargets = Array.isArray(fm['governs'])\n ? fm['governs']\n : Array.isArray(fm['applies-to'])\n ? fm['applies-to']\n : typeof fm['governs'] === 'string'\n ? [fm['governs']]\n : [];\n for (const tgt of governsTargets) {\n if (typeof tgt === 'string' && tgt.trim()) {\n const t = tgt.trim();\n addEdge({\n id: `edge-${art.id}-${t}`,\n source: art.id,\n target: t,\n label: 'governs',\n relation: 'governs',\n status: 'COMPLIANT',\n });\n }\n }\n } else if (art.type === 'abuse-case') {\n // Threat Actor\n const threatActor =\n typeof fm['primary-threat-actor'] === 'string'\n ? fm['primary-threat-actor']\n : typeof fm['threat-actor'] === 'string'\n ? fm['threat-actor']\n : typeof fm.actor === 'string'\n ? fm.actor\n : undefined;\n if (threatActor) {\n if (!nodeMap.has(threatActor)) {\n nodeMap.set(threatActor, {\n id: threatActor,\n label: threatActor,\n title: threatActor,\n type: 'threat-actor',\n layer: 'product',\n status: 'COMPLIANT',\n });\n }\n addEdge({\n id: `edge-${threatActor}-${art.id}`,\n source: threatActor,\n target: art.id,\n label: 'threatens',\n relation: 'threatens',\n status: 'COMPLIANT',\n });\n }\n\n // Targets Use Cases\n const rawTargets = fm['targets-use-case']\n ? [fm['targets-use-case']]\n : Array.isArray(fm['targets-use-cases'])\n ? fm['targets-use-cases']\n : Array.isArray(fm['targets'])\n ? fm['targets']\n : [];\n for (const tgt of rawTargets) {\n if (typeof tgt === 'string' && tgt.trim()) {\n const t = tgt.trim();\n if (nodeMap.has(t)) {\n addEdge({\n id: `edge-${art.id}-${t}`,\n source: art.id,\n target: t,\n label: 'targets',\n relation: 'targets',\n status: 'COMPLIANT',\n });\n }\n }\n }\n\n // Mitigated By (Security Requirements)\n const mitigatedBy = Array.isArray(fm['mitigated-by'])\n ? fm['mitigated-by']\n : typeof fm['mitigated-by'] === 'string'\n ? [fm['mitigated-by']]\n : [];\n for (const secReq of mitigatedBy) {\n if (typeof secReq === 'string' && secReq.trim()) {\n const s = secReq.trim();\n if (!nodeMap.has(s)) {\n nodeMap.set(s, {\n id: s,\n label: s,\n title: s,\n type: s.startsWith('SEC-REQ-') ? 'security-requirement' : 'requirement',\n layer: 'requirement',\n status: 'COMPLIANT',\n });\n }\n addEdge({\n id: `edge-${art.id}-${s}`,\n source: art.id,\n target: s,\n label: 'mitigated-by',\n relation: 'mitigated-by',\n status: 'COMPLIANT',\n });\n }\n }\n } else if (art.type === 'requirement' || art.type === 'security-requirement') {\n // Mitigates Abuse Cases\n const mitigates = Array.isArray(fm['mitigates-abuse-case']) ? fm['mitigates-abuse-case'] : (typeof fm['mitigates-abuse-case'] === 'string' ? [fm['mitigates-abuse-case']] : []);\n for (const abuseId of mitigates) {\n if (typeof abuseId === 'string' && abuseId.trim()) {\n const ab = abuseId.trim();\n if (!nodeMap.has(ab)) {\n nodeMap.set(ab, {\n id: ab,\n label: ab,\n title: ab,\n type: 'abuse-case',\n layer: 'product',\n status: 'COMPLIANT',\n });\n }\n addEdge({\n id: `edge-${ab}-${art.id}`,\n source: ab,\n target: art.id,\n label: 'mitigated-by',\n relation: 'mitigated-by',\n status: 'COMPLIANT',\n });\n }\n }\n }\n }\n\n // 6. Update status for nodes with cryptographic drifts\n for (const [id, node] of nodeMap.entries()) {\n if (driftTargets.has(id)) {\n node.status = 'DRIFT';\n }\n }\n\n // 7. Populate bidirectional upstream and downstream traces for all nodes\n for (const e of edges) {\n const srcNode = nodeMap.get(e.source);\n const tgtNode = nodeMap.get(e.target);\n if (srcNode) {\n srcNode.downstream = srcNode.downstream || [];\n if (!srcNode.downstream.includes(e.target)) {\n srcNode.downstream.push(e.target);\n }\n }\n if (tgtNode) {\n tgtNode.upstream = tgtNode.upstream || [];\n if (!tgtNode.upstream.includes(e.source)) {\n tgtNode.upstream.push(e.source);\n }\n }\n }\n\n const nodesByLayer: Record<GraphNodeLayer, number> = {\n product: 0,\n requirement: 0,\n architecture: 0,\n test: 0,\n };\n\n let conformingCount = 0;\n let issueCount = 0;\n\n const elements: CytoscapeElement[] = [];\n\n for (const n of nodeMap.values()) {\n nodesByLayer[n.layer] = (nodesByLayer[n.layer] || 0) + 1;\n if (n.status === 'COMPLIANT' || n.status === 'CONFORME') {\n conformingCount++;\n } else {\n issueCount++;\n }\n elements.push({\n group: 'nodes',\n data: n,\n classes: `layer-${n.layer} type-${n.type} status-${n.status.toLowerCase()}`,\n });\n }\n\n for (const e of edges) {\n elements.push({\n group: 'edges',\n data: e,\n classes: `relation-${e.relation} status-${e.status?.toLowerCase() || 'compliant'}`,\n });\n }\n\n return { elements, nodesByLayer, conformingCount, issueCount };\n}\n\n/**\n * Loads historical KPI records from reports/releases/ directory.\n */\nexport function collectHistoricalKpis(rootDir: string): DashboardHistoricalKpi[] {\n const releasesDir = path.join(rootDir, 'reports', 'releases');\n const items: DashboardHistoricalKpi[] = [];\n\n if (fs.existsSync(releasesDir)) {\n try {\n const files = fs.readdirSync(releasesDir).filter((f) => f.endsWith('.kpis.json'));\n for (const file of files) {\n const fullPath = path.join(releasesDir, file);\n const content = fs.readFileSync(fullPath, 'utf-8');\n const report = JSON.parse(content) as ReleaseKpiReport;\n items.push({\n id: report.releaseBranch,\n label: report.releaseBranch,\n timestamp: report.generatedAt,\n kloc: report.totalKloc,\n commits: report.totalCommits,\n bugs: report.totalBugs,\n defectDensity: report.globalDefectDensity,\n reworkPercent: report.reworkTimePercent,\n costUsd: report.totalCostUsd,\n });\n }\n } catch {\n // Ignore unparseable historical records\n }\n }\n\n // Sort by timestamp\n return items.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\n}\n\n/**\n * Collects complete project metrics for dashboard tabs.\n */\nexport function collectDashboardMetrics(rootDir: string) {\n const gate = verifyQualityGate({ rootDir });\n const gov = verifyTasksGovernance({ rootDir });\n const cov = verifyTestingCoverage({ rootDir });\n const trace = verifyTraceability({ rootDir });\n const history = collectHistoricalKpis(rootDir);\n\n let activePrKpi = null;\n let activeBranch = 'HEAD';\n try {\n try {\n activeBranch = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n } catch {\n activeBranch = 'HEAD';\n }\n\n const isDefaultBranch = activeBranch === 'main' || activeBranch === 'master';\n if (isDefaultBranch) {\n let base = 'HEAD~20';\n try {\n const count = parseInt(\n execFileSync('git', ['rev-list', '--count', 'HEAD'], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim(),\n 10\n );\n if (count <= 20) {\n const rootCommit = execFileSync('git', ['rev-list', '--max-parents=0', 'HEAD'], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim().split('\\n')[0];\n base = rootCommit;\n }\n } catch {\n base = 'HEAD~1';\n }\n activePrKpi = aggregatePrKpis(base, 'HEAD', { cwd: rootDir });\n } else {\n activePrKpi = aggregatePrKpis('main', 'HEAD', { cwd: rootDir });\n if (activePrKpi.totalCommits === 0) {\n try {\n activePrKpi = aggregatePrKpis('HEAD~1', 'HEAD', { cwd: rootDir });\n } catch {\n // Keep 0 commits if unable\n }\n }\n }\n } catch {\n // Graceful fallback if git range is unavailable\n }\n\n return {\n gate,\n gov,\n cov,\n trace,\n history,\n activePrKpi,\n activeBranch,\n };\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nfunction renderAutonomyModeSection(\n mode: string,\n statusIcon: string,\n count: number,\n roleDescription: string,\n allTasks: any[] = []\n): string {\n const modeTasks = (allTasks || []).filter(\n (t: any) => (t.task?.autonomyMode || '').toUpperCase() === mode\n );\n const openCount = modeTasks.filter(\n (t: any) => (t.task?.status || '').toUpperCase() !== 'COMPLETED'\n ).length;\n const closedCount = modeTasks.filter(\n (t: any) => (t.task?.status || '').toUpperCase() === 'COMPLETED'\n ).length;\n\n return `\n <tr class=\"mode-row\" onclick=\"toggleAutonomyTasks('${mode}')\" title=\"Haz clic para desplegar u ocultar las tareas ${mode}\">\n <td>\n <span class=\"accordion-indicator\" id=\"toggle-icon-${mode}\">▶</span>\n <code>${mode}</code>\n <span style=\"font-size: 0.72rem; color: var(--accent-cyan); margin-left: 6px;\">(Ver tareas ▼)</span>\n </td>\n <td>${statusIcon}</td>\n <td><strong>${count}</strong></td>\n <td>${roleDescription}</td>\n </tr>\n <tr id=\"tasks-row-${mode}\" class=\"autonomy-tasks-panel\" style=\"display: none;\">\n <td colspan=\"4\">\n <div class=\"autonomy-tasks-container\">\n <div class=\"autonomy-tasks-header\">\n <div class=\"autonomy-tasks-title\">\n <span>📋 Tareas <code>${mode}</code></span>\n <span class=\"badge\" style=\"background:#334155;\">Total: ${modeTasks.length}</span>\n </div>\n <div class=\"filter-btn-group\">\n <span style=\"font-size: 0.75rem; color: var(--text-muted); font-weight: 600;\">Filtrar:</span>\n <button type=\"button\" class=\"filter-btn active\" id=\"btn-filter-${mode}-all\" onclick=\"filterAutonomyTasks('${mode}', 'all', event)\">Todas (${modeTasks.length})</button>\n <button type=\"button\" class=\"filter-btn\" id=\"btn-filter-${mode}-open\" onclick=\"filterAutonomyTasks('${mode}', 'open', event)\">Abiertas (${openCount})</button>\n <button type=\"button\" class=\"filter-btn\" id=\"btn-filter-${mode}-closed\" onclick=\"filterAutonomyTasks('${mode}', 'closed', event)\">Cerradas (${closedCount})</button>\n </div>\n </div>\n ${modeTasks.length === 0 ? `\n <div style=\"color: var(--text-muted); font-size: 0.8rem; padding: 10px 0; font-style: italic;\">\n No hay tareas registradas con modo <code>${mode}</code>.\n </div>\n ` : `\n <div id=\"tasks-empty-${mode}\" style=\"display: none; color: var(--text-muted); font-size: 0.8rem; padding: 10px 0; font-style: italic;\">\n No hay tareas en el filtro seleccionado.\n </div>\n <table class=\"sub-data-table\" id=\"tasks-table-${mode}\">\n <thead>\n <tr>\n <th style=\"width: 105px;\">ID Tarea</th>\n <th>Título de la Tarea</th>\n <th style=\"width: 160px;\">Estado</th>\n <th style=\"width: 130px;\">Asignada a</th>\n <th>Verificación</th>\n <th style=\"width: 200px;\">Fichero .md</th>\n </tr>\n </thead>\n <tbody>\n ${modeTasks.map((t: any) => {\n const cleanPath = (t.file || '').replace(/\\\\/g, '/').replace(/^\\.\\//, '');\n const rawStatus = (t.task?.status || 'PENDING').toUpperCase();\n const isClosed = rawStatus === 'COMPLETED';\n const isOpen = !isClosed;\n let badgeClass = 'badge-amber';\n let badgeText = `${rawStatus} (Abierta)`;\n if (rawStatus === 'COMPLETED') {\n badgeClass = 'badge-green';\n badgeText = 'COMPLETED (Cerrada)';\n } else if (rawStatus === 'IN_PROGRESS') {\n badgeClass = 'badge-blue';\n badgeText = 'IN_PROGRESS (Abierta)';\n } else if (rawStatus === 'BLOCKED') {\n badgeClass = 'badge-rose';\n badgeText = 'BLOCKED (Abierta)';\n }\n const criteria = t.task?.verification?.criteria || 'N/A';\n const criteriaShort = criteria.length > 45 ? criteria.substring(0, 42) + '...' : criteria;\n const pathParts = cleanPath.split('/');\n const shortFile = pathParts.length > 2 ? pathParts.slice(-2).join('/') : cleanPath;\n\n const globalIndex = allTasks.indexOf(t);\n return `\n <tr class=\"task-row task-item task-item-${isOpen ? 'open' : 'closed'}\" onclick=\"showTaskSidebar(${globalIndex})\" title=\"Ver información de ${escapeHtml(t.task?.id || 'la tarea')}\">\n <td>\n <strong style=\"color: var(--accent-cyan); font-family: monospace;\"><code>${escapeHtml(t.task?.id || 'TSK-UNKNOWN')}</code></strong>\n </td>\n <td>\n <span style=\"color: var(--text-main); font-weight: 500;\">${escapeHtml(t.task?.title || 'Untitled task')}</span>\n </td>\n <td>\n <span class=\"badge ${badgeClass}\">${escapeHtml(badgeText)}</span>\n </td>\n <td>\n <code>${escapeHtml(t.task?.assignedTo || 'agent-developer')}</code>\n </td>\n <td>\n <code style=\"font-size: 0.72rem; color: #cbd5e1;\" title=\"${escapeHtml(criteria)}\">${escapeHtml(criteriaShort)}</code>\n </td>\n <td>\n <code style=\"color: var(--text-muted); font-size: 0.75rem;\">${escapeHtml(shortFile)}</code>\n </td>\n </tr>\n `;\n }).join('')}\n </tbody>\n </table>\n `}\n </div>\n </td>\n </tr>\n `;\n}\n\n/**\n * Renders the HTML string for the interactive dashboard.\n */\nexport function renderDashboardHtml(\n graphData: GraphElementsResult,\n metricsData: ReturnType<typeof collectDashboardMetrics>,\n title: string = 'AI-SDLC: Dashboard Interactivo de Trazabilidad y Calidad'\n): string {\n const cytoscapeScript = getCytoscapeScript();\n const elementsJson = JSON.stringify(graphData.elements);\n const now = new Date().toISOString();\n\n return `<!DOCTYPE html>\n<html lang=\"es\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${title}</title>\n <style>\n :root {\n --bg-dark: #0f172a;\n --panel-bg: #1e293b;\n --card-bg: #334155;\n --accent-cyan: #38bdf8;\n --accent-emerald: #10b981;\n --accent-amber: #f59e0b;\n --accent-rose: #ef4444;\n --text-main: #f8fafc;\n --text-muted: #94a3b8;\n --border-color: #475569;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif; }\n body { background-color: var(--bg-dark); color: var(--text-main); height: 100vh; display: flex; flex-direction: column; overflow: hidden; }\n \n header { background: var(--panel-bg); border-bottom: 1px solid var(--border-color); padding: 12px 24px; display: flex; justify-content: space-between; align-items: center; }\n .brand { display: flex; align-items: center; gap: 12px; }\n .brand h1 { font-size: 1.15rem; font-weight: 700; color: var(--accent-cyan); letter-spacing: -0.025em; }\n .badge { padding: 3px 8px; border-radius: 4px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; }\n .badge-green { background: rgba(16, 185, 129, 0.2); color: #34d399; border: 1px solid #10b981; }\n .badge-amber { background: rgba(245, 158, 11, 0.2); color: #fbbf24; border: 1px solid #f59e0b; }\n .badge-blue { background: rgba(56, 189, 248, 0.2); color: #38bdf8; border: 1px solid #38bdf8; }\n .badge-rose { background: rgba(239, 68, 68, 0.2); color: #ef4444; border: 1px solid #ef4444; }\n .mode-row { cursor: pointer; transition: background 0.15s; }\n .mode-row:hover { background: rgba(56, 189, 248, 0.08) !important; }\n .accordion-indicator { display: inline-block; transition: transform 0.2s ease; margin-right: 6px; font-size: 0.75rem; color: var(--accent-cyan); }\n .accordion-indicator.open { transform: rotate(90deg); }\n .autonomy-tasks-panel { background: rgba(15, 23, 42, 0.75); }\n .autonomy-tasks-panel > td { padding: 16px 20px !important; border-bottom: 2px solid var(--border-color) !important; }\n .autonomy-tasks-container { display: flex; flex-direction: column; gap: 12px; }\n .autonomy-tasks-header { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 8px; }\n .autonomy-tasks-title { font-weight: 700; font-size: 0.85rem; color: var(--accent-cyan); display: flex; align-items: center; gap: 8px; }\n .filter-btn-group { display: flex; gap: 6px; align-items: center; }\n .filter-btn { background: var(--card-bg); border: 1px solid var(--border-color); color: var(--text-muted); padding: 4px 10px; border-radius: 4px; font-size: 0.75rem; font-weight: 600; cursor: pointer; transition: all 0.15s; }\n .filter-btn:hover { color: var(--text-main); background: #475569; }\n .filter-btn.active { background: var(--accent-cyan); color: #0f172a; border-color: var(--accent-cyan); font-weight: 700; }\n .sub-data-table { width: 100%; border-collapse: collapse; background: #0f172a; border-radius: 6px; overflow: hidden; border: 1px solid var(--border-color); font-size: 0.8rem; }\n .sub-data-table th, .sub-data-table td { padding: 8px 12px; text-align: left; border-bottom: 1px solid rgba(71, 85, 105, 0.4); }\n .sub-data-table th { background: #182234; color: var(--text-muted); font-weight: 700; font-size: 0.72rem; text-transform: uppercase; }\n .sub-data-table tr.task-row { transition: background 0.15s; cursor: pointer; }\n .sub-data-table tr.task-row:hover { background: rgba(56, 189, 248, 0.12) !important; }\n .task-file-link { color: #7dd3fc; text-decoration: underline; font-family: ui-monospace, SFMono-Regular, monospace; font-size: 0.75rem; }\n .task-file-link:hover { color: #bae6fd; }\n\n /* Task Details Slide-Over Sidebar */\n .task-sidebar {\n position: fixed;\n top: 0;\n right: -480px;\n width: 460px;\n max-width: 90vw;\n height: 100vh;\n background: var(--panel-bg);\n border-left: 1px solid var(--border-color);\n box-shadow: -8px 0 30px rgba(0, 0, 0, 0.65);\n z-index: 10001;\n display: flex;\n flex-direction: column;\n transition: right 0.28s cubic-bezier(0.16, 1, 0.3, 1);\n }\n .task-sidebar.open {\n right: 0;\n }\n .task-sidebar-header {\n padding: 16px 20px;\n border-bottom: 1px solid var(--border-color);\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: #182234;\n }\n .task-sidebar-header h2 {\n font-size: 1rem;\n color: var(--accent-cyan);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .task-sidebar-close {\n background: var(--card-bg);\n border: 1px solid var(--border-color);\n color: var(--text-muted);\n border-radius: 4px;\n width: 28px;\n height: 28px;\n font-size: 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.15s;\n }\n .task-sidebar-close:hover {\n background: #475569;\n color: var(--text-main);\n border-color: var(--accent-cyan);\n }\n .task-sidebar-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n }\n .task-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(15, 23, 42, 0.6);\n backdrop-filter: blur(2px);\n z-index: 10000;\n }\n\n nav.tabs { display: flex; background: var(--panel-bg); border-bottom: 1px solid var(--border-color); padding: 0 24px; gap: 8px; }\n .tab-btn { background: transparent; border: none; color: var(--text-muted); padding: 10px 16px; font-weight: 600; font-size: 0.875rem; cursor: pointer; border-bottom: 2px solid transparent; transition: all 0.2s; }\n .tab-btn:hover { color: var(--text-main); }\n .tab-btn.active { color: var(--accent-cyan); border-bottom-color: var(--accent-cyan); }\n\n main { flex: 1; position: relative; overflow: hidden; display: flex; }\n .tab-panel { display: none; width: 100%; height: 100%; overflow: auto; }\n .tab-panel.active { display: flex; }\n\n /* Cytoscape View */\n #graph-view { position: relative; flex: 1; height: 100%; display: flex; }\n #cy { flex: 1; height: 100%; background: #0b1120; }\n .graph-toolbar { position: absolute; top: 16px; left: 16px; z-index: 10; display: flex; flex-direction: column; gap: 8px; background: rgba(30, 41, 59, 0.85); backdrop-filter: blur(8px); padding: 12px; border-radius: 8px; border: 1px solid var(--border-color); box-shadow: 0 8px 16px rgba(0,0,0,0.4); max-width: 300px; }\n .tool-row { display: flex; gap: 6px; align-items: center; }\n .tool-btn { background: var(--card-bg); border: 1px solid var(--border-color); color: var(--text-main); padding: 6px 10px; border-radius: 4px; font-size: 0.75rem; cursor: pointer; font-weight: 600; transition: background 0.2s; }\n .tool-btn:hover { background: #475569; }\n .tool-select, .tool-input { background: var(--card-bg); border: 1px solid var(--border-color); color: var(--text-main); padding: 6px 8px; border-radius: 4px; font-size: 0.75rem; width: 100%; }\n \n .sidebar { width: 340px; background: var(--panel-bg); border-left: 1px solid var(--border-color); padding: 20px; overflow-y: auto; display: flex; flex-direction: column; gap: 16px; }\n .sidebar h2 { font-size: 1rem; color: var(--accent-cyan); border-bottom: 1px solid var(--border-color); padding-bottom: 8px; }\n .sidebar-field { font-size: 0.8rem; line-height: 1.4; }\n .sidebar-field strong { color: var(--text-muted); display: block; font-size: 0.7rem; text-transform: uppercase; margin-bottom: 2px; }\n .sidebar-field pre { background: var(--card-bg); padding: 8px; border-radius: 4px; overflow-x: auto; font-size: 0.75rem; color: #a5f3fc; }\n\n /* Tables & Cards View */\n .content-container { padding: 24px; width: 100%; max-width: 1300px; margin: 0 auto; display: flex; flex-direction: column; gap: 24px; }\n .grid-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px; }\n .metric-card { background: var(--panel-bg); border: 1px solid var(--border-color); border-radius: 8px; padding: 18px; display: flex; flex-direction: column; gap: 6px; }\n .metric-card .title { font-size: 0.75rem; text-transform: uppercase; color: var(--text-muted); font-weight: 600; }\n .metric-card .value { font-size: 1.8rem; font-weight: 800; color: var(--text-main); }\n .metric-card .subtitle { font-size: 0.75rem; color: var(--accent-cyan); }\n\n .data-table { width: 100%; border-collapse: collapse; background: var(--panel-bg); border-radius: 8px; overflow: hidden; border: 1px solid var(--border-color); font-size: 0.85rem; }\n .data-table th, .data-table td { padding: 12px 16px; text-align: left; border-bottom: 1px solid var(--border-color); }\n .data-table th { background: #182234; color: var(--text-muted); font-weight: 700; text-transform: uppercase; font-size: 0.75rem; }\n .data-table tr:hover { background: rgba(255,255,255,0.03); }\n\n /* Timeline & KPI Historical */\n .chart-container { background: var(--panel-bg); border: 1px solid var(--border-color); border-radius: 8px; padding: 20px; }\n .chart-container h3 { font-size: 0.9rem; color: var(--accent-cyan); margin-bottom: 16px; }\n /* REQUIREMENT HOVER TOOLTIP */\n .req-tooltip {\n position: fixed;\n z-index: 10000;\n background: rgba(15, 23, 42, 0.95);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n border: 1px solid var(--accent-cyan);\n border-radius: 6px;\n padding: 8px 12px;\n max-width: 280px;\n font-size: 0.75rem;\n line-height: 1.35;\n color: var(--text-main);\n box-shadow: 0 8px 20px rgba(0, 0, 0, 0.5);\n pointer-events: none;\n animation: tooltipFadeIn 0.12s ease-out;\n }\n\n @keyframes tooltipFadeIn {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n .tooltip-header {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 4px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n padding-bottom: 3px;\n }\n\n .tooltip-id {\n font-weight: 700;\n color: var(--accent-cyan);\n font-size: 0.75rem;\n font-family: ui-monospace, SFMono-Regular, monospace;\n }\n\n .tooltip-title {\n font-size: 0.7rem;\n color: var(--text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .tooltip-body {\n font-size: 0.7rem;\n color: #cbd5e1;\n max-height: 80px;\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 4;\n -webkit-box-orient: vertical;\n }\n\n /* GRAPH NODE TYPOLOGIES LEGEND */\n .graph-legend {\n position: absolute;\n bottom: 16px;\n left: 16px;\n z-index: 10;\n background: rgba(30, 41, 59, 0.9);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n padding: 10px 14px;\n border-radius: 8px;\n border: 1px solid var(--border-color);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.4);\n font-size: 0.72rem;\n max-width: 520px;\n }\n .legend-header {\n font-weight: 700;\n text-transform: uppercase;\n color: var(--accent-cyan);\n margin-bottom: 6px;\n font-size: 0.68rem;\n letter-spacing: 0.05em;\n }\n .legend-items {\n display: flex;\n flex-wrap: wrap;\n gap: 6px 12px;\n }\n .legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n color: #e2e8f0;\n font-size: 0.72rem;\n }\n .legend-dot {\n width: 12px;\n height: 12px;\n display: inline-block;\n border-radius: 2px;\n flex-shrink: 0;\n }\n </style>\n</head>\n<body>\n <header>\n <div class=\"brand\">\n <h1>AI-SDLC // INTERACTIVE DASHBOARD</h1>\n <span class=\"badge ${graphData.issueCount === 0 ? 'badge-green' : 'badge-amber'}\">\n ${graphData.issueCount === 0 ? '100% COMPLIANT' : graphData.issueCount + ' ISSUES'}\n </span>\n </div>\n <div style=\"font-size: 0.75rem; color: var(--text-muted);\">\n Generated: <span>${now.replace('T', ' ').substring(0, 19)}</span>\n </div>\n </header>\n\n <nav class=\"tabs\">\n <button class=\"tab-btn active\" onclick=\"switchTab('graph')\">🌐 PDaC / RTM Graph</button>\n <button class=\"tab-btn\" onclick=\"switchTab('rtm')\">📋 360° RTM Matrix</button>\n <button class=\"tab-btn\" onclick=\"switchTab('quality')\">📊 Quality & Governance</button>\n <button class=\"tab-btn\" onclick=\"switchTab('kpis')\">📈 Telemetry & Historical KPIs</button>\n </nav>\n\n <main>\n <!-- TAB 1: CYTOSCAPE GRAPH -->\n <div id=\"tab-graph\" class=\"tab-panel active\" style=\"flex: 1;\">\n <div id=\"graph-view\">\n <div class=\"graph-toolbar\">\n <div class=\"tool-row\">\n <button class=\"tool-btn\" onclick=\"cyZoom(0.2)\">Zoom +</button>\n <button class=\"tool-btn\" onclick=\"cyZoom(-0.2)\">Zoom -</button>\n <button class=\"tool-btn\" onclick=\"cy.fit(30)\">Center</button>\n <button class=\"tool-btn\" onclick=\"resetHighlight()\">Reset</button>\n </div>\n <div class=\"tool-row\">\n <select id=\"layout-select\" class=\"tool-select\" onchange=\"applyLayout(this.value)\">\n <option value=\"breadthfirst\">Hierarchical (Layers)</option>\n <option value=\"cose\">Force-directed (COSE)</option>\n <option value=\"concentric\">Concentric</option>\n <option value=\"circle\">Circular</option>\n </select>\n </div>\n <div class=\"tool-row\">\n <select id=\"type-filter\" class=\"tool-select\" onchange=\"filterType(this.value)\">\n <option value=\"all\">All Typologies</option>\n <option value=\"journey\">Journeys (JRN)</option>\n <option value=\"actor\">Actors (ACT)</option>\n <option value=\"use-case\">Use Cases (UC)</option>\n <option value=\"business-rule\">Business Rules (BR)</option>\n <option value=\"abuse-case\">Abuse Cases (ABUSE)</option>\n <option value=\"requirement\">Requirements (FR/QR/SEC)</option>\n <option value=\"architecture\">Architecture (CMP/ADR)</option>\n <option value=\"test\">Testing (BDD/Test)</option>\n </select>\n </div>\n <div class=\"tool-row\">\n <select id=\"layer-filter\" class=\"tool-select\" onchange=\"filterLayer(this.value)\">\n <option value=\"all\">All Layers</option>\n <option value=\"product\">Layer 1: Product (Upstream)</option>\n <option value=\"requirement\">Layer 2: Requirements</option>\n <option value=\"architecture\">Layer 3: Architecture (Midstream)</option>\n <option value=\"test\">Layer 4: Testing (Downstream)</option>\n </select>\n </div>\n <div class=\"tool-row\">\n <select id=\"status-filter\" class=\"tool-select\" onchange=\"filterStatus(this.value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"COMPLIANT\">Only Compliant (Green)</option>\n <option value=\"issues\">Only Orphans / Drift (Red)</option>\n </select>\n </div>\n <div class=\"tool-row\">\n <input type=\"text\" id=\"node-search\" class=\"tool-input\" placeholder=\"Search node ID...\" oninput=\"searchNode(this.value)\">\n </div>\n </div>\n <div id=\"cy\"></div>\n <div class=\"graph-legend\">\n <div class=\"legend-header\">Node Typologies</div>\n <div class=\"legend-items\">\n <div class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#581c87; border:2px solid #c084fc;\"></span><strong>Journey</strong> (JRN)</div>\n <div class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#065f46; border:2px solid #34d399; border-radius:50%;\"></span><strong>Actor</strong> (ACT)</div>\n <div class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#0369a1; border:2px solid #38bdf8;\"></span><strong>Use Case</strong> (UC)</div>\n <div class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#b45309; border:2px solid #fbbf24; transform:rotate(45deg);\"></span><strong>Business Rule</strong> (BR)</div>\n <div class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#881337; border:2px solid #f43f5e;\"></span><strong>Abuse Case</strong> (ABUSE)</div>\n <div class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#1e293b; border:2px solid #64748b;\"></span><strong>Requirement</strong> (FR/QR/SEC)</div>\n <div class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#312e81; border:2px solid #818cf8;\"></span><strong>Architecture</strong> (CMP/ADR)</div>\n <div class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#047857; border:2px solid #10b981;\"></span><strong>Test</strong> (BDD/Test)</div>\n </div>\n </div>\n </div>\n <aside class=\"sidebar\" id=\"node-details\">\n <h2>Node Details</h2>\n <div id=\"sidebar-content\" style=\"display: flex; flex-direction: column; gap: 12px;\">\n <p style=\"color: var(--text-muted); font-size: 0.8rem;\">Click on any graph node to inspect its critical path and full traceability.</p>\n </div>\n </aside>\n </div>\n\n <!-- TAB 2: RTM TABLE -->\n <div id=\"tab-rtm\" class=\"tab-panel\">\n <div class=\"content-container\">\n <h2>360° Requirements Traceability Matrix</h2>\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Requirement ID</th>\n <th>Title</th>\n <th>Product (Upstream)</th>\n <th>Architecture (Midstream)</th>\n <th>Testing (Downstream)</th>\n <th>Global Status</th>\n </tr>\n </thead>\n <tbody>\n ${metricsData.trace.rows.map((r: any) => {\n const isRowOk = (r.productStatus === 'COMPLIANT' || r.productStatus === 'CONFORME') &&\n (r.archStatus === 'COMPLIANT' || r.archStatus === 'CONFORME') &&\n (r.testStatus === 'COMPLIANT' || r.testStatus === 'CONFORME');\n return `\n <tr onclick=\"focusNode('${r.id}')\" onmouseenter=\"startRowTooltip(event, '${r.id}')\" onmouseleave=\"cancelRowTooltip()\" onmousemove=\"updateRowTooltipPos(event)\" style=\"cursor: pointer;\">\n <td><strong><code>${r.id}</code></strong></td>\n <td>${r.title}</td>\n <td><code>${r.productTraces}</code></td>\n <td><code>${r.archTraces}</code></td>\n <td><code>${r.testTraces}</code></td>\n <td><span class=\"badge ${isRowOk ? 'badge-green' : 'badge-amber'}\">${isRowOk ? 'COMPLIANT' : 'ORPHAN'}</span></td>\n </tr>\n `}).join('')}\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- TAB 3: QUALITY & GOVERNANCE -->\n <div id=\"tab-quality\" class=\"tab-panel\">\n <div class=\"content-container\">\n <div class=\"grid-cards\">\n <div class=\"metric-card\">\n <span class=\"title\">Release Gate</span>\n <span class=\"value\" style=\"color: ${metricsData.gate.success ? 'var(--accent-emerald)' : 'var(--accent-rose)'};\">${metricsData.gate.success ? 'PASS' : 'FAIL'}</span>\n <span class=\"subtitle\">${metricsData.gate.failCount} policy-violating functions</span>\n </div>\n <div class=\"metric-card\">\n <span class=\"title\">Maintainability (SEI MI)</span>\n <span class=\"value\">${metricsData.gate.results.length > 0 ? Math.round(metricsData.gate.results.reduce((a: number, b: any) => a + b.maintainability, 0) / metricsData.gate.results.length) : 100} / 100</span>\n <span class=\"subtitle\">Minimum threshold: ${metricsData.gate.policy.min_maintainability}</span>\n </div>\n <div class=\"metric-card\">\n <span class=\"title\">Cyclomatic Complexity</span>\n <span class=\"value\">${metricsData.gate.results.length > 0 ? (metricsData.gate.results.reduce((a: number, b: any) => a + b.cyclomatic, 0) / metricsData.gate.results.length).toFixed(1) : 1.0}</span>\n <span class=\"subtitle\">Maximum threshold: ${metricsData.gate.policy.max_cyclomatic}</span>\n </div>\n <div class=\"metric-card\">\n <span class=\"title\">Requirements BDD Coverage</span>\n <span class=\"value\">${metricsData.cov.totalRequirements > 0 ? Math.round((metricsData.cov.passedRequirements / metricsData.cov.totalRequirements) * 100) : 100}%</span>\n <span class=\"subtitle\">${metricsData.cov.passedRequirements} / ${metricsData.cov.totalRequirements} verified</span>\n </div>\n </div>\n\n <div class=\"chart-container\">\n <h3>Task Autonomy Modes Distribution (Governance)</h3>\n <p style=\"font-size: 0.75rem; color: var(--text-muted); margin-bottom: 12px;\">\n Haz clic sobre cualquier tipo de autonomía para desplegar sus tareas asociadas, filtrar por estado y abrir el fichero .md correspondiente.\n </p>\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Autonomy Mode</th>\n <th>Status</th>\n <th>Count</th>\n <th>Agent Role / Required Intervention</th>\n </tr>\n </thead>\n <tbody>\n ${renderAutonomyModeSection('AUTONOMOUS', '🟢', metricsData.gov.modeCounts?.AUTONOMOUS || 0, 'Autonomous planning and coding. Asynchronous PR review.', metricsData.gov.tasks)}\n ${renderAutonomyModeSection('HUMAN_REVIEW_PLAN', '🟡', metricsData.gov.modeCounts?.HUMAN_REVIEW_PLAN || 0, 'Detailed plan approved before coding.', metricsData.gov.tasks)}\n ${renderAutonomyModeSection('AMBIGUOUS', '🟠', metricsData.gov.modeCounts?.AMBIGUOUS || 0, 'Halted: Refinement required with Product Owner.', metricsData.gov.tasks)}\n ${renderAutonomyModeSection('HIGH_RISK_MANUAL', '🔴', metricsData.gov.modeCounts?.HIGH_RISK_MANUAL || 0, 'Direct execution by human engineers.', metricsData.gov.tasks)}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n\n <!-- TAB 4: TELEMETRY & HISTORICAL KPIS -->\n <div id=\"tab-kpis\" class=\"tab-panel\">\n <div class=\"content-container\">\n <h2>Active Telemetry and KPI History</h2>\n ${metricsData.activePrKpi ? `\n <div class=\"grid-cards\">\n <div class=\"metric-card\">\n <span class=\"title\">Commits in Active Branch</span>\n <span class=\"value\">${metricsData.activePrKpi.totalCommits}</span>\n <span class=\"subtitle\">+${metricsData.activePrKpi.linesAdded} / -${metricsData.activePrKpi.linesDeleted} lines</span>\n </div>\n <div class=\"metric-card\">\n <span class=\"title\">Active Development Time</span>\n <span class=\"value\">${Math.round(metricsData.activePrKpi.totalActiveTimeSeconds / 60)}m</span>\n <span class=\"subtitle\">${metricsData.activePrKpi.totalActiveTimeSeconds}s accumulated</span>\n </div>\n <div class=\"metric-card\">\n <span class=\"title\">Consumed Tokens</span>\n <span class=\"value\">${metricsData.activePrKpi.totalTokens.toLocaleString('en-US')}</span>\n <span class=\"subtitle\">In: ${metricsData.activePrKpi.totalPromptTokens.toLocaleString()} | Out: ${metricsData.activePrKpi.totalCompletionTokens.toLocaleString()}</span>\n </div>\n <div class=\"metric-card\">\n <span class=\"title\">Estimated Compute Cost</span>\n <span class=\"value\">$${metricsData.activePrKpi.estimatedCostUsd.toFixed(2)}</span>\n <span class=\"subtitle\">Weighted USD</span>\n </div>\n </div>\n\n <div class=\"chart-container\">\n <h3>Telemetry Breakdown by Author and Model (${metricsData.activeBranch || 'HEAD'})</h3>\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Entity / Model</th>\n <th>Type</th>\n <th>Commits</th>\n <th>Lines (+/-)</th>\n <th>Active Time</th>\n <th>Consumed Tokens</th>\n <th>Estimated Cost ($ USD)</th>\n </tr>\n </thead>\n <tbody>\n ${metricsData.activePrKpi.humanSummary.commits > 0 ? `\n <tr>\n <td><strong>Human (Developer)</strong></td>\n <td><span class=\"badge\" style=\"background:#334155;\">HUMAN</span></td>\n <td>${metricsData.activePrKpi.humanSummary.commits}</td>\n <td>+${metricsData.activePrKpi.humanSummary.linesAdded} / -${metricsData.activePrKpi.humanSummary.linesDeleted}</td>\n <td>${Math.round(metricsData.activePrKpi.humanSummary.activeTimeSeconds / 60)}m</td>\n <td>0</td>\n <td>—</td>\n </tr>\n ` : ''}\n ${Object.entries(metricsData.activePrKpi.byModel).map(([model, summary]: [string, any]) => `\n <tr>\n <td><strong><code>${model}</code></strong></td>\n <td><span class=\"badge badge-green\">AGENT</span></td>\n <td>${summary.commits}</td>\n <td>+${summary.linesAdded} / -${summary.linesDeleted}</td>\n <td>${Math.round(summary.activeTimeSeconds / 60)}m</td>\n <td>${(summary.promptTokens + summary.completionTokens).toLocaleString('en-US')}</td>\n <td>$${summary.estimatedCostUsd.toFixed(2)}</td>\n </tr>\n `).join('')}\n <tr style=\"font-weight: bold; background: rgba(255,255,255,0.05);\">\n <td>TOTAL BRANCH</td>\n <td>—</td>\n <td>${metricsData.activePrKpi.totalCommits}</td>\n <td>+${metricsData.activePrKpi.linesAdded} / -${metricsData.activePrKpi.linesDeleted}</td>\n <td>${Math.round(metricsData.activePrKpi.totalActiveTimeSeconds / 60)}m</td>\n <td>${metricsData.activePrKpi.totalTokens.toLocaleString('en-US')}</td>\n <td>$${metricsData.activePrKpi.estimatedCostUsd.toFixed(2)} USD</td>\n </tr>\n </tbody>\n </table>\n </div>\n ` : ''}\n\n <div class=\"chart-container\">\n <h3>Consolidated Release History</h3>\n ${metricsData.history.length > 0 ? `\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Release</th>\n <th>Date</th>\n <th>KLoC</th>\n <th>Commits</th>\n <th>Confirmed Bugs</th>\n <th>DIR (Bugs/KLoC)</th>\n <th>Rework (%)</th>\n <th>Cost ($ USD)</th>\n </tr>\n </thead>\n <tbody>\n ${metricsData.history.map((h: any) => `\n <tr>\n <td><strong><code>${h.id}</code></strong></td>\n <td>${h.timestamp.substring(0, 10)}</td>\n <td>${h.kloc}</td>\n <td>${h.commits}</td>\n <td>${h.bugs}</td>\n <td><strong>${h.defectDensity}</strong></td>\n <td>${h.reworkPercent}%</td>\n <td>$${h.costUsd.toFixed(2)}</td>\n </tr>\n `).join('')}\n </tbody>\n </table>\n ` : `\n <p style=\"color: var(--text-muted); font-size: 0.85rem;\">\n No consolidated release reports recorded yet in <code>reports/releases/*.kpis.json</code>.\n Use the command <code>aisdlc kpi release --release <branch></code> to consolidate delivery metrics.\n </p>\n `}\n </div>\n </div>\n </div>\n </main>\n\n <!-- REQUIREMENT HOVER TOOLTIP (1s hover) -->\n <div id=\"req-tooltip\" class=\"req-tooltip\" style=\"display: none;\">\n <div class=\"tooltip-header\">\n <span class=\"tooltip-id\" id=\"tooltip-id\">FR-000</span>\n <span class=\"tooltip-title\" id=\"tooltip-title\">Title</span>\n </div>\n <div class=\"tooltip-body\" id=\"tooltip-body\"></div>\n </div>\n\n <!-- TASK DETAILS SLIDE-OVER SIDEBAR -->\n <div id=\"task-backdrop\" class=\"task-backdrop\" style=\"display: none;\" onclick=\"closeTaskSidebar()\"></div>\n <aside id=\"task-sidebar\" class=\"task-sidebar\" aria-label=\"Task Details\">\n <div class=\"task-sidebar-header\">\n <h2><span>📋 Detalles de la Tarea</span></h2>\n <button type=\"button\" class=\"task-sidebar-close\" onclick=\"closeTaskSidebar()\" title=\"Cerrar panel (Esc)\">✕</button>\n </div>\n <div class=\"task-sidebar-body\" id=\"task-sidebar-content\">\n <p style=\"color: var(--text-muted); font-size: 0.85rem;\">Haz clic en una tarea para ver sus detalles de gobernanza.</p>\n </div>\n </aside>\n\n <script>\n ${cytoscapeScript}\n </script>\n <script>\n var elements = ${elementsJson};\n var govTasks = ${JSON.stringify(metricsData.gov.tasks || [])};\n var cy = null;\n\n var reqHoverTimer = null;\n var currentHoverNodeId = null;\n var tableHoverTimer = null;\n var tableHoverId = null;\n var lastMouseX = 0;\n var lastMouseY = 0;\n\n function renderMarkdown(md) {\n if (!md || !md.trim()) {\n return '<p style=\"color: var(--text-muted); font-style: italic;\">Sin contenido detallado en el cuerpo del requisito.</p>';\n }\n try {\n var text = md\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n\n // Code blocks (triple backticks)\n var tick = String.fromCharCode(96);\n var codeBlockRe = new RegExp(tick + '{3}([a-z]*)[\\\\\\\\r\\\\\\\\n]+([\\\\\\\\s\\\\\\\\S]*?)' + tick + '{3}', 'g');\n text = text.replace(codeBlockRe, function(_, lang, code) {\n return '<pre><code>' + code.trim() + '</code></pre>';\n });\n\n // Inline code (single backtick)\n var inlineCodeRe = new RegExp(tick + '([^' + tick + ']+)' + tick, 'g');\n text = text.replace(inlineCodeRe, '<code>$1</code>');\n\n // Headers (h3, h2, h1)\n text = text.replace(/^### (.*$)/gim, '<h4>$1</h4>');\n text = text.replace(/^## (.*$)/gim, '<h3>$1</h3>');\n text = text.replace(/^# (.*$)/gim, '<h2>$1</h2>');\n\n // Bold & italic\n text = text.replace(/\\\\*\\\\*([^*]+)\\\\*\\\\*/g, '<strong>$1</strong>');\n text = text.replace(/\\\\*([^*]+)\\\\*/g, '<em>$1</em>');\n\n // Unordered lists\n text = text.replace(/^\\\\s*[-*]\\\\s+(.*$)/gim, '<li>$1</li>');\n text = text.replace(/(<li>[\\\\s\\\\S]*?<\\\\/li>(?:\\\\r?\\\\n)*)+/g, function(match) {\n return '<ul>' + match + '</ul>';\n });\n\n // Paragraph line breaks\n text = text.replace(/\\\\r?\\\\n\\\\r?\\\\n/g, '<br/><br/>');\n\n return text;\n } catch (err) {\n return '<div style=\"white-space: pre-wrap; font-family: monospace;\">' +\n md.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>') +\n '</div>';\n }\n }\n\n function showTooltip(data, x, y) {\n var tooltip = document.getElementById('req-tooltip');\n if (!tooltip) return;\n document.getElementById('tooltip-id').textContent = data.id;\n document.getElementById('tooltip-title').textContent = data.title || data.label || '';\n var bodyEl = document.getElementById('tooltip-body');\n var desc = data.content ? data.content.trim() : (data.title || data.id) + ' [' + (data.layer || data.type || 'NODE').toUpperCase() + ']';\n bodyEl.textContent = desc;\n\n tooltip.style.display = 'block';\n positionTooltip(tooltip, x, y);\n }\n\n function positionTooltip(tooltip, x, y) {\n var pad = 15;\n var left = x + pad;\n var top = y + pad;\n var rect = tooltip.getBoundingClientRect();\n if (left + rect.width > window.innerWidth - 10) {\n left = Math.max(10, x - rect.width - pad);\n }\n if (top + rect.height > window.innerHeight - 10) {\n top = Math.max(10, y - rect.height - pad);\n }\n tooltip.style.left = left + 'px';\n tooltip.style.top = top + 'px';\n }\n\n function updateTooltipPosition(x, y) {\n var tooltip = document.getElementById('req-tooltip');\n if (tooltip && tooltip.style.display !== 'none') {\n positionTooltip(tooltip, x, y);\n }\n }\n\n function hideTooltip() {\n var tooltip = document.getElementById('req-tooltip');\n if (tooltip) {\n tooltip.style.display = 'none';\n }\n }\n\n function startRowTooltip(event, id) {\n tableHoverId = id;\n lastMouseX = event.clientX;\n lastMouseY = event.clientY;\n clearTimeout(tableHoverTimer);\n tableHoverTimer = setTimeout(function() {\n if (tableHoverId === id) {\n var nodeData = null;\n if (cy) {\n var n = cy.getElementById(id);\n if (n && n.length > 0) nodeData = n.data();\n }\n if (!nodeData) {\n var el = elements.find(function(e) { return e.data && e.data.id === id; });\n if (el) nodeData = el.data;\n }\n if (nodeData) {\n showTooltip(nodeData, lastMouseX, lastMouseY);\n }\n }\n }, 1000);\n }\n\n function updateRowTooltipPos(event) {\n lastMouseX = event.clientX;\n lastMouseY = event.clientY;\n updateTooltipPosition(lastMouseX, lastMouseY);\n }\n\n function cancelRowTooltip() {\n clearTimeout(tableHoverTimer);\n tableHoverId = null;\n hideTooltip();\n }\n\n function initCytoscape() {\n if (typeof cytoscape === 'undefined') {\n console.error('Cytoscape library not loaded');\n return;\n }\n cy = cytoscape({\n container: document.getElementById('cy'),\n elements: elements,\n boxSelectionEnabled: false,\n autoungrabify: true,\n style: [\n {\n selector: 'node',\n style: {\n 'label': 'data(label)',\n 'color': '#f8fafc',\n 'font-size': '10px',\n 'text-valign': 'center',\n 'text-halign': 'center',\n 'width': 65,\n 'height': 35,\n 'background-color': '#1e293b',\n 'border-width': 2,\n 'border-color': '#64748b',\n 'text-wrap': 'ellipsis',\n 'text-max-width': '65px'\n }\n },\n // Typology Styles\n {\n selector: 'node.type-journey',\n style: {\n 'shape': 'round-rectangle',\n 'background-color': '#581c87',\n 'border-color': '#c084fc',\n 'border-width': 3,\n 'width': 85,\n 'height': 42,\n 'font-weight': 'bold',\n 'text-max-width': '80px'\n }\n },\n {\n selector: 'node.type-actor',\n style: {\n 'shape': 'ellipse',\n 'background-color': '#065f46',\n 'border-color': '#34d399',\n 'border-width': 2.5,\n 'width': 54,\n 'height': 54,\n 'font-weight': 'bold'\n }\n },\n {\n selector: 'node.type-threat-actor',\n style: {\n 'shape': 'ellipse',\n 'background-color': '#4c0519',\n 'border-color': '#fb7185',\n 'border-width': 2.5,\n 'border-style': 'dashed',\n 'width': 54,\n 'height': 54\n }\n },\n {\n selector: 'node.type-usecase, node.type-use-case',\n style: {\n 'shape': 'round-rectangle',\n 'background-color': '#0369a1',\n 'border-color': '#38bdf8',\n 'border-width': 2,\n 'width': 70,\n 'height': 38\n }\n },\n {\n selector: 'node.type-rule, node.type-business-rule',\n style: {\n 'shape': 'diamond',\n 'background-color': '#b45309',\n 'border-color': '#fbbf24',\n 'border-width': 2,\n 'width': 58,\n 'height': 58\n }\n },\n {\n selector: 'node.type-abuse-case',\n style: {\n 'shape': 'octagon',\n 'background-color': '#881337',\n 'border-color': '#f43f5e',\n 'border-width': 2.5,\n 'width': 64,\n 'height': 46\n }\n },\n {\n selector: 'node.type-security-enclave',\n style: {\n 'shape': 'hexagon',\n 'background-color': '#3b0764',\n 'border-color': '#a855f7',\n 'border-width': 2,\n 'width': 65,\n 'height': 45\n }\n },\n {\n selector: 'node.type-requirement, node.type-security-requirement',\n style: {\n 'shape': 'round-rectangle',\n 'background-color': '#1e293b',\n 'border-color': '#64748b',\n 'border-width': 2.5,\n 'width': 68,\n 'height': 36\n }\n },\n {\n selector: 'node.type-component, node.type-adr',\n style: {\n 'shape': 'hexagon',\n 'background-color': '#312e81',\n 'border-color': '#818cf8',\n 'border-width': 2,\n 'width': 60,\n 'height': 45\n }\n },\n {\n selector: 'node.type-bdd-feature, node.type-code-test, node.layer-test',\n style: {\n 'shape': 'round-rectangle',\n 'background-color': '#047857',\n 'border-color': '#10b981',\n 'border-width': 2,\n 'width': 65,\n 'height': 32\n }\n },\n // Fallback Layer styles if type is missing\n {\n selector: 'node.layer-product:not(.type-journey):not(.type-actor):not(.type-use-case):not(.type-usecase):not(.type-business-rule):not(.type-rule):not(.type-abuse-case):not(.type-threat-actor)',\n style: { 'shape': 'diamond', 'background-color': '#0e7490', 'border-color': '#38bdf8', 'width': 50, 'height': 50 }\n },\n {\n selector: 'node.layer-architecture:not(.type-component):not(.type-adr):not(.type-security-enclave)',\n style: { 'shape': 'hexagon', 'background-color': '#4338ca', 'border-color': '#818cf8', 'width': 60, 'height': 45 }\n },\n // Status modifiers\n {\n selector: 'node.status-conforme, node.status-compliant',\n style: { 'border-color': '#10b981' }\n },\n {\n selector: 'node.status-huérfano, node.status-orphan, node.status-drift',\n style: { 'border-color': '#ef4444', 'background-color': '#7f1d1d' }\n },\n // Default Edge\n {\n selector: 'edge',\n style: {\n 'width': 1.5,\n 'line-color': '#475569',\n 'target-arrow-color': '#475569',\n 'target-arrow-shape': 'triangle',\n 'curve-style': 'bezier',\n 'arrow-scale': 0.8\n }\n },\n // Semantic Edge Relations\n {\n selector: 'edge.relation-pursues',\n style: { 'line-color': '#c084fc', 'target-arrow-color': '#c084fc', 'width': 2 }\n },\n {\n selector: 'edge.relation-decomposes-into',\n style: { 'line-color': '#a855f7', 'target-arrow-color': '#a855f7', 'width': 2 }\n },\n {\n selector: 'edge.relation-initiates',\n style: { 'line-color': '#34d399', 'target-arrow-color': '#34d399', 'width': 1.8 }\n },\n {\n selector: 'edge.relation-governs',\n style: { 'line-color': '#fbbf24', 'target-arrow-color': '#fbbf24', 'line-style': 'dashed', 'width': 1.8 }\n },\n {\n selector: 'edge.relation-mitigated-by, edge.relation-mitigates',\n style: { 'line-color': '#f43f5e', 'target-arrow-color': '#f43f5e', 'line-style': 'dashed', 'width': 1.8 }\n },\n {\n selector: 'edge.relation-threatens',\n style: { 'line-color': '#e11d48', 'target-arrow-color': '#e11d48', 'line-style': 'dotted', 'width': 2 }\n },\n {\n selector: 'edge.relation-derives-from',\n style: { 'line-color': '#38bdf8', 'target-arrow-color': '#38bdf8', 'width': 1.8 }\n },\n {\n selector: 'edge.relation-satisfies',\n style: { 'line-color': '#818cf8', 'target-arrow-color': '#818cf8', 'width': 1.8 }\n },\n {\n selector: 'edge.relation-verified-by',\n style: { 'line-color': '#10b981', 'target-arrow-color': '#10b981', 'width': 1.8 }\n },\n // Highlight and dim\n {\n selector: 'node.highlighted',\n style: {\n 'border-width': 4,\n 'border-color': '#38bdf8',\n 'shadow-blur': 15,\n 'shadow-color': '#38bdf8',\n 'shadow-opacity': 0.8\n }\n },\n {\n selector: 'edge.highlighted',\n style: {\n 'line-color': '#38bdf8',\n 'target-arrow-color': '#38bdf8',\n 'width': 3,\n 'z-index': 99\n }\n },\n {\n selector: 'node.dimmed, edge.dimmed',\n style: {\n 'opacity': 0.15\n }\n }\n ],\n layout: {\n name: 'breadthfirst',\n directed: true,\n padding: 30,\n spacingFactor: 1.25\n }\n });\n\n cy.on('tap', 'node', function(evt) {\n var node = evt.target;\n var data = node.data();\n highlightCriticalPath(node);\n showNodeDetails(data);\n });\n\n cy.on('tap', function(evt) {\n if (evt.target === cy) {\n resetHighlight();\n }\n });\n\n cy.on('mouseover', 'node', function(evt) {\n var node = evt.target;\n var data = node.data();\n\n currentHoverNodeId = data.id;\n clearTimeout(reqHoverTimer);\n\n var rect = document.getElementById('cy').getBoundingClientRect();\n var clientX = (evt.originalEvent && evt.originalEvent.clientX) || (rect.left + evt.renderedPosition.x);\n var clientY = (evt.originalEvent && evt.originalEvent.clientY) || (rect.top + evt.renderedPosition.y);\n\n reqHoverTimer = setTimeout(function() {\n if (currentHoverNodeId === data.id) {\n showTooltip(data, clientX, clientY);\n }\n }, 1000);\n });\n\n cy.on('mousemove', 'node', function(evt) {\n if (evt.originalEvent) {\n updateTooltipPosition(evt.originalEvent.clientX, evt.originalEvent.clientY);\n }\n });\n\n cy.on('mouseout', 'node', function(evt) {\n clearTimeout(reqHoverTimer);\n currentHoverNodeId = null;\n hideTooltip();\n });\n }\n\n function highlightCriticalPath(node) {\n cy.elements().removeClass('highlighted dimmed');\n var predecessors = node.predecessors();\n var successors = node.successors();\n var criticalPath = node.union(predecessors).union(successors);\n \n criticalPath.addClass('highlighted');\n cy.elements().difference(criticalPath).addClass('dimmed');\n }\n\n function resetHighlight() {\n if (!cy) return;\n cy.elements().removeClass('highlighted dimmed');\n var sidebar = document.getElementById('sidebar-content');\n sidebar.innerHTML = '<p style=\"color: var(--text-muted); font-size: 0.8rem;\">Click on any graph node to inspect its critical path and full traceability.</p>';\n }\n\n function showNodeDetails(data) {\n try {\n var sidebar = document.getElementById('sidebar-content');\n if (!sidebar) return;\n var isConform = data.status === 'COMPLIANT' || data.status === 'CONFORME';\n var typeName = (data.type || data.layer || 'node').toLowerCase();\n var typeBadgeColor = '#334155';\n var typeTitle = (data.type || data.layer || 'NODE').toUpperCase();\n if (typeName === 'journey') {\n typeBadgeColor = '#581c87';\n typeTitle = 'JOURNEY (JRN)';\n } else if (typeName === 'actor') {\n typeBadgeColor = '#065f46';\n typeTitle = 'ACTOR (ACT)';\n } else if (typeName === 'threat-actor') {\n typeBadgeColor = '#4c0519';\n typeTitle = 'THREAT ACTOR (ACT-THREAT)';\n } else if (typeName === 'use-case' || typeName === 'usecase') {\n typeBadgeColor = '#0369a1';\n typeTitle = 'USE CASE (UC)';\n } else if (typeName === 'business-rule' || typeName === 'rule') {\n typeBadgeColor = '#b45309';\n typeTitle = 'BUSINESS RULE (BR)';\n } else if (typeName === 'abuse-case') {\n typeBadgeColor = '#881337';\n typeTitle = 'ABUSE CASE (ABUSE)';\n } else if (typeName === 'requirement' || typeName === 'security-requirement') {\n typeBadgeColor = '#1e293b';\n typeTitle = 'REQUIREMENT (' + (data.id.split('-')[0] || 'REQ') + ')';\n } else if (typeName === 'component' || typeName === 'adr' || typeName === 'security-enclave') {\n typeBadgeColor = '#312e81';\n typeTitle = 'ARCHITECTURE (' + (data.id.split('-')[0] || 'ARCH') + ')';\n } else if (typeName === 'bdd-feature' || typeName === 'code-test') {\n typeBadgeColor = '#047857';\n typeTitle = 'TEST VERIFICATION';\n }\n\n var html = '<div class=\"sidebar-field\"><strong>ID / Identifier:</strong> <code>' + data.id + '</code></div>';\n html += '<div class=\"sidebar-field\"><strong>Title:</strong> ' + (data.title || data.label || data.id) + '</div>';\n html += '<div class=\"sidebar-field\"><strong>Typology:</strong> <span class=\"badge\" style=\"background:' + typeBadgeColor + '; border:1px solid rgba(255,255,255,0.2);\">' + typeTitle + '</span></div>';\n html += '<div class=\"sidebar-field\"><strong>Status:</strong> <span class=\"badge ' + (isConform ? 'badge-green' : 'badge-amber') + '\">' + (data.status || 'UNKNOWN') + '</span></div>';\n if (data.filePath) {\n var cleanMetaPath = data.filePath.split('\\\\\\\\').join('/');\n if (cleanMetaPath.indexOf('./') === 0) cleanMetaPath = cleanMetaPath.substring(2);\n var metaHref = (cleanMetaPath.indexOf('http://') === 0 || cleanMetaPath.indexOf('https://') === 0 || cleanMetaPath.indexOf('file://') === 0) ? cleanMetaPath : '../' + cleanMetaPath;\n html += '<div class=\"sidebar-field\"><strong>Physical File:</strong> <a href=\"' + metaHref + '\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"color: #7dd3fc; text-decoration: underline;\" title=\"Open file: ' + cleanMetaPath + '\"><code>' + cleanMetaPath + ' ↗</code></a></div>';\n }\n if (data.upstream && data.upstream.length > 0) {\n html += '<div class=\"sidebar-field\"><strong>Upstream Traces (Product):</strong> ' + data.upstream.join(', ') + '</div>';\n }\n if (data.downstream && data.downstream.length > 0) {\n html += '<div class=\"sidebar-field\"><strong>Downstream Traces (Arch/Test):</strong> ' + data.downstream.join(', ') + '</div>';\n }\n if (data.content && data.content.trim()) {\n html += '<div class=\"sidebar-field\" style=\"margin-top: 4px;\"><strong>File Content / Specification:</strong>';\n html += '<div class=\"sidebar-content-preview\" style=\"margin-top: 6px; max-height: 280px; overflow-y: auto; background: rgba(11, 17, 32, 0.75); padding: 10px 12px; border-radius: 6px; border: 1px solid var(--border-color); font-size: 0.74rem; line-height: 1.45; color: #cbd5e1;\">';\n html += renderMarkdown(data.content);\n html += '</div></div>';\n }\n sidebar.innerHTML = html;\n } catch (err) {\n console.error('Error showing node details:', err);\n }\n }\n\n function applyLayout(name) {\n if (!cy) return;\n cy.layout({ name: name, directed: true, padding: 30, animate: true, animationDuration: 400 }).run();\n }\n\n function filterType(type) {\n if (!cy) return;\n if (type === 'all') {\n cy.elements().show();\n } else if (type === 'journey') {\n cy.elements().hide();\n var nodes = cy.nodes('.type-journey');\n nodes.show();\n nodes.connectedEdges().show();\n } else if (type === 'actor') {\n cy.elements().hide();\n var nodes = cy.nodes('.type-actor, .type-threat-actor');\n nodes.show();\n nodes.connectedEdges().show();\n } else if (type === 'use-case') {\n cy.elements().hide();\n var nodes = cy.nodes('.type-use-case, .type-usecase');\n nodes.show();\n nodes.connectedEdges().show();\n } else if (type === 'business-rule') {\n cy.elements().hide();\n var nodes = cy.nodes('.type-business-rule, .type-rule');\n nodes.show();\n nodes.connectedEdges().show();\n } else if (type === 'abuse-case') {\n cy.elements().hide();\n var nodes = cy.nodes('.type-abuse-case, .type-threat-actor');\n nodes.show();\n nodes.connectedEdges().show();\n } else if (type === 'requirement') {\n cy.elements().hide();\n var nodes = cy.nodes('.type-requirement, .type-security-requirement, .layer-requirement');\n nodes.show();\n nodes.connectedEdges().show();\n } else if (type === 'architecture') {\n cy.elements().hide();\n var nodes = cy.nodes('.type-component, .type-adr, .type-security-enclave, .layer-architecture');\n nodes.show();\n nodes.connectedEdges().show();\n } else if (type === 'test') {\n cy.elements().hide();\n var nodes = cy.nodes('.type-bdd-feature, .type-code-test, .layer-test');\n nodes.show();\n nodes.connectedEdges().show();\n } else {\n cy.elements().hide();\n var nodes = cy.nodes('.type-' + type);\n nodes.show();\n nodes.connectedEdges().show();\n }\n cy.fit(30);\n }\n\n function filterLayer(layer) {\n if (!cy) return;\n if (layer === 'all') {\n cy.elements().show();\n } else {\n cy.elements().hide();\n var nodes = cy.nodes('.layer-' + layer);\n nodes.show();\n nodes.connectedEdges().show();\n }\n cy.fit(30);\n }\n\n function filterStatus(status) {\n if (!cy) return;\n if (status === 'all') {\n cy.elements().show();\n } else if (status === 'COMPLIANT' || status === 'CONFORME') {\n cy.elements().hide();\n var nodes = cy.nodes('.status-compliant, .status-conforme');\n nodes.show();\n nodes.connectedEdges().show();\n } else {\n cy.elements().hide();\n var nodes = cy.nodes('.status-orphan, .status-huérfano, .status-drift');\n nodes.show();\n nodes.connectedEdges().show();\n }\n cy.fit(30);\n }\n\n function searchNode(text) {\n if (!cy) return;\n if (!text || text.trim() === '') {\n resetHighlight();\n return;\n }\n var q = text.trim().toLowerCase();\n var matched = cy.nodes().filter(function(ele) {\n return ele.data('id').toLowerCase().includes(q) || (ele.data('title') && ele.data('title').toLowerCase().includes(q));\n });\n if (matched.length > 0) {\n highlightCriticalPath(matched[0]);\n showNodeDetails(matched[0].data());\n cy.center(matched[0]);\n }\n }\n\n function focusNode(id) {\n cancelRowTooltip();\n switchTab('graph');\n setTimeout(function() {\n if (!cy) return;\n var node = cy.getElementById(id);\n if (node && node.length > 0) {\n highlightCriticalPath(node);\n showNodeDetails(node.data());\n cy.center(node);\n cy.zoom(1.2);\n }\n }, 100);\n }\n\n function cyZoom(val) {\n if (!cy) return;\n cy.zoom(cy.zoom() + val);\n }\n\n function switchTab(name) {\n hideTooltip();\n document.querySelectorAll('.tab-btn').forEach(function(b) { b.classList.remove('active'); });\n document.querySelectorAll('.tab-panel').forEach(function(p) { p.classList.remove('active'); });\n event.target?.classList?.add('active');\n var p = document.getElementById('tab-' + name);\n if (p) p.classList.add('active');\n if (name === 'graph' && cy) {\n cy.resize();\n cy.fit(30);\n }\n }\n\n function toggleAutonomyTasks(mode) {\n var panel = document.getElementById('tasks-row-' + mode);\n var icon = document.getElementById('toggle-icon-' + mode);\n if (!panel) return;\n var isHidden = panel.style.display === 'none' || panel.style.display === '';\n if (isHidden) {\n panel.style.display = 'table-row';\n if (icon) icon.classList.add('open');\n } else {\n panel.style.display = 'none';\n if (icon) icon.classList.remove('open');\n }\n }\n\n function filterAutonomyTasks(mode, filter, event) {\n if (event) {\n event.stopPropagation();\n }\n var panel = document.getElementById('tasks-row-' + mode);\n if (!panel) return;\n\n var btns = panel.querySelectorAll('.filter-btn');\n btns.forEach(function(b) { b.classList.remove('active'); });\n var activeBtn = document.getElementById('btn-filter-' + mode + '-' + filter);\n if (activeBtn) activeBtn.classList.add('active');\n\n var allRows = panel.querySelectorAll('.task-item');\n var visibleCount = 0;\n allRows.forEach(function(row) {\n if (filter === 'all') {\n row.style.display = '';\n visibleCount++;\n } else if (filter === 'open') {\n if (row.classList.contains('task-item-open')) {\n row.style.display = '';\n visibleCount++;\n } else {\n row.style.display = 'none';\n }\n } else if (filter === 'closed') {\n if (row.classList.contains('task-item-closed')) {\n row.style.display = '';\n visibleCount++;\n } else {\n row.style.display = 'none';\n }\n }\n });\n\n var tableEl = panel.querySelector('.sub-data-table');\n var emptyMsg = document.getElementById('tasks-empty-' + mode);\n if (emptyMsg) {\n if (visibleCount === 0) {\n emptyMsg.textContent = filter === 'open'\n ? 'No hay tareas abiertas para este modo.'\n : (filter === 'closed' ? 'No hay tareas cerradas para este modo.' : 'No hay tareas registradas para este modo.');\n emptyMsg.style.display = 'block';\n if (tableEl) tableEl.style.display = 'none';\n } else {\n emptyMsg.style.display = 'none';\n if (tableEl) tableEl.style.display = 'table';\n }\n }\n }\n\n function showTaskSidebar(index) {\n if (typeof govTasks === 'undefined' || !govTasks[index]) return;\n var t = govTasks[index];\n var task = t.task || {};\n var sidebar = document.getElementById('task-sidebar');\n var backdrop = document.getElementById('task-backdrop');\n var contentEl = document.getElementById('task-sidebar-content');\n if (!sidebar || !contentEl) return;\n\n var rawStatus = (task.status || 'PENDING').toUpperCase();\n var isClosed = rawStatus === 'COMPLETED';\n var badgeClass = 'badge-amber';\n var badgeText = rawStatus + ' (Abierta)';\n if (rawStatus === 'COMPLETED') {\n badgeClass = 'badge-green';\n badgeText = 'COMPLETED (Cerrada)';\n } else if (rawStatus === 'IN_PROGRESS') {\n badgeClass = 'badge-blue';\n badgeText = 'IN_PROGRESS (Abierta)';\n } else if (rawStatus === 'BLOCKED') {\n badgeClass = 'badge-rose';\n badgeText = 'BLOCKED (Abierta)';\n }\n\n var cleanPath = (t.file || '').split(String.fromCharCode(92)).join('/');\n if (cleanPath.indexOf('./') === 0) cleanPath = cleanPath.substring(2);\n var metaHref = cleanPath;\n if (cleanPath.indexOf('http://') === 0 || cleanPath.indexOf('https://') === 0 || cleanPath.indexOf('file://') === 0) {\n metaHref = cleanPath;\n } else if (cleanPath.indexOf(':') === 1 || cleanPath.indexOf('/') === 0) {\n metaHref = 'file:///' + cleanPath.replace(/^[/]+/, '');\n } else {\n metaHref = '../' + cleanPath;\n }\n\n var html = '';\n html += '<div class=\"sidebar-field\"><strong>ID de la Tarea:</strong> <code style=\"font-size: 0.95rem; color: var(--accent-cyan); font-weight: 700;\">' + (task.id || 'TSK-UNKNOWN') + '</code></div>';\n html += '<div class=\"sidebar-field\"><strong>Título:</strong> <span style=\"font-size: 0.9rem; font-weight: 600; color: var(--text-main);\">' + (task.title || 'Sin título') + '</span></div>';\n html += '<div class=\"sidebar-field\"><strong>Estado:</strong> <span class=\"badge ' + badgeClass + '\">' + badgeText + '</span></div>';\n html += '<div class=\"sidebar-field\"><strong>Modo de Autonomía:</strong> <code>' + (task.autonomyMode || 'UNKNOWN') + '</code></div>';\n if (task.riskLevel) {\n html += '<div class=\"sidebar-field\"><strong>Nivel de Riesgo:</strong> <span class=\"badge\" style=\"background:#334155;\">' + task.riskLevel + '</span></div>';\n }\n if (task.complexity) {\n html += '<div class=\"sidebar-field\"><strong>Complejidad:</strong> <span class=\"badge\" style=\"background:#334155;\">' + task.complexity + '</span></div>';\n }\n html += '<div class=\"sidebar-field\"><strong>Asignada a:</strong> <code>' + (task.assignedTo || 'agent-developer') + '</code></div>';\n\n var criteria = (task.verification && task.verification.criteria) || 'No especificado';\n var method = (task.verification && task.verification.method) || 'N/A';\n html += '<div class=\"sidebar-field\"><strong>Método de Verificación:</strong> <code>' + method + '</code></div>';\n html += '<div class=\"sidebar-field\"><strong>Criterio / Comando de Aceptación:</strong><pre><code>' + criteria + '</code></pre></div>';\n\n if (task.blockingReason) {\n html += '<div class=\"sidebar-field\"><strong style=\"color: var(--accent-rose);\">Motivo de Bloqueo:</strong> <div style=\"background: rgba(239, 68, 68, 0.15); border: 1px solid var(--accent-rose); border-radius: 4px; padding: 8px; color: #fca5a5;\">' + task.blockingReason + '</div></div>';\n }\n\n html += '<div class=\"sidebar-field\"><strong>Gobernanza y Validación:</strong>';\n html += '<div style=\"display: flex; flex-direction: column; gap: 4px; margin-top: 4px; font-size: 0.75rem;\">';\n html += '<div>Verificación ejecutable: ' + (t.hasVerification ? '✅ Sí' : '❌ Falta') + '</div>';\n html += '<div>Modo de autonomía válido: ' + (t.validAutonomy ? '✅ Sí' : '⚠️ Inválido') + '</div>';\n html += '<div>Anomalías de seguridad/riesgo: ' + (t.riskAnomaly ? '⚠️ Detectadas' : '✅ Ninguna') + '</div>';\n html += '</div></div>';\n\n html += '<div class=\"sidebar-field\" style=\"margin-top: 8px; border-top: 1px solid var(--border-color); padding-top: 12px;\"><strong>Fichero de Especificación (.md):</strong>';\n html += '<div style=\"margin-top: 4px;\"><a href=\"' + metaHref + '\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"color: #7dd3fc; text-decoration: underline; font-family: monospace; font-size: 0.8rem;\" title=\"Abrir archivo original\"><code>' + cleanPath + ' ↗</code></a></div>';\n html += '</div>';\n\n contentEl.innerHTML = html;\n sidebar.classList.add('open');\n if (backdrop) backdrop.style.display = 'block';\n }\n\n function closeTaskSidebar() {\n var sidebar = document.getElementById('task-sidebar');\n var backdrop = document.getElementById('task-backdrop');\n if (sidebar) sidebar.classList.remove('open');\n if (backdrop) backdrop.style.display = 'none';\n }\n\n window.addEventListener('keydown', function(evt) {\n if (evt.key === 'Escape' || evt.key === 'Esc') {\n hideTooltip();\n closeTaskSidebar();\n }\n });\n\n window.addEventListener('DOMContentLoaded', function() {\n initCytoscape();\n });\n </script>\n</body>\n</html>`;\n}\n\n/**\n * Main function to generate the dashboard report.\n */\nexport function generateDashboardReport(options: DashboardOptions = {}): DashboardResult {\n const rootDir = options.rootDir || process.cwd();\n const outputPath = options.outputPath || path.join(rootDir, 'reports', 'dashboard.html');\n\n const graphData = buildGraphElements(rootDir);\n const metricsData = collectDashboardMetrics(rootDir);\n const html = renderDashboardHtml(graphData, metricsData, options.title);\n\n const outDir = path.dirname(outputPath);\n if (!fs.existsSync(outDir)) {\n fs.mkdirSync(outDir, { recursive: true });\n }\n\n fs.writeFileSync(outputPath, html, 'utf-8');\n\n const totalReqs = metricsData.cov.totalRequirements || 1;\n const passedReqs = metricsData.cov.passedRequirements || 0;\n const bddCoverageRatio = Math.round((passedReqs / totalReqs) * 100);\n\n const traceReqs = metricsData.trace.totalRequirements || 1;\n const conformingTrace = metricsData.trace.totalRequirements - metricsData.trace.orphanCount;\n const traceabilityRatio = Math.round((conformingTrace / traceReqs) * 100);\n\n const gateResults = metricsData.gate.results;\n const avgMi = gateResults.length > 0 ? Math.round(gateResults.reduce((a, b) => a + b.maintainability, 0) / gateResults.length) : 100;\n const avgCc = gateResults.length > 0 ? Math.round((gateResults.reduce((a, b) => a + b.cyclomatic, 0) / gateResults.length) * 10) / 10 : 1;\n\n return {\n outputPath,\n totalNodes: graphData.elements.filter((e) => e.group === 'nodes').length,\n totalEdges: graphData.elements.filter((e) => e.group === 'edges').length,\n conformingCount: graphData.conformingCount,\n issueCount: graphData.issueCount,\n nodesByLayer: graphData.nodesByLayer,\n metrics: {\n totalFiles: metricsData.gate.totalFiles,\n totalFunctions: metricsData.gate.totalFunctions,\n avgMaintainability: avgMi,\n avgCyclomatic: avgCc,\n qualityVerdict: metricsData.gate.success ? 'PASS' : 'FAIL',\n autonomyDistribution: metricsData.gov.modeCounts || {},\n traceabilityRatio,\n bddCoverageRatio,\n },\n html,\n };\n}\n","/**\n * AI-SDLC: Starter templates for Agent Native Configs, Specialized Agents, and MCP\n */\n\nexport interface SpecializedAgentTemplate {\n id: string;\n title: string;\n description: string;\n globs: string;\n body: string;\n}\n\nexport const SPECIALIZED_AGENT_TEMPLATES: readonly SpecializedAgentTemplate[] = [\n {\n id: 'agent-product-analyst',\n title: 'Product Analyst / Scribe',\n description:\n 'Assist the human Product Owner in exploring, modeling, and refining product definition using ProductShape (ACT-*, UC-*, FR-*, QR-*, BR-*).',\n globs: 'product/**, specs/product/**, templates/product/**',\n body: `## Role & Mission\n- **Role**: Product Analyst Agent (\\`agent-product-analyst\\`) and Technical Scribe (AI as Scribe) of the AI-SDLC framework.\n- **Mission**: Transform natural language business intent into canonical ProductShape artifacts (\\`ACT-*\\`, \\`JRN-*\\`, \\`UC-*\\`, \\`BR-*\\`, \\`TERM-*\\`, \\`FR-*\\`, \\`QR-*\\`) 100% compliant with JSON schemas.\n\n## Operational Directives & Guardrails\n- Every generated artifact must strictly adhere to the canonical Markdown and YAML frontmatter format in \\`schemas/product/\\`.\n- \\`status\\` ALWAYS starts as \\`draft\\`. Creating artifacts directly as \\`active\\` or \\`approved\\` is forbidden.\n- Always write relationships in their single canonical direction (\\`derives-from: [UC-*]\\`, \\`primary-actor: ACT-*\\`).\n- In \\`UC-*\\`, format section \\`1. Intent and Outcome\\` under the standard English structure: \\`As a <ACT-ID>... I want <action>... To <outcome>...\\`.\n- In every \\`FR-*\\` requirement, include a \\`\\`\\`gherkin block with tags \\`@<ID> @automated @regression\\`, nominal \\`Scenario\\`, and at least one \\`Scenario Outline\\` with an \\`Examples\\` table.\n- Do not assume business rules. If you detect an ambiguity, record it explicitly under \\`open-questions\\`.\n- Run \\`pnpm run verify:schemas\\` and \\`pnpm run verify:duplicates\\` before delivering the draft.\n- If autonomy is $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`, conclude by emitting the canonical Workflow Handoff block (\\`templates/workflow/agent-handoff.template.md\\`) suggesting \\`agent-threat-modeler\\` or \\`agent-expert-user\\`, opening the Human Action Window. In \\`AUTONOMOUS\\` mode, omit interactive handoff.`,\n },\n {\n id: 'agent-threat-modeler',\n title: 'Threat Modeler and Security Specialist',\n description:\n 'Analyze business use cases and architecture artifacts to proactively model STRIDE adversaries, abuse cases, and OWASP ASVS security requirements.',\n globs: 'security/**, specs/security/**, architecture/**',\n body: `## Role & Mission\n- **Role**: Threat Modeling and Shift-Left Cybersecurity Specialist Agent (\\`agent-threat-modeler\\`).\n- **Mission**: Analyze business use cases and architecture artifacts to proactively model adversaries, STRIDE attack vectors, and OWASP ASVS mitigation requirements.\n\n## Operational Directives & Guardrails\n- Apply STRIDE and OWASP ASVS methodologies to every use case \\`UC-*\\` and architecture component \\`CMP-*\\` (Mermaid C4/arc42 diagrams, ADR records).\n- Systematically generate the cybersecurity triad conforming to \\`schemas/security/\\`:\n - \\`ACT-THREAT-*\\` (Threat Actor)\n - \\`ABUSE-*\\` (Abuse Case targeting \\`UC-*\\` with \\`mitigated-by: [SEC-REQ-*]\\`)\n - \\`SEC-REQ-*\\` (Security Requirement with \\`mitigates-abuse-case: [ABUSE-*]\\` and \\`enforced-in-enclave: SEC-ENC-*\\`)\n- \\`status\\` ALWAYS starts as \\`draft\\`.\n- In the **Technical Security Feedback Loop** (arriving from \\`agent-system-architect\\`), analyze infrastructure, persistence, middleware, and API decisions to issue system/software-level \\`ACT-THREAT-*\\` and \\`SEC-REQ-*\\`.\n- Every \\`SEC-REQ-*\\` must include negative BDD attack and rejection scenarios tagged \\`@security @mitigation\\`.\n- Run \\`pnpm run verify:schemas\\` before delivering the draft.\n- If autonomy is $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`, conclude by emitting the Workflow Handoff block (\\`templates/workflow/agent-handoff.template.md\\`) suggesting \\`agent-system-architect\\` (or \\`agent-qa-engineer\\` once technical modeling is complete) and opening the Human Action Window. In \\`AUTONOMOUS\\` mode, omit interactive handoff.`,\n },\n {\n id: 'agent-system-architect',\n title: 'System Architect',\n description:\n 'Translate approved product and security definitions into modular technical architecture based on arc42 enriched with NAF v4 (CMP-*, ADR-*).',\n globs: 'architecture/**, specs/changes/**/design.md, templates/architecture/**',\n body: `## Role & Mission\n- **Role**: System Architect Agent (\\`agent-system-architect\\`) of the AI-SDLC framework.\n- **Mission**: Translate approved product definition into a modular technical architecture based on arc42 enriched with NAF v4.\n\n## Operational Directives & Guardrails\n- Decompose the system into building blocks \\`CMP-*\\` ensuring each component declares which use cases \\`UC-*\\` it implements and which requirements (\\`FR-*\\`, \\`QR-*\\`, \\`SEC-REQ-*\\`) it fulfills under \\`satisfies-requirements\\`.\n- Generate interaction and sequence diagrams in native Mermaid syntax.\n- Document critical technological decisions using immutable \\`ADR-*\\` records conforming to \\`schemas/architecture/adr.schema.json\\`.\n- Validate that architectural choices comply with legal constraints in \\`license-policy.yaml\\`.\n- **Technical Security Feedback Loop**: If architectural decisions (databases, queues, distributed caching, third-party APIs, authentication schemes) introduce new attack vectors, emit a return handoff to \\`agent-threat-modeler\\` for technical modeling prior to the testing phase.\n- If autonomy is $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`, conclude by emitting the Workflow Handoff block (\\`templates/workflow/agent-handoff.template.md\\`) suggesting \\`agent-qa-engineer\\` (or \\`agent-threat-modeler\\` if technical security loop is required) and opening the Human Action Window. In \\`AUTONOMOUS\\` mode, omit interactive handoff.`,\n },\n {\n id: 'agent-qa-engineer',\n title: 'QA Engineer and SDET',\n description:\n 'Translate approved requirements (FR-*, SEC-REQ-*, QR-*) into comprehensive FAILING (red) BDD/Gherkin and unit test suites before production code is written.',\n globs: 'tests/**, specs/changes/**/spec.md',\n body: `## Role & Mission\n- **Role**: QA Engineer and SDET (Software Development Engineer in Test) Agent (\\`agent-qa-engineer\\`).\n- **Mission**: Translate approved requirements (\\`FR-*\\`, \\`SEC-REQ-*\\`, \\`QR-*\\`) into comprehensive FAILING (red) BDD/Gherkin test suites before \\`agent-developer\\` writes a single line of production code.\n\n## Operational Directives & Guardrails\n- Read exclusively requirements cited in the \\`handoff.yaml\\` sidecar (\\`HOF-*\\`) and their referenced artifacts.\n- For each \\`FR-*\\` requirement, generate the three mandatory test categories:\n 1. **Nominal Case** (\\`Scenario\\`): happy path with valid inputs within expected boundaries.\n 2. **Boundary Cases** (\\`Scenario Outline\\` + \\`Examples\\` table): values at the extremes of the accepted range.\n 3. **Out-of-Range / Invalid Cases** (\\`Scenario Outline\\` + \\`Examples\\` table): null, empty, wrong types, values exceeding bounds.\n- Apply conditional categories when applicable: Security (\\`@security @mitigation\\`), Performance (\\`@performance\\`), Idempotency (\\`@idempotence\\`), Postconditions, and Interface Contracts.\n- Tag all scenarios with \\`@<FR-ID> @automated @regression\\`.\n- **STRICTLY FORBIDDEN**: Including production code, suggesting implementation, or anticipating technical solutions.\n- Run \\`pnpm run verify:testing\\` before emitting handoff.\n- If autonomy is $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`, conclude by emitting the Workflow Handoff block (\\`templates/workflow/agent-handoff.template.md\\`) suggesting \\`agent-developer\\` and opening the Human Action Window. In \\`AUTONOMOUS\\` mode, omit interactive handoff.`,\n },\n {\n id: 'agent-developer',\n title: 'Software Developer',\n description:\n 'Implement atomic tasks from SDD specifications (tasks.md) delivering clean, strictly typed, and tested code satisfying quality-policy.yaml thresholds.',\n globs: 'src/**, packages/**, tests/**, specs/changes/**',\n body: `## Role & Mission\n- **Role**: High-Precision Software Developer / Coder Agent (\\`agent-developer\\`).\n- **Mission**: Implement atomic tasks from SDD specifications (\\`tasks.md\\`) delivering clean, strictly typed, and tested code.\n\n## Operational Directives & Guardrails\n- Respect the autonomy mode assigned to each task in \\`tasks.md\\` (\\`AUTONOMOUS\\`, \\`HUMAN_REVIEW_PLAN\\`, \\`AMBIGUOUS\\`, \\`HIGH_RISK_MANUAL\\`).\n- Apply Test-Driven Development (TDD): make failing tests delivered by \\`agent-qa-engineer\\` pass green without altering tests to accommodate buggy code.\n- Cite implemented \\`FR-*\\` or \\`SEC-REQ-*\\` IDs in test header comments to maintain 360° reverse traceability.\n- Before adding any external dependency, verify its SPDX license is permitted in \\`license-policy.yaml\\`.\n- Respect non-negotiable \\`quality-policy.yaml\\` thresholds: Cyclomatic Complexity $\\\\le 10$, Cognitive Complexity $\\\\le 15$, Maintainability Index $\\\\ge 50$, Function Length $\\\\le 40$ lines.\n- Run unified pre-flight with auto-fix (\\`pnpm run check:fix\\`) and full verification (\\`pnpm run verify:all\\`).\n- Upon completing green implementation, suggest handoff to \\`agent-expert-user\\` for Post-Development Functional Validation prior to security audit.`,\n },\n {\n id: 'agent-security-auditor',\n title: 'Adversarial Code Auditor',\n description:\n 'Examine Pull Requests and source code with an attacker mindset for business logic vulnerabilities, injection vectors, secret leaks, and authorization flaws.',\n globs: 'src/**, packages/**, security/**',\n body: `## Role & Mission\n- **Role**: Adversarial Security Auditor Agent (\\`agent-security-auditor\\`).\n- **Mission**: Rigorously examine Pull Requests and code diffs for business logic vulnerabilities, injection vectors, secret leaks, and authorization flaws as part of the Pre-Merge Audit Triad.\n\n## Operational Directives & Guardrails\n- Analyze code diffs with an attacker mindset: How can an unauthenticated user bypass this check? Are there info leaks in exceptions? Is command, SQL, path traversal, or prompt injection possible?\n- Run deterministic security verification: \\`pnpm run verify:security\\` (secrets + shift-left SAST).\n- Issue a formal audit report with CVSS v3.1 severity scoring and concrete remediation proposals.\n- Immediately block any PR introducing CRITICAL or HIGH security risks.\n- If autonomy is $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`, conclude by emitting the Workflow Handoff block (\\`templates/workflow/agent-handoff.template.md\\`) to the human Tech Lead, opening the Human Action Window. In \\`AUTONOMOUS\\` mode, omit interactive handoff.`,\n },\n {\n id: 'agent-compliance-checker',\n title: 'Open Source License Compliance Auditor',\n description:\n 'Audit dependency manifests and SBOMs against license-policy.yaml to block viral copyleft licenses and flag commercial license requirements.',\n globs: 'package.json, pnpm-lock.yaml, license-policy.yaml, compliance/**',\n body: `## Role & Mission\n- **Role**: Open Source License and Intellectual Property Compliance Auditor Agent (\\`agent-compliance-checker\\`).\n- **Mission**: Audit dependency manifests and ensure every direct and transitive third-party package complies with \\`license-policy.yaml\\` as part of the Pre-Merge Audit Triad.\n\n## Operational Directives & Guardrails\n- Verify SPDX identifiers for every direct and transitive dependency via \\`pnpm run verify:licenses\\`.\n- Immediately block viral copyleft licenses (\\`GPL-*\\`, \\`AGPL-*\\`) and unknown/unlicensed packages.\n- If source-available or commercial licenses (\\`BSL-1.1\\`, \\`SSPL-1.0\\`) are detected, flag with \\`COMMERCIAL_APPROVAL_REQUIRED\\` and draft a request using \\`templates/compliance/commercial-acquisition-request.template.md\\`.\n- If autonomy is $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`, conclude by emitting the Workflow Handoff block (\\`templates/workflow/agent-handoff.template.md\\`) to the human Tech Lead or Legal counsel, opening the Human Action Window. In \\`AUTONOMOUS\\` mode, omit interactive handoff.`,\n },\n {\n id: 'agent-expert-user',\n title: 'Expert User and Domain Evaluator',\n description:\n 'Scrutinize product design (MVP vs roadmap) and functionally validate finished software against UC-* and FR-* acceptance criteria before pre-merge audit.',\n globs: 'product/**, specs/**, src/**, packages/**',\n body: `## Role & Mission\n- **Role**: Expert User and Domain Evaluator Agent (\\`agent-expert-user\\`).\n- **Mission**: Scrutinize product design, technical specifications, and implemented software from the perspective of an advanced operator, enforcing strict MVP boundaries and pre-PR functional conformity.\n\n## Operational Directives & Guardrails\n- Operate under bimodal discipline depending on the lifecycle phase:\n 1. **Design Mode (Upstream)**: Adopt the primary actor persona under real-world field conditions (stress, latency, constrained viewports). Separate strict Minimum Viable Product (MVP) core from future roadmap ideas using \\`templates/product/user-design-feedback.template.md\\`.\n 2. **Functional Validation Mode (Downstream / Pre-PR / Post-Development Functional Validation)**: Inspect \\`agent-developer\\` deliverables once unit tests pass green. Contrast actual UI, CLI, and API behavior against approved \\`UC-*\\` and \\`FR-*\\` criteria.\n- Formulate decisive questions under \\`open-questions\\` for the human Product Owner.\n- Emit handoff block suggesting the Pre-Merge Audit Triad (\\`agent-code-reviewer\\`, \\`agent-security-auditor\\`, \\`agent-compliance-checker\\`) if compliant, or return to \\`agent-developer\\` on functional drift.`,\n },\n {\n id: 'agent-code-reviewer',\n title: 'Technical and Architectural Code Reviewer',\n description:\n 'Audit Pull Requests for Clean Code, SOLID, DRY, YAGNI, design patterns, and compliance with quality-policy.yaml complexity and maintainability thresholds.',\n globs: 'src/**, packages/**, tests/**',\n body: `## Role & Mission\n- **Role**: Technical and Architectural Code Reviewer Agent (\\`agent-code-reviewer\\`).\n- **Mission**: Audit Pull Requests evaluating code cleanliness, adherence to SOLID, DRY, YAGNI principles, design patterns, and compliance with complexity and maintainability thresholds (\\`quality-policy.yaml\\`), forming part of the Pre-Merge Audit Triad.\n\n## Operational Directives & Guardrails\n- Analyze code diffs against \\`quality-policy.yaml\\` standards: Cyclomatic Complexity $\\\\le 10$, Cognitive Complexity $\\\\le 15$, Maintainability Index $\\\\ge 50$, Lines per Function $\\\\le 40$.\n- Detect improper coupling, code smells, magic numbers, ambiguous identifiers, and encapsulation breaches.\n- Flag premature abstractions and speculative code violating YAGNI.\n- Coordinate Pre-Merge Audit Triad with \\`agent-security-auditor\\` and \\`agent-compliance-checker\\`.\n- Categorize findings into: \\`[BLOCKING]\\` (quality violation or broken pattern), \\`[CLEAN_CODE_SUGGESTION]\\` (non-blocking improvement), and \\`[COMPLIANT]\\`.\n- If autonomy is $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`, conclude by emitting the Workflow Handoff block (\\`templates/workflow/agent-handoff.template.md\\`) to the human Tech Lead for final approval and merge, opening the Human Action Window. In \\`AUTONOMOUS\\` mode, omit interactive handoff.`,\n },\n {\n id: 'agent-devops',\n title: 'Automation and Infrastructure Engineer',\n description:\n 'Maintain, evolve, and audit CI/CD workflows, Dockerfiles, IaC manifests, and support scripts under strict non-invasion guardrails on src/.',\n globs: '.github/workflows/**, templates/ci/**, scripts/**, Dockerfile*',\n body: `## Role & Mission\n- **Role**: DevOps and Infrastructure as Code (IaC) Engineer Agent (\\`agent-devops\\`).\n- **Mission**: Maintain, evolve, and audit automated project infrastructure: CI/CD workflows, Docker containers, deployment manifests, and infrastructure scripts.\n\n## Operational Directives & Guardrails\n- **Strict Infrastructure Domain**: Operate exclusively on workflows (\\`.github/workflows/\\`, \\`templates/ci/\\`), container files (\\`Dockerfile*\\`, \\`docker-compose*.yml\\`), IaC manifests, and support scripts (\\`scripts/\\`).\n- **NON-INVASION GUARDRAIL**: STRICTLY FORBIDDEN from modifying or refactoring application source code files (\\`src/\\`, \\`packages/*/src/\\`). Your responsibility is pipelines and scaffolding, never business logic.\n- **Infrastructure Dependency Policy**: Verify licenses of dependencies, Docker base images, and third-party CI actions against \\`license-policy.yaml\\`.\n- **Gate Preservation**: Ensure any pipeline optimization keeps all existing deterministic Quality Gates intact.\n- If autonomy is $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`, conclude by emitting the Workflow Handoff block (\\`templates/workflow/agent-handoff.template.md\\`) to the human Tech Lead or Release Manager, opening the Human Action Window. In \\`AUTONOMOUS\\` mode, omit interactive handoff.`,\n },\n];\n\nexport function renderAntigravityAgentFile(agent: SpecializedAgentTemplate): string {\n return `---\\nname: ${agent.id}\\ndescription: >-\\n ${agent.description}\\n---\\n\\n# ${agent.id} (${agent.title})\\n\\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](../../process/09_agent_protocols.md) and [\\`process/01_governance_and_roles.md\\`](../../process/01_governance_and_roles.md).\\n\\n${agent.body}\\n`;\n}\n\nexport function renderClaudeAgentFile(agent: SpecializedAgentTemplate): string {\n return `---\\nname: ${agent.id}\\ndescription: ${agent.description}\\n---\\n\\n# ${agent.id} (${agent.title})\\n\\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](../../process/09_agent_protocols.md) and [\\`process/01_governance_and_roles.md\\`](../../process/01_governance_and_roles.md).\\n\\n${agent.body}\\n`;\n}\n\nexport function renderCopilotAgentFile(agent: SpecializedAgentTemplate): string {\n return `---\\nname: ${agent.id}\\ndescription: ${agent.description}\\n---\\n\\n# ${agent.id} (${agent.title})\\n\\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](../../process/09_agent_protocols.md) and [\\`process/01_governance_and_roles.md\\`](../../process/01_governance_and_roles.md).\\n\\n${agent.body}\\n`;\n}\n\nexport function renderCursorAgentFile(agent: SpecializedAgentTemplate): string {\n return `---\\ndescription: ${agent.id} (${agent.title}) - ${agent.description}\\nglobs: ${agent.globs}\\nalwaysApply: false\\n---\\n\\n# ${agent.id} (${agent.title})\\n\\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](../../process/09_agent_protocols.md) and [\\`process/01_governance_and_roles.md\\`](../../process/01_governance_and_roles.md).\\n\\n${agent.body}\\n`;\n}\n\nexport const STARTER_ANTIGRAVITY_RULES = `# Google Antigravity & Gemini CLI Rules - AI-SDLC Framework\n\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](../../process/09_agent_protocols.md) and [\\`process/01_governance_and_roles.md\\`](../../process/01_governance_and_roles.md).\n\nThis file defines the operational rules and specialized role mappings for Google Antigravity and Gemini CLI-based agents within the AI-SDLC ecosystem.\n\n---\n\n## 1. The 5 Unbreakable Commandments of Agents | Los 5 Mandamientos Inquebrantables de los Agentes\n\n1. **FORBIDDEN TO AUTO-APPROVE OR AUTO-MERGE | PROHIBIDO AUTO-APROBAR O AUTO-FUSIONAR**: No agent may auto-approve PRs or perform direct merges to protected branches (\\`main\\`, \\`release/*\\`). Only a human engineer may approve or merge.\n2. **FORBIDDEN TO INVENT PRODUCT OR ARCHITECTURE DECISIONS**: When facing ambiguous requirements, formulate clarifying questions (\\`open-questions\\`). Never assume unspecified intentions.\n3. **FORBIDDEN TO INTRODUCE DEPENDENCIES WITHOUT LICENSE INSPECTION**: Always consult \\`license-policy.yaml\\`. Dependencies with viral licenses (\\`GPL\\`/\\`AGPL\\`) or commercial paid licenses (\\`BSL\\`/\\`SSPL\\`) are strictly forbidden without authorization.\n4. **FORBIDDEN TO IGNORE CYBERSECURITY (SECURITY-BY-DEFAULT)**: Validate inputs, sanitize data, and add mitigation tests (\\`SEC-TEST-*\\`). Disabling linters or suppressing typing errors is prohibited.\n5. **MANDATORY CRYPTOGRAPHIC CITATION**: Every derived artifact must cite upstream artifacts using canonical identifiers and their Unix LF-normalized SHA-256 cryptographic hashes.\n\n---\n\n## 2. Specialized Roles Mapping\n\n### 1. \\`agent-product-analyst\\` (Product Analyst / Scribe)\n- **Mission**: Assist in defining and refining the product model using ProductShape.\n- **Input**: Business intent or natural language specification.\n- **Output**: Markdown artifacts with YAML frontmatter compliant with \\`schemas/product/\\` (\\`ACT-*\\`, \\`UC-*\\`, \\`FR-*\\`, \\`QR-*\\`, \\`BR-*\\`).\n- **Guardrails**:\n - \\`status\\` always starts in \\`draft\\`.\n - In \\`UC-*\\`, format section \\`1. Intent and Outcome\\` under the standard English structure: \\`As a <ACT-ID>... I want <action>... To <outcome>...\\`.\n - Mandatory Gherkin criteria with \\`@<ID> @automated @regression\\`.\n - Run \\`pnpm run verify:schemas\\` and \\`pnpm run verify:duplicates\\` before delivering the draft.\n\n### 2. \\`agent-threat-modeler\\` (Threat Modeler and Security Specialist)\n- **Mission**: Analyze use cases and proactively model adversaries, STRIDE attack vectors, and OWASP ASVS mitigations, both at product level and in the technical security feedback loop over architecture.\n- **Input**: Use cases \\`UC-*\\`, functional requirements \\`FR-*\\`, or architecture components (\\`CMP-*\\`, Mermaid diagrams, ADRs).\n- **Output**: Cybersecurity triad (\\`ACT-THREAT-*\\`, \\`ABUSE-*\\`, \\`SEC-REQ-*\\`) compliant with \\`schemas/security/\\`.\n- **Guardrails**:\n - \\`status\\` always starts in \\`draft\\`.\n - Negative BDD attack and rejection scenarios tagged with \\`@security @mitigation\\`.\n - Assignment of Zero Trust enclaves \\`SEC-ENC-*\\`.\n\n### 3. \\`agent-system-architect\\` (System Architect)\n- **Mission**: Translate the approved product definition into a modular technical architecture based on arc42 enriched with NAF v4.\n- **Output**: Architecture components (\\`CMP-*\\`), Mermaid diagrams, and immutable \\`ADR-*\\` records compliant with \\`schemas/architecture/\\`.\n- **Guardrails**:\n - Every \\`CMP-*\\` must declare \\`satisfies-requirements\\` linking \\`FR-*\\`, \\`QR-*\\`, and \\`SEC-REQ-*\\`.\n - Emit a return handoff to \\`agent-threat-modeler\\` in the technical security feedback loop when infrastructure or persistence decisions introduce new attack vectors.\n\n### 4. \\`agent-qa-engineer\\` (QA Engineer and SDET)\n- **Mission**: Translate approved requirements (\\`FR-*\\`, \\`SEC-REQ-*\\`, \\`QR-*\\`) into comprehensive FAILING (red) BDD/Gherkin test suites, before \\`agent-developer\\` writes production code.\n- **Input**: Approved requirements from the \\`handoff.yaml\\` sidecar (\\`HOF-*\\`).\n- **Output**: Failing Gherkin scenarios covering: nominal case, boundary cases, out-of-range cases, and conditional categories (security, performance, idempotency, postconditions, interface contract).\n- **Guardrails**:\n - FORBIDDEN to include production code or anticipate implementations.\n - Every \\`FR-*\\` must have at least nominal + boundary + out-of-range scenarios; missing these blocks handoff to \\`agent-developer\\`.\n - Mandatory tags: \\`@<FR-ID> @automated @regression\\`.\n - Run \\`pnpm run verify:testing\\` before emitting handoff.\n\n### 5. \\`agent-developer\\` (Software Developer)\n- **Mission**: Implement atomic tasks from SDD specifications (\\`tasks.md\\`) with clean, strictly typed code and thorough tests.\n- **Directives**:\n - Respect the autonomy mode assigned in \\`tasks.md\\` (\\`AUTONOMOUS\\`, \\`HUMAN_REVIEW_PLAN\\`, \\`AMBIGUOUS\\`, \\`HIGH_RISK_MANUAL\\`).\n - Make tests delivered by \\`agent-qa-engineer\\` pass green without altering them to accommodate code.\n - Respect \\`quality-policy.yaml\\` thresholds: CC $\\\\le 10$, Cognitive $\\\\le 15$, MI $\\\\ge 50$, LOC $\\\\le 40$.\n - Run pre-flight with auto-fix: \\`pnpm run check:fix\\` and full verification: \\`pnpm run verify:all\\`.\n - Upon completing green implementation, suggest handoff to \\`agent-expert-user\\` for post-development functional validation prior to security audit.\n\n### 6. \\`agent-security-auditor\\` (Adversarial Code Auditor)\n- **Mission**: Rigorously examine Pull Requests for business logic vulnerabilities, injection vectors, secret leaks, and authorization flaws as part of the Pre-Merge Audit Triad.\n- **Directives**:\n - Analyze code diffs with an attacker mindset and run \\`pnpm run verify:security\\`.\n - Issue findings with CVSS v3.1 severity scoring and block any PR introducing CRITICAL or HIGH security risks.\n\n### 7. \\`agent-compliance-checker\\` (Open Source License Compliance Auditor)\n- **Mission**: Audit dependency manifests and ensure every direct and transitive third-party package complies with \\`license-policy.yaml\\` as part of the Pre-Merge Audit Triad.\n- **Directives**:\n - Verify SPDX identifiers via \\`pnpm run verify:licenses\\`, immediately blocking viral (\\`GPL\\`, \\`AGPL\\`) or unapproved commercial (\\`BSL\\`, \\`SSPL\\`) licenses.\n\n### 8. \\`agent-expert-user\\` (Expert User and Domain Evaluator)\n- **Mission**: Contrast design and specifications (design phase) and functionally validate finished software against \\`UC-*\\` and \\`FR-*\\` (post-development phase).\n- **Directives**:\n - Design mode (upstream): Adopt the primary actor's profile under stressful field conditions, applying bimodal discrimination (strict MVP core vs. roadmap suggestion backlog in \\`templates/product/user-design-feedback.template.md\\`).\n - Functional validation mode (downstream / pre-PR / post-development functional validation): Thoroughly contrast interface and actual CLI execution against \\`UC-*\\` and \\`FR-*\\` acceptance criteria before pre-merge security audit.\n - Emit handoff block suggesting \\`agent-code-reviewer\\` / \\`agent-security-auditor\\` if compliant, or return to \\`agent-developer\\` on functional drift.\n\n### 9. \\`agent-code-reviewer\\` (Technical and Architectural Code Reviewer)\n- **Mission**: Audit Pull Requests evaluating code cleanliness, adherence to SOLID, DRY, YAGNI principles, design patterns, and respect for complexity and maintainability thresholds (\\`quality-policy.yaml\\`), forming part of the Pre-Merge Audit Triad.\n- **Directives**:\n - Respect \\`quality-policy.yaml\\` thresholds: CC $\\\\le 10$, Cognitive $\\\\le 15$, MI $\\\\ge 50$, LOC $\\\\le 40$.\n - Detect improper coupling, code smells, magic numbers, ambiguous names, and encapsulation violations.\n - Flag premature abstractions and speculative code violating YAGNI.\n - Coordinate Pre-Merge Audit Triad with \\`agent-security-auditor\\` and \\`agent-compliance-checker\\`.\n - Classify findings into: \\`[BLOCKING]\\` (quality violation or broken pattern), \\`[CLEAN_CODE_SUGGESTION]\\` (non-blocking improvement), and \\`[COMPLIANT]\\`.\n\n### 10. \\`agent-devops\\` (Automation and Infrastructure Engineer)\n- **Mission**: Maintain, evolve, and audit automated project infrastructure: CI/CD workflows, Docker containers, IaC manifests, and support scripts.\n- **Directives**:\n - Strict infrastructure domain: Operates exclusively in \\`.github/workflows/\\`, \\`Dockerfile*\\`, \\`docker-compose*.yml\\`, IaC manifests, and \\`scripts/\\`.\n - **NON-INVASION GUARDRAIL**: STRICTLY FORBIDDEN from modifying or refactoring application source code files (\\`src/\\`, \\`packages/*/src/\\`). Your responsibility is the pipeline and scaffolding, never application business logic.\n - Infrastructure dependency policy: Verify licenses of dependencies, base images, and third-party actions according to \\`license-policy.yaml\\`.\n - Gate preservation: Ensure pipeline optimizations preserve all existing deterministic Quality Gates intact.\n\n---\n\n## 3. Git 4-Tier Hierarchy and Commit Conventions\n- \\`task/<PARENT-ID>/<TSK-ID>-<slug>\\` $\\\\rightarrow$ \\`feat/<FEAT-ID>-<slug>\\` $\\\\rightarrow$ \\`release/vX.Y.Z\\` $\\\\rightarrow$ \\`main\\`.\n- Mandatory commit trailers injection:\n \\`\\`\\`text\n Author-Type: agent\n AI-Model: gemini-1.5-pro / gemini-2.0-flash\n Task-ID: TSK-XXX\n Change-ID: CHG-XXX\n \\`\\`\\`\n\n---\n\n## 4. Workflow Handoff Protocol and Human Action Window | Ventana de Acción Humana\n- **Conditional Activation Rule by Autonomy**:\n - 🟢 **\\`AUTONOMOUS\\`** (or exclusive final supervision in PR/CI): **OMITTED**. Do not request or emit interactive handoff to avoid interrupting unattended execution.\n - 🟡 **Autonomy $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`** (\\`HUMAN_REVIEW_PLAN\\`, \\`AMBIGUOUS\\`, \\`HIGH_RISK_MANUAL\\`): **MANDATORY**. Emit the Workflow Handoff block compliant with [\\`templates/workflow/agent-handoff.template.md\\`](../../templates/workflow/agent-handoff.template.md) and **STOP**.\n- **Block Contents**: Declare produced deliverables, recommend the next role in workflow (\\`agent-threat-modeler\\`, \\`agent-system-architect\\`, \\`agent-qa-engineer\\`, \\`agent-developer\\`, \\`agent-expert-user\\`, \\`agent-code-reviewer\\`, \\`agent-security-auditor\\`, \\`agent-compliance-checker\\`, \\`agent-devops\\`, etc.), provide suggested invocation prompt, and keep **the Human Action Window open at all times for the human user to take action** (review, edit by hand, pause/reroute, or delegate).\n`;\n\nexport const STARTER_CURSOR_CORE_RULES = `---\ndescription: Global canonical directives, 5 unbreakable commandments, and AI-SDLC pre-flight\nglobs: *\nalwaysApply: true\n---\n\n# Global AI-SDLC Rules (Core)\n\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](process/09_agent_protocols.md) and [\\`process/01_governance_and_roles.md\\`](process/01_governance_and_roles.md).\n\n## 1. The 5 Unbreakable Commandments of Agents | Los 5 Mandamientos Inquebrantables de los Agentes\nEvery agent operating in this repository must strictly observe the following guardrails:\n1. **FORBIDDEN TO AUTO-APPROVE OR AUTO-MERGE | PROHIBIDO AUTO-APROBAR O AUTO-FUSIONAR**: Do not approve PRs or execute direct merges to protected branches (\\`main\\`, \\`release/*\\`). Approval is exclusively reserved for human reviewers.\n2. **FORBIDDEN TO INVENT PRODUCT OR ARCHITECTURE DECISIONS**: When facing ambiguity, formulate open questions (\\`open-questions\\`). Never assume undocumented requirements.\n3. **FORBIDDEN TO INTRODUCE DEPENDENCIES WITHOUT LICENSE INSPECTION**: Always verify \\`license-policy.yaml\\`. Viral dependencies (GPL/AGPL) or commercial paid dependencies (BSL/SSPL) are strictly forbidden without explicit human approval.\n4. **FORBIDDEN TO IGNORE CYBERSECURITY (SECURITY-BY-DEFAULT)**: Validate inputs, apply least privilege, and accompany every change with security tests (\\`SEC-TEST-*\\`). Suppressing linters or tests to force a green pipeline is prohibited.\n5. **MANDATORY CRYPTOGRAPHIC CITATION**: Link specifications using immutable identifiers and Unix LF-normalized SHA-256 hashes.\n\n## 2. Pre-Flight Verification Commands\nBefore finalizing changes or proposing commits:\n- Pre-flight with auto-fix: \\`pnpm run check:fix\\` (or \\`npx aisdlc check --fix\\`)\n- Full verification: \\`pnpm run verify:all\\` (or \\`npx aisdlc verify all\\`)\n- Unit tests: \\`pnpm test\\`\n- Strict typing: \\`pnpm run typecheck\\`\n\n## 3. Git 4-Tier Hierarchy\n- Tier 1: \\`main\\` (Production)\n- Tier 2: \\`release/vX.Y.Z\\` (Frozen release)\n- Tier 3: \\`feat/<FEAT-ID>-<slug>\\` / \\`bug/<BUG-ID>-<slug>\\` (Feature)\n- Tier 4: \\`task/<PARENT-ID>/<TSK-ID>-<slug>\\` (Atomic task)\n\n## 4. Specialized Roles Mapping\n| Role | Mission (summary) |\n| :--- | :--- |\n| \\`agent-product-analyst\\` | ProductShape artifacts (\\`ACT-*\\`, \\`UC-*\\`, \\`FR-*\\`, \\`QR-*\\`, \\`BR-*\\`); status starts \\`draft\\`. |\n| \\`agent-threat-modeler\\` | STRIDE/OWASP threat triad (\\`ACT-THREAT-*\\`, \\`ABUSE-*\\`, \\`SEC-REQ-*\\`). |\n| \\`agent-system-architect\\` | Modular arc42 + NAF v4 architecture (\\`CMP-*\\`, Mermaid diagrams, \\`ADR-*\\`). |\n| \\`agent-qa-engineer\\` | FAILING BDD/Gherkin suites before \\`agent-developer\\` writes code. |\n| \\`agent-developer\\` | Atomic tasks from \\`tasks.md\\`; respects autonomy mode; runs \\`pnpm run check:fix\\` + \\`pnpm run verify:all\\`. |\n| \\`agent-security-auditor\\` | Adversarial PR security audit, SAST, secrets, and CVSS v3.1 evaluation. |\n| \\`agent-compliance-checker\\` | SPDX license compliance audit against \\`license-policy.yaml\\`. |\n| \\`agent-expert-user\\` | Bimodal MVP evaluation (design) and functional validation against \\`UC-*\\` and \\`FR-*\\` (pre-PR). |\n| \\`agent-code-reviewer\\` | PR audit (SOLID, DRY, YAGNI): \\`[BLOCKING]\\` / \\`[CLEAN_CODE_SUGGESTION]\\` / \\`[COMPLIANT]\\`. |\n| \\`agent-devops\\` | CI/CD, Docker, IaC only — **FORBIDDEN** to touch \\`src/\\` or \\`packages/*/src/\\`. |\n\n## 5. Task Autonomy Modes (\\`tasks.md\\`)\n- 🟢 **\\`AUTONOMOUS\\`**: Low risk. Implement directly, omit handoff block.\n- 🟡 **\\`HUMAN_REVIEW_PLAN\\`**: Medium risk. Emit Workflow Handoff block, wait for approval.\n- 🟠 **\\`AMBIGUOUS\\`**: Blocked. Request human clarification.\n- 🔴 **\\`HIGH_RISK_MANUAL\\`**: Critical risk. Human-only execution.\n\n## 6. Workflow Handoff Protocol and Human Action Window | Ventana de Acción Humana\n- **Conditional Activation**:\n * 🟢 **\\`AUTONOMOUS\\`** (or PR/CI supervision): **OMITTED**. Do not request or emit interactive handoff.\n * 🟡 **Autonomy $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`** (\\`HUMAN_REVIEW_PLAN\\`, \\`AMBIGUOUS\\`, \\`HIGH_RISK_MANUAL\\`): **MANDATORY**. Emit Workflow Handoff block compliant with [\\`templates/workflow/agent-handoff.template.md\\`](templates/workflow/agent-handoff.template.md) and **STOP**.\n- **Content**: Declare completed deliverables, recommend next role(s), provide suggested invocation prompt, and **keep the Human Action Window open for the human user to take action** (review, edit by hand, pause/reroute, or delegate).\n`;\n\nexport const STARTER_CURSOR_PRODUCT_RULES = `---\ndescription: Directives for SDD specifications editing, ProductShape artifacts, and Cybersecurity\nglobs: specs/**, templates/**, product/**, security/**\nalwaysApply: false\n---\n\n# Product and SDD Specification Directives\n\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](process/09_agent_protocols.md) and [\\`process/02_product_definition.md\\`](process/02_product_definition.md).\n\n## 1. Identifier Taxonomy and JSON Schemas\nEvery generated or modified artifact must follow canonical naming and satisfy its schema in \\`schemas/\\`:\n- Product Actors: \\`ACT-[SUFFIX]\\` (\\`schemas/product/actor.schema.json\\`)\n- Use Cases: \\`UC-[SUFFIX]\\` (\\`schemas/product/use-case.schema.json\\`)\n- Functional Requirements: \\`FR-[SUFFIX]-[NUM3]\\` (\\`schemas/product/requirement.schema.json\\`)\n- Quality Requirements: \\`QR-[SUFFIX]\\` (\\`schemas/product/requirement.schema.json\\`)\n- Business Rules: \\`BR-[SUFFIX]\\` (\\`schemas/product/business-rule.schema.json\\`)\n- Threat Actors: \\`ACT-THREAT-[SUFFIX]\\` (\\`schemas/security/threat-actor.schema.json\\`)\n- Abuse Cases: \\`ABUSE-[SUFFIX]\\` (\\`schemas/security/abuse-case.schema.json\\`)\n- Security Requirements: \\`SEC-REQ-[SUFFIX]\\` (\\`schemas/security/security-req.schema.json\\`)\n\n## 2. \"AI as Scribe\" Protocol Rules\n- **Initial Status**: Every new artifact strictly starts with \\`status: draft\\`. Creating artifacts directly as \\`active\\` or \\`approved\\` is forbidden.\n- **Gherkin Acceptance Criteria**: In every \\`FR-*\\` requirement, include a \\`\\`\\`gherkin block with tags \\`@<ID> @automated @regression\\` and at least one \\`Scenario Outline\\` with an \\`Examples\\` data table.\n- **Security Mitigations**: Every \\`SEC-REQ-*\\` must include negative Gherkin tests (\\`@security @mitigation\\`).\n- **Use Cases (User Story Structure)**: In every \\`UC-*\\`, the \\`1. Intent and Outcome\\` section must be written using the standard English structure: \\`As a <ACT-ID>... I want <action>... To <outcome>...\\`.\n- **Deterministic Validation**: Run \\`pnpm run verify:schemas\\` and \\`pnpm run verify:duplicates\\` before presenting the draft to the human reviewer.\n`;\n\nexport const STARTER_CURSOR_QUALITY_RULES = `---\ndescription: Directives for code quality, architecture, TDD, and complexity limits\nglobs: packages/**, src/**, scripts/**, tests/**\nalwaysApply: false\n---\n\n# Code Quality and Architecture Directives\n\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](process/09_agent_protocols.md) and [\\`process/10_quality_management_and_release_gates.md\\`](process/10_quality_management_and_release_gates.md).\n\n## 1. Non-Negotiable Quality Thresholds (\\`quality-policy.yaml\\`)\n- **Cyclomatic Complexity (CC)**: $\\\\le 10$ per function (warning alert if $> 7$).\n- **Cognitive Complexity**: $\\\\le 15$ per function (warning if $> 10$).\n- **Maintainability Index (MI)**: $\\\\ge 50$ (target minimum $\\\\ge 65$).\n- **Function Length**: $\\\\le 40$ lines (warning if $> 30$).\n- If a function exceeds these limits, decompose logic into cohesive helper functions before completing the task.\n\n## 2. TDD Methodology and Unit Testing\n- Apply Test-Driven Development: generate unit tests before or alongside component logic.\n- Tag tests linked to requirements with header comments citing the ID (\\`FR-*\\` or \\`SEC-REQ-*\\`) to enable reverse traceability.\n- Suppressing types (\\`any\\`), linter rules (\\`eslint-disable\\`), or unit tests to force pipeline passage is prohibited.\n\n## 3. Open Source License Policy (\\`license-policy.yaml\\`)\n- Before adding any dependency to \\`package.json\\`, verify its SPDX identifier.\n- Only permissive dependencies are allowed (\\`MIT\\`, \\`Apache-2.0\\`, \\`BSD-2/3-Clause\\`, \\`ISC\\`).\n- Viral licenses (\\`GPL\\`, \\`AGPL\\`) or commercial licenses without approval (\\`BSL\\`, \\`SSPL\\`) are prohibited.\n\n## 4. Structured Output \\`--json\\`\n- Any extension to CLI commands must preserve compatibility with the \\`--json\\` flag and suppress ANSI escape codes when this flag is present.\n`;\n\nexport const STARTER_CLAUDE_RULES = `# Claude Code Instructions - AI-SDLC Monorepo\n\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](process/09_agent_protocols.md) and [\\`process/01_governance_and_roles.md\\`](process/01_governance_and_roles.md).\n\nThis repository implements the **AI-SDLC** framework (Spec-Driven Development, deterministic quality governance, and OSS license compliance for human-agent collaboration).\n\n---\n\n## 1. The 5 Unbreakable Commandments of Agents | Los 5 Mandamientos Inquebrantables de los Agentes\n\n1. **FORBIDDEN TO AUTO-APPROVE OR AUTO-MERGE | PROHIBIDO AUTO-APROBAR O AUTO-FUSIONAR**: Never approve PRs or merge directly to \\`main\\` or protected branches. Approval is exclusively a human prerogative.\n2. **FORBIDDEN TO INVENT PRODUCT OR ARCHITECTURE DECISIONS**: When facing ambiguous requirements, formulate open questions (\\`open-questions\\`). Never assume undocumented behaviors.\n3. **FORBIDDEN TO INTRODUCE DEPENDENCIES WITHOUT LICENSE INSPECTION**: Always validate the SPDX identifier against \\`license-policy.yaml\\`. Viral libraries (\\`GPL\\`/\\`AGPL\\`) or paid commercial libraries (\\`BSL\\`/\\`SSPL\\`) are strictly forbidden without formal human approval.\n4. **FORBIDDEN TO IGNORE CYBERSECURITY (SECURITY-BY-DEFAULT)**: Validate inputs, sanitize data, and include mitigation tests (\\`SEC-TEST-*\\`). Disabling linters or suppressing typing errors (\\`any\\`, \\`@ts-ignore\\`) is prohibited.\n5. **MANDATORY CRYPTOGRAPHIC CITATION**: Every spec or sidecar must cite immutable identifiers and Unix LF-normalized SHA-256 digests.\n\n---\n\n## 2. Essential Execution and Pre-Flight Commands\n\n\\`\\`\\`bash\n# 1. Pre-flight with deterministic auto-fix (Gherkin & SHA-256 digests)\npnpm run check:fix\n\n# 2. Complete verification across all Quality Gates (Quality, RTM, Governance, Testing, Licenses, PDaC, Schemas, Duplicates, Security)\npnpm run verify:all\n\n# 3. Complete automated test suite (Vitest)\npnpm test\n\n# 4. Strict TypeScript typechecking\npnpm run typecheck\n\n# 5. Scaffolding for a new SDD change\npnpm run change:new <name> --id <chg-id>\n\n# 6. Canonical integration of a completed SDD change\nnpx tsx packages/cli/src/index.ts sdd integrate --change <chg-id>\n\\`\\`\\`\n\n---\n\n## 3. Specialized Roles Mapping\n\n### 1. \\`agent-product-analyst\\` (Product Analyst / Scribe)\n- **Mission**: Assist in defining and refining the product model using ProductShape.\n- **Input**: Business intent or natural language specification.\n- **Output**: Markdown artifacts with YAML frontmatter compliant with \\`schemas/product/\\` (\\`ACT-*\\`, \\`UC-*\\`, \\`FR-*\\`, \\`QR-*\\`, \\`BR-*\\`).\n- **Guardrails**: \\`status\\` always starts in \\`draft\\`. Mandatory Gherkin criteria with \\`@<ID> @automated @regression\\`.\n\n### 2. \\`agent-threat-modeler\\` (Threat Modeler and Security Specialist)\n- **Mission**: Analyze use cases and proactively model adversaries, STRIDE attack vectors, and OWASP ASVS mitigations, both at product level and in the technical security feedback loop over architecture.\n- **Output**: Cybersecurity triad (\\`ACT-THREAT-*\\`, \\`ABUSE-*\\`, \\`SEC-REQ-*\\`) compliant with \\`schemas/security/\\`.\n\n### 3. \\`agent-system-architect\\` (System Architect)\n- **Mission**: Translate the approved product definition into a modular technical architecture based on arc42 enriched with NAF v4 (\\`CMP-*\\`, Mermaid diagrams, \\`ADR-*\\`).\n- **Guardrails**: Declare \\`satisfies-requirements\\` on every \\`CMP-*\\` and trigger the technical security feedback loop toward \\`agent-threat-modeler\\` when infrastructure decisions introduce new attack vectors.\n\n### 4. \\`agent-qa-engineer\\` (QA Engineer and SDET)\n- **Mission**: Translate approved requirements (\\`FR-*\\`, \\`SEC-REQ-*\\`, \\`QR-*\\`) into comprehensive FAILING (red) BDD/Gherkin test suites, before \\`agent-developer\\` writes production code.\n- **Guardrails**: FORBIDDEN to include production code. Mandatory tags: \\`@<FR-ID> @automated @regression\\`.\n\n### 5. \\`agent-developer\\` (Software Developer)\n- **Mission**: Implement atomic tasks from SDD specifications (\\`tasks.md\\`) with clean, strictly typed code and thorough tests.\n- **Directives**: Respect the autonomy mode. Make tests delivered by \\`agent-qa-engineer\\` pass green. Run \\`pnpm run check:fix\\` and \\`pnpm run verify:all\\`.\n\n### 6. \\`agent-security-auditor\\` (Adversarial Code Auditor)\n- **Mission**: Examine Pull Requests for business logic vulnerabilities, injection vectors, secret leaks, and authorization flaws as part of the Pre-Merge Audit Triad.\n- **Directives**: Run \\`pnpm run verify:security\\`, evaluate CVSS v3.1 severity, and block CRITICAL/HIGH risks.\n\n### 7. \\`agent-compliance-checker\\` (Open Source License Compliance Auditor)\n- **Mission**: Audit dependency manifests against \\`license-policy.yaml\\` as part of the Pre-Merge Audit Triad.\n- **Directives**: Run \\`pnpm run verify:licenses\\`, blocking viral (\\`GPL\\`, \\`AGPL\\`) or unapproved commercial (\\`BSL\\`, \\`SSPL\\`) packages.\n\n### 8. \\`agent-expert-user\\` (Expert User and Domain Evaluator)\n- **Mission**: Contrast design and specifications (design phase) and functionally validate finished software against \\`UC-*\\` and \\`FR-*\\` (post-development functional validation phase).\n\n### 9. \\`agent-code-reviewer\\` (Technical and Architectural Code Reviewer)\n- **Mission**: Audit Pull Requests evaluating code cleanliness, adherence to SOLID, DRY, YAGNI principles, and respect for \\`quality-policy.yaml\\` thresholds, forming part of the Pre-Merge Audit Triad.\n- **Findings classification**: \\`[BLOCKING]\\`, \\`[CLEAN_CODE_SUGGESTION]\\`, \\`[COMPLIANT]\\`.\n\n### 10. \\`agent-devops\\` (Automation and Infrastructure Engineer)\n- **Mission**: Maintain, evolve, and audit automated project infrastructure: CI/CD workflows, Docker containers, IaC manifests, and support scripts.\n- **NON-INVASION GUARDRAIL**: STRICTLY FORBIDDEN from modifying application source code (\\`src/\\`, \\`packages/*/src/\\`).\n\n---\n\n## 4. Task Autonomy Modes (\\`tasks.md\\`)\n\n- 🟢 **\\`AUTONOMOUS\\`**: Low risk, isolated task. Implement code and tests directly. Omit interactive handoff block.\n- 🟡 **\\`HUMAN_REVIEW_PLAN\\`**: Medium risk. Design detailed plan, emit Workflow Handoff block, and wait for human confirmation before coding.\n- 🟠 **\\`AMBIGUOUS\\`**: Incomplete requirements. Blocked: request human clarification.\n- 🔴 **\\`HIGH_RISK_MANUAL\\`**: Critical risk (migrations, cryptography). Direct manual execution by humans only.\n\n---\n\n## 5. Git Workflow and Commit Rules with Trailers\n\n### 4-Tier Hierarchy\n1. **Tier 1 (\\`main\\`)**: Absolute stability and production readiness.\n2. **Tier 2 (\\`release/vX.Y.Z\\`)**: Release stabilization.\n3. **Tier 3 (\\`feat/<FEAT-ID>-<slug>\\` or \\`bug/<BUG-ID>-<slug>\\`)**: SDD delivery increment.\n4. **Tier 4 (\\`task/<PARENT-ID>/<TSK-ID>-<slug>\\`)**: Atomic implementation task.\n\n### Commit Format (Conventional Commits + Git Trailers)\n\\`\\`\\`text\nfeat(scope): concise imperative description (#issue)\n\nBody explaining the motivation and technical justification of the change.\n\nAuthor-Type: agent\nAI-Model: claude-3-7-sonnet\nTask-ID: TSK-001\nChange-ID: CHG-026-AGENT-NATIVE-CONFIGS\n\\`\\`\\`\n\n---\n\n## 6. Non-Negotiable Quality Thresholds (\\`quality-policy.yaml\\`)\n- **Cyclomatic Complexity (CC)**: $\\\\le 10$\n- **Cognitive Complexity**: $\\\\le 15$\n- **Maintainability Index (MI)**: $\\\\ge 50$\n- **Lines per Function**: $\\\\le 40$\n- Deterministic CLI output: every \\`verify\\` command supports \\`--json\\` without ANSI escape codes.\n\n---\n\n## 7. Workflow Handoff Protocol and Human Action Window | Ventana de Acción Humana\n- **Conditional Activation**:\n - 🟢 **\\`AUTONOMOUS\\`** (or PR/CI final supervision): **OMITTED**. Uninterrupted continuous execution.\n - 🟡 **Autonomy $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`** (\\`HUMAN_REVIEW_PLAN\\`, \\`AMBIGUOUS\\`, \\`HIGH_RISK_MANUAL\\`): **MANDATORY**. Emit Workflow Handoff block ([\\`templates/workflow/agent-handoff.template.md\\`](templates/workflow/agent-handoff.template.md)) and **STOP**.\n- **Content**: Completed deliverables, suggested next role(s), copy-paste ready invocation prompt, and **an open Human Action Window for the user to take action** (review, edit by hand, pause/reroute, or delegate).\n`;\n\nexport const STARTER_COPILOT_RULES = `<!--\n AI-SDLC: Canonical Instructions for GitHub Copilot (Chat & Workspace)\n Canonical Reference: process/09_agent_protocols.md and process/01_governance_and_roles.md\n-->\n\n# GitHub Copilot Instructions - AI-SDLC Framework\n\nYou operate as an assistant agent in the **AI-SDLC** repository. You are not a simple text auto-completer: you are a specialized technical worker subject to normative directives, deterministic autonomy boundaries, and strict traceability.\n\n---\n\n## 1. The 5 Unbreakable Commandments of Agents | Los 5 Mandamientos Inquebrantables de los Agentes\n\n1. **FORBIDDEN TO AUTO-APPROVE OR AUTO-MERGE | PROHIBIDO AUTO-APROBAR O AUTO-FUSIONAR**:\n - Never execute PR approvals or direct merges to stable branches (\\`main\\`, \\`release/*\\`). Approval is an exclusive human prerogative.\n2. **FORBIDDEN TO INVENT PRODUCT OR ARCHITECTURE DECISIONS**:\n - If a requirement is ambiguous or incomplete, formulate open questions (\\`open-questions\\`) to the human user. Guessing undocumented intentions is forbidden.\n3. **FORBIDDEN TO INTRODUCE DEPENDENCIES WITHOUT LICENSE INSPECTION**:\n - Before suggesting or adding dependencies to manifests (\\`package.json\\`, etc.), validate their SPDX identifier against \\`license-policy.yaml\\`. Adding viral (\\`GPL\\`, \\`AGPL\\`) or commercial paid (\\`BSL\\`, \\`SSPL\\`) licenses without human authorization is prohibited.\n4. **FORBIDDEN TO IGNORE CYBERSECURITY (SECURITY-BY-DEFAULT)**:\n - All code must enforce least privilege, sanitize external inputs, and include mitigation tests (\\`SEC-TEST-*\\`). Suppressing types (\\`any\\`), linters, or tests to force a green pipeline is prohibited.\n5. **MANDATORY CRYPTOGRAPHIC CITATION**:\n - Every specification, design, or sidecar must reference canonical identifiers and their Unix LF-normalized SHA-256 digests.\n\n---\n\n## 2. Git 4-Tier Branch Hierarchy\n\nWhen proposing or creating branches, respect the strict hierarchical structure:\n- **Tier 1**: \\`main\\` (Protected production branch with maximum stability).\n- **Tier 2**: \\`release/vX.Y.Z\\` (Release consolidation and scope freeze branch).\n- **Tier 3**: \\`feat/<FEAT-ID>-<slug>\\` or \\`bug/<BUG-ID>-<slug>\\` (SDD increment or feature branch).\n- **Tier 4**: \\`task/<PARENT-ID>/<TSK-ID>-<slug>\\` (Atomic development task branch).\n\n---\n\n## 3. Pre-Flight Commands and Quality Gates\n\nBefore concluding any intervention or suggesting a commit:\n- **Unified pre-flight with auto-fix**: \\`pnpm run check:fix\\` (or \\`npx aisdlc check --fix\\`).\n- **Complete Quality Gates verification**: \\`pnpm run verify:all\\` (or \\`npx aisdlc verify all\\`).\n- **Unit test suite**: \\`pnpm test\\`.\n- **Strict typing**: \\`pnpm run typecheck\\`.\n\nNon-Negotiable Quality Thresholds (\\`quality-policy.yaml\\`):\n- Cyclomatic Complexity (CC) $\\\\le 10$.\n- Cognitive Complexity $\\\\le 15$.\n- Maintainability Index (MI) $\\\\ge 50$.\n- Maximum lines per function $\\\\le 40$.\n\n---\n\n## 4. Task Autonomy Modes (\\`tasks.md\\`)\n\n- 🟢 **\\`AUTONOMOUS\\`**: Low risk, isolated task. Implement code and tests directly. Omit interactive handoff block.\n- 🟡 **\\`HUMAN_REVIEW_PLAN\\`**: Medium risk. Design detailed plan, emit Workflow Handoff block, and wait for human confirmation before coding.\n- 🟠 **\\`AMBIGUOUS\\`**: Incomplete requirements. Blocked: request human clarification.\n- 🔴 **\\`HIGH_RISK_MANUAL\\`**: Critical risk (migrations, cryptography). Direct manual execution by humans only.\n\n---\n\n## 5. Workflow Handoff Protocol and Human Action Window | Ventana de Acción Humana\n- **Conditional Activation**:\n * 🟢 **\\`AUTONOMOUS\\` Mode** (or PR/CI final supervision): **OMITTED**. Do not interrupt unattended execution.\n * 🟡 **Autonomy $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`** (\\`HUMAN_REVIEW_PLAN\\`, \\`AMBIGUOUS\\`, \\`HIGH_RISK_MANUAL\\`): **MANDATORY**. Emit Workflow Handoff block compliant with [\\`templates/workflow/agent-handoff.template.md\\`](../templates/workflow/agent-handoff.template.md) and **STOP**.\n- **Components**: Declare completed deliverables, recommend next roles (\\`agent-threat-modeler\\`, \\`agent-system-architect\\`, \\`agent-developer\\`, \\`agent-security-auditor\\`), provide suggested invocation prompt, and **keep the Human Action Window open at all times for the user to take action** (review, edit by hand, pause/reroute, or delegate).\n\n---\n\n## 6. Specialized Roles Mapping\n\n| Role | Mission (summary) |\n| :--- | :--- |\n| \\`agent-product-analyst\\` | ProductShape artifacts (\\`ACT-*\\`, \\`UC-*\\`, \\`FR-*\\`, \\`QR-*\\`, \\`BR-*\\`); \\`status\\` starts \\`draft\\`. |\n| \\`agent-threat-modeler\\` | STRIDE/OWASP threat triad (\\`ACT-THREAT-*\\`, \\`ABUSE-*\\`, \\`SEC-REQ-*\\`). |\n| \\`agent-system-architect\\` | Modular arc42 + NAF v4 architecture (\\`CMP-*\\`, Mermaid diagrams, \\`ADR-*\\`). |\n| \\`agent-qa-engineer\\` | FAILING BDD/Gherkin suites before \\`agent-developer\\` writes production code. |\n| \\`agent-developer\\` | Atomic tasks from \\`tasks.md\\`; autonomy mode must be respected; runs \\`pnpm run check:fix\\` + \\`pnpm run verify:all\\`. |\n| \\`agent-security-auditor\\` | Adversarial PR security audit, SAST, secrets, and CVSS v3.1 evaluation. |\n| \\`agent-compliance-checker\\` | SPDX license compliance audit against \\`license-policy.yaml\\`. |\n| \\`agent-expert-user\\` | Bimodal MVP evaluation (design) and functional validation against \\`UC-*\\` and \\`FR-*\\` (pre-PR). |\n| \\`agent-code-reviewer\\` | PR audit (SOLID, DRY, YAGNI): \\`[BLOCKING]\\` / \\`[CLEAN_CODE_SUGGESTION]\\` / \\`[COMPLIANT]\\`. |\n| \\`agent-devops\\` | CI/CD, Docker, IaC only — **FORBIDDEN** to touch \\`src/\\` or \\`packages/*/src/\\`. |\n\n---\n\n## 7. Canonical Reference\nTo consult full protocols, specialized prompts, and interface contracts:\n- [\\`process/09_agent_protocols.md\\`](../process/09_agent_protocols.md)\n- [\\`process/01_governance_and_roles.md\\`](../process/01_governance_and_roles.md)\n`;\n\nexport const STARTER_CURSOR_MCP = `{\\n \"mcpServers\": {\\n \"ai-sdlc\": {\\n \"command\": \"npx\",\\n \"args\": [\\n \"@aisdlc/mcp\"\\n ]\\n }\\n }\\n}\\n`;\n\nexport const STARTER_ANTIGRAVITY_MCP = `{\\n \"mcpServers\": {\\n \"ai-sdlc\": {\\n \"command\": \"npx\",\\n \"args\": [\\n \"@aisdlc/mcp\"\\n ]\\n }\\n }\\n}\\n`;\n\nexport const STARTER_VSCODE_MCP = `{\\n \"servers\": {\\n \"ai-sdlc\": {\\n \"command\": \"npx\",\\n \"args\": [\\n \"@aisdlc/mcp\"\\n ]\\n }\\n }\\n}\\n`;\n","/**\n * AI-SDLC: Starter templates for System Architecture (arc42 + NAF v4)\n */\n\nexport const STARTER_ARCH_ADR = `---\nid: ADR-001-DECISION-NAME\ntype: architecture-decision-record\ntitle: Clear Title of Technical Decision\nstatus: proposed # proposed, accepted, rejected, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\ndeciders:\n - \"Lead Architect Name\"\n - \"Tech Lead Name\"\ndecision-date: \"2026-09-03\"\naffects-components:\n - CMP-NAME-001\nsupersedes: null\nsuperseded-by: null\n---\n\n# ADR-001: Clear Title of Technical Decision\n\n## 1. Context and Problem Statement\nDescribe the technological context, requirements (\\`FR-*\\`, \\`QR-*\\`, \\`SEC-REQ-*\\`) driving the decision, and forces in tension (performance, cost, complexity, license compliance).\n\n## 2. Considered Technology Options\n1. **Option A**: [Pros and cons, OSS license regime].\n2. **Option B**: [Pros and cons, OSS license regime].\n\n## 3. Decision Outcome\nChosen **Option [A/B]** because [solid technical and business justification].\n\n## 4. Consequences\n- **Positive**: Latency reduction, compliance with \\`license-policy.yaml\\`.\n- **Negative / Trade-offs**: Higher initial memory footprint or additional instrumentation needed.\n\n---\n\n## 5. Revision History and Version Control\n\n| Version | Date | Deciders | Decision Status | Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-03 | Lead Architect & Tech Lead | Formal decision proposal | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_ARCHITECTURE_CONSTRAINTS = `---\nid: ARCH-CONSTR-001\ntype: architecture-constraints\ntitle: \"02. Architecture Constraints\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 2\nnaf-perspective: \"Architecture Constraints\"\nconstraints:\n - CON-TECH-001\n - ACON-ORG-001\nlicense-policy: \"license-policy.yaml\"\nsupersedes: null\nsuperseded-by: null\n---\n\n# 02. Architecture Constraints (arc42 Sec. 2 / NAF Constraints)\n\n## 1. Non-Negotiable Technical Constraints (\\`CON-*\\`)\nLimitations imposed by hardware, underlying platform, operating systems, network protocols, or binary compatibility:\n\n| Constraint ID | Constraint Name | Description and Technical Rationale |\n| :--- | :--- | :--- |\n| \\`CON-TECH-001\\` | Cross-Platform Compatibility | Mandatory support for Linux x86_64, ARM64, and Windows Server |\n| \\`CON-TECH-002\\` | Fixed Runtime and Toolchain | Execution on Node.js LTS 20+ and deterministic packaging with pnpm |\n| \\`CON-TECH-003\\` | Controlled Dynamic Memory | 512 MB maximum memory consumption limit per containerized process |\n\n---\n\n## 2. Organizational and Process Constraints (\\`ACON-*\\`)\nGovernance rules, organizational standards, and team conventions:\n\n| Constraint ID | Name | Binding Directive |\n| :--- | :--- | :--- |\n| \\`ACON-ORG-001\\` | 4-Tier Git Governance | Strict flow: task ➔ feat ➔ release ➔ main |\n| \\`ACON-ORG-002\\` | Inalienable Human Sovereignty | Strict ban on unattended AI auto-approval of PRs |\n\n---\n\n## 3. Open Source License Compliance (\\`LIC-POL-*\\`)\nIn accordance with \\`license-policy.yaml\\`:\n- **Permissive (ALLOW)**: MIT, Apache-2.0, BSD-2-Clause, BSD-3-Clause, ISC.\n- **Weak Copyleft (REVIEW_REQUIRED)**: LGPL-2.1+, MPL-2.0 (restricted to dynamically linked decoupled libraries).\n- **Strong Copyleft / Viral (DENY)**: GPLv2, GPLv3, AGPLv3 (strictly prohibited in dependency tree).\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial constraints definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_COMPONENT = `---\nid: CMP-NAME-001\ntype: component\ntitle: Architecture Component Name\nstatus: proposed # proposed, accepted, deprecated, retired\nversion: \"1.0.0\"\nschema-version: \"1.0\"\nlevel: 1 # 1: Bounded Context / Root System, 2: Subsystem / Container, 3: Executable Unit / DLL / Function\nbounded-context: \"Bounded Context Name\" # Domain bounded context in DDD\nparent-component: null # null for Level 1; parent component ID (CMP-PARENT-001) for Level > 1\nimplementation-type: service # service | dll | function | composite\nimplements-use-cases:\n - UC-ACTION-001\nsatisfies-requirements:\n - FR-FEATURE-001\n - SEC-REQ-CONTROL-001\nhosted-in-enclave: SEC-ENC-DMZ-001 # Optional: mandatory only if operating in physical/logical network enclave\ninterfaces:\n # By implementation-type:\n # - service: REST/HTTP, gRPC, WebSocket, Kafka, MQTT, IPC\n # - dll: C-ABI, Native-ABI, FFI\n # - function: Function-Call, In-Process API, CLI, GUI\n - name: \"API / Interface Contract\"\n protocol: \"WebSocket\"\n contract-spec: \"docs/architecture/08_cross_cutting/data_models/ingestion_asyncapi.yaml\"\nsupersedes: null\nsuperseded-by: null\n---\n\n# CMP-NAME-001: Architecture Component Name\n\n## 1. Purpose, Responsibility, and Bounded Context\nDefines the single responsibility of the component, its domain Bounded Context alignment, and abstraction level within the overall architecture.\n\n## 2. Structure and Connectivity Diagram (arc42 Sec. 5 / NAF v4)\n\\`\\`\\`mermaid\ngraph TD\n Client[Actor / External Client] -->|Protocol / Interface| CMP[CMP-NAME-001]\n CMP -->|In-Process / Network / C-ABI| SubModule[Subcomponent or Persistence]\n\\`\\`\\`\n\n## 3. Interface Contracts and Execution Policies\n- **Execution Mechanism**: Lifecycle specification (autonomous daemon/service, dynamic loading via \\`LoadLibrary\\`/\\`dlopen\\` if DLL, or direct function invocation).\n- **Fault Tolerance and Performance**: Memory bounds, target latency, concurrency, or failure isolation.\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-14 | Lead Architect | Initial component architecture definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_CONTEXT_AND_SCOPE = `---\nid: ARCH-CTX-001\ntype: context-and-scope\ntitle: \"03. System Context and Scope\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 3\nnaf-perspective: \"Operational Perspective\"\noperational-exchanges:\n - OIE-CHANNEL-001\ncontext-boundaries:\n - CTX-PERIMETER-001\nsupersedes: null\nsuperseded-by: null\n---\n\n# 03. Context and Scope (arc42 Sec. 3 / NAF Operational)\n\n## 1. Business Context\nModels conceptual boundaries of the system with respect to users, collaborating external systems, and external data sources.\n\n### 1.1 Business Context Diagram\n\\`\\`\\`mermaid\ngraph LR\n User[Actor / End User] -->|Service Request| System([AI-SDLC System])\n System -->|Query / Enrichment| ExtService[External System / Partner API]\n System -->|Audit Record| SIEM[SIEM / Audit System]\n\\`\\`\\`\n\n### 1.2 Operational Information Exchanges (\\`OIE-*\\`)\n| Exchange ID | Source / Target | Payload / Message | Protocol / Channel | Format |\n| :--- | :--- | :--- | :--- | :--- |\n| \\`OIE-COMM-001\\` | User ➔ System | Operation Request | HTTPS / REST | JSON (Schema v1) |\n| \\`OIE-NOTIF-002\\`| System ➔ User | Events and Notifications | WebSocket / WSS | JSON Streaming |\n| \\`OIE-AUDIT-003\\`| System ➔ SIEM | Immutable Audit Trails | Syslog / TLS | RFC 5424 |\n\n---\n\n## 2. Technical Context and Perimeter Infrastructure\nModels physical and logical channels crossing system boundaries (DMZ networks, load balancers, firewalls, and reverse proxies).\n\n### 2.1 Technical Context Diagram\n\\`\\`\\`mermaid\ngraph TD\n Client[Client / Browser / App] -->|TLS 1.3 / Port 443| LB[Reverse Proxy / WAF]\n LB -->|mTLS / DMZ Internal Network| Gateway[API Gateway / Ingestion]\n Gateway -->|gRPC / IPC| Core[Domain Services]\n\\`\\`\\`\n\n---\n\n## 3. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial context and scope definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_CROSS_CUTTING_CONCEPTS = `---\nid: ARCH-CROSS-001\ntype: cross-cutting-concepts\ntitle: \"08. Cross-Cutting Concepts\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 8\nnaf-perspective: \"Information & Security\"\ndata-models:\n - DATA-MODEL-001\nsecurity-enclaves:\n - SEC-ENC-DMZ-001\nsecurity-policies:\n - SEC-POL-TLS-001\nsupersedes: null\nsuperseded-by: null\n---\n\n# 08. Cross-Cutting Concepts (arc42 Sec. 8 / NAF Information & Security)\n\n## 1. Cross-Cutting Security Concept and Zero Trust Model\nDescribes global security approach, authentication, authorization, and enclave isolation (\\`SEC-ENC-*\\`):\n\n### 1.1 Machine-to-Machine (M2M) Identity and Authentication\n- All inter-service communication requires mutual authentication (mTLS) with regularly rotated x509 certificates.\n- Private keys are safeguarded in secure enclaves (TPM, HSM, or centralized secret vaults).\n\n### 1.2 Binding Security Policies (\\`SEC-POL-*\\`)\n| Policy ID | Scope | Control Description |\n| :--- | :--- | :--- |\n| \\`SEC-POL-TLS-001\\` | Network Communications | Mandatory TLS 1.3 with modern cipher suites (ECDHE-ECDSA-AES256-GCM) |\n| \\`SEC-POL-ZERO-LEAK\\`| Data at Rest | AES-256 volume encryption and strict PII log masking |\n\n---\n\n## 2. Cross-Cutting Data Models and Schemas (\\`DATA-*\\`)\nSpecifies exchange schemas and canonical interfaces:\n\n| Model ID | Format / Schema | Specification Path | Purpose |\n| :--- | :--- | :--- | :--- |\n| \\`DATA-SCHEMA-001\\` | JSON Schema / OpenAPI 3.1 | \\`docs/architecture/08_cross_cutting/data_models/api.json\\` | External API contract |\n| \\`DATA-EVENT-002\\` | AsyncAPI / Protobuf | \\`docs/architecture/08_cross_cutting/data_models/events.yaml\\`| Internal async events |\n\n---\n\n## 3. Observability, Metrics, and Immutable Auditing\n- **Distributed Tracing**: W3C Trace Context (\\`traceparent\\`) injection via OpenTelemetry.\n- **Operational Metrics**: Prometheus RED metrics exposition (Rate, Errors, Duration).\n- **Structured Logging**: Deterministic JSON format with mandatory fields (\\`timestamp\\`, \\`level\\`, \\`trace_id\\`, \\`component_id\\`).\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial cross-cutting concepts definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_DEPLOYMENT_VIEW = `---\nid: ARCH-DEP-001\ntype: deployment-view\ntitle: \"07. Deployment and Infrastructure View\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 7\nnaf-perspective: \"Resource / Deployment\"\ndeployment-nodes:\n - RES-NODE-001\n - RES-CLUSTER-002\nenclaves-mapped:\n - SEC-ENC-DMZ-001\n - SEC-ENC-INTERNAL-002\nsupersedes: null\nsuperseded-by: null\n---\n\n# 07. Deployment View (arc42 Sec. 7 / NAF Resource Deployment)\n\n## 1. Infrastructure Topology and Network Enclaves\nMaps physical and logical component distribution across compute nodes, Kubernetes clusters, availability zones, and segmented security enclaves.\n\n### 1.1 Deployment Topology Diagram\n\\`\\`\\`mermaid\ngraph TD\n subgraph Internet[\"Public Internet\"]\n Users[Clients / Browsers]\n end\n\n subgraph EnclaveDMZ[\"Enclave: SEC-ENC-DMZ-001 (Perimeter Network)\"]\n WAF[WAF / Reverse Proxy]\n IngestService[\"Pod: CMP-INGEST-001 (Node.js LTS)\"]\n end\n\n subgraph EnclaveInternal[\"Enclave: SEC-ENC-INTERNAL-002 (Private Network)\"]\n CoreService[\"Pod: CMP-CORE-001 (Worker Pool)\"]\n DB[(DB Cluster: PostgreSQL / Storage)]\n end\n\n Users -->|HTTPS / TLS 1.3| WAF\n WAF -->|mTLS| IngestService\n IngestService -->|Isolated Internal Network| CoreService\n CoreService -->|Encrypted Connection / TLS| DB\n\\`\\`\\`\n\n---\n\n## 2. Node and Execution Resources Inventory (\\`RES-*\\` / \\`DEP-*\\`)\n\n| Resource ID | Node Type | Associated Enclave | Min CPU / RAM | Deployed Components |\n| :--- | :--- | :--- | :--- | :--- |\n| \\`RES-NODE-DMZ-01\\` | VM / Kubernetes Node | \\`SEC-ENC-DMZ-001\\` | 2 vCPU / 4 GB | \\`CMP-INGEST-001\\` |\n| \\`RES-NODE-CORE-01\\`| VM / Worker Node | \\`SEC-ENC-INTERNAL-002\\` | 4 vCPU / 8 GB | \\`CMP-CORE-001\\` |\n| \\`RES-NODE-DB-01\\` | Managed Instance | \\`SEC-ENC-INTERNAL-002\\` | 4 vCPU / 16 GB | Immutable Storage |\n\n---\n\n## 3. Network Policies and Traffic Isolation\n- **Perimeter Control**: External access strictly restricted to port 443 via WAF.\n- **Lateral Isolation**: Perimeter network (\\`SEC-ENC-DMZ-001\\`) has no direct visibility into internal database.\n- **Encrypted Channels**: All inter-node connections operate under mTLS with certificates issued by internal CA.\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial deployment view definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_GLOSSARY = `---\nid: ARCH-GLOSS-001\ntype: architecture-glossary\ntitle: \"12. Architecture Glossary and Terms Taxonomy\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 12\nnaf-perspective: \"Taxonomy & Terms\"\ncites-domain-terms:\n - TERM-TELEMETRY-001\n - TERM-ENCLAVE-001\ncites-bounded-contexts:\n - BC-CORE-GOVERNANCE\nsupersedes: null\nsuperseded-by: null\n---\n\n# 12. Architecture Glossary (arc42 Sec. 12 / NAF Taxonomy)\n\n## 1. Canonical Domain Terms (\\`TERM-*\\`)\nOfficial definitions and references for business and product domain terms:\n\n| Term / ID | Canonical Definition | Reference Bounded Context |\n| :--- | :--- | :--- |\n| \\`TERM-ENCLAVE-001\\` | Logically or physically isolated network zone with strict access and encryption policies | Architecture / Cybersecurity |\n| \\`TERM-HANDOFF-001\\` | Immutable canonical context handoff contract between development and engineering agents | AI-SDLC Governance |\n| \\`TERM-PDAC-001\\` | Product-Definition-as-Code: product modeling and 360° traceability in Git repositories | Core Engine |\n\n---\n\n## 2. Technical Abbreviations and Acronyms\nGlossary of architectural concepts used across system documentation:\n\n| Acronym | Full Meaning | Definition in System Context |\n| :--- | :--- | :--- |\n| **arc42** | Architecture Communication Template | Modular standard to document and communicate software architectures |\n| **NAF v4** | NATO Architecture Framework v4 | Enterprise architecture framework for critical, interoperable systems |\n| **ADR** | Architecture Decision Record | Immutable record of a significant architectural decision |\n| **mTLS** | Mutual Transport Layer Security | Bidirectional cryptographic certificate authentication |\n| **RTM** | Requirements Traceability Matrix | 360° traceability matrix between requirements, code, and tests |\n\n---\n\n## 3. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial architecture glossary definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_INTRODUCTION_AND_GOALS = `---\nid: ARCH-INTRO-001\ntype: architecture-introduction\ntitle: \"01. Introduction and System Goals\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 1\nnaf-perspective: \"Enterprise & Capability\"\ncites-product-actors:\n - ACT-NAME-001\ncites-quality-goals:\n - QR-LATENCY-001\n - QR-AVAILABILITY-001\ncites-use-cases:\n - UC-MAIN-001\nsupersedes: null\nsuperseded-by: null\n---\n\n# 01. Introduction and System Goals (arc42 Sec. 1 / NAF Enterprise)\n\n## 1. System Vision and Executive Summary\nDescribes core system mission, the business problem it solves, and value delivered to users and organization.\n\n### 1.1 Mission Statement\n> *The [System Name] system provides [key capability] for [target audience], guaranteeing [key security, performance, or reliability guarantees].*\n\n---\n\n## 2. Priority Quality Goals (Canonical ProductShape Citations)\nLists top 3 to 5 critical quality goals, linking directly to non-functional requirements (\\`QR-*\\`) defined in ProductShape:\n\n| Priority | Quality Goal | Requirement ID | Architectural Rationale |\n| :---: | :--- | :--- | :--- |\n| **1** | High Availability and Resilience | \\`QR-AVAILABILITY-001\\` | Decoupled architecture, active redundancy, and automated failover |\n| **2** | Real-Time Latency / Performance | \\`QR-LATENCY-001\\` | Asynchronous processing pipeline, low-latency queues |\n| **3** | Zero Trust Security | \\`SEC-REQ-AUTH-001\\` | Strict mTLS authentication and enclave isolation |\n\n---\n\n## 3. Stakeholder and Primary Actors Matrix\nMapping of system stakeholders with architectural expectations:\n\n| Role / Stakeholder | Actor ID | Architectural Expectations |\n| :--- | :--- | :--- |\n| **System Operators** | \\`ACT-OPERATOR-001\\` | Observability dashboards, early alerting, and auditability |\n| **End Users** | \\`ACT-USER-001\\` | Consistent response times and secure interfaces |\n| **Security Team** | \\`ACT-SEC-AUDITOR\\` | Zero secrets leakage and immutable access logging |\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial architecture goals definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_LEVEL_1_WHITEBOX = `---\nid: ARCH-L1-WHITEBOX-001\ntype: building-blocks-level-1\ntitle: \"05. Level 1 Building Blocks: Overall Whitebox\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 5\nnaf-perspective: \"Services & Systems (Level 1)\"\nbounded-contexts:\n - \"Core Domain Context\"\n - \"Supporting Context\"\ncontains-components:\n - CMP-NAME-001\n - CMP-NAME-002\nsupersedes: null\nsuperseded-by: null\n---\n\n# 05. Building Blocks View: Level 1 Whitebox (arc42 Sec. 5 / NAF Services & Systems)\n\n## 1. Overall System Decomposition (Level 1)\nPresents system decomposition into major subsystems, execution containers, and domain Bounded Contexts.\n\n### 1.1 Level 1 Whitebox Diagram\n\\`\\`\\`mermaid\ngraph TD\n subgraph BoundedContext_Core[\"Bounded Context: Core Domain\"]\n CMP_INGEST[\"CMP-INGEST: Data Ingestion\"]\n CMP_ENGINE[\"CMP-ENGINE: Rules Engine\"]\n end\n\n subgraph BoundedContext_Audit[\"Bounded Context: Auditing & Telemetry\"]\n CMP_OBSERVABILITY[\"CMP-OBS: Monitoring & Metrics\"]\n CMP_STORAGE[\"CMP-STORAGE: Immutable Storage\"]\n end\n\n Actor[Client / User] -->|External Protocol| CMP_INGEST\n CMP_INGEST -->|Internal Event / IPC| CMP_ENGINE\n CMP_ENGINE -->|Traces / Auditing| CMP_STORAGE\n CMP_OBSERVABILITY -.->|Scrape / Polling| CMP_ENGINE\n\\`\\`\\`\n\n---\n\n## 2. Bounded Contexts and Root Components Catalog\n\n| Bounded Context | Component ID | Implementation Type | Primary Responsibility |\n| :--- | :--- | :---: | :--- |\n| **Core Domain** | \\`CMP-INGEST\\` | \\`service\\` | TLS termination, syntactic payload validation, and filtering |\n| **Core Domain** | \\`CMP-ENGINE\\` | \\`service\\` | Business rules evaluation and deterministic computation |\n| **Auditing** | \\`CMP-STORAGE\\` | \\`composite\\` | Event persistence and immutable traceability |\n\n---\n\n## 3. Recursive Decomposition into Sub-Levels\nEach listed container or subsystem is detailed in its own component specification (\\`CMP-*.md\\`) conforming to \\`templates/architecture/component.template.md\\`:\n- **Level 2 (Subsystems / Containers)**: Autonomous services, microservices, daemons.\n- **Level 3 (Execution Units)**: DLLs, native plugins (.so, .dylib), pure domain functions.\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial L1 whitebox definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_QUALITY_REQUIREMENTS = `---\nid: ARCH-QUAL-001\ntype: quality-requirements\ntitle: \"10. Quality Requirements and Quality Tree\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 10\nnaf-perspective: \"Quality Perspective\"\ncites-quality-requirements:\n - QR-LATENCY-001\n - QR-AVAILABILITY-001\n - QR-MAINTAINABILITY-001\nsupersedes: null\nsuperseded-by: null\n---\n\n# 10. Quality Requirements (arc42 Sec. 10 / NAF Quality)\n\n## 1. Quality Tree\nHierarchical structure of key system quality attributes based on ISO/IEC 25010:\n\n\\`\\`\\`mermaid\ngraph TD\n QualityTree[System Quality] --> Performance[Performance Efficiency]\n QualityTree --> Reliability[Reliability & Resilience]\n QualityTree --> Security[Zero Trust Security]\n QualityTree --> Maintainability[As-Code Maintainability]\n\n Performance --> P1[Real-Time Latency: QR-LATENCY-001]\n Reliability --> R1[99.99% Availability: QR-AVAILABILITY-001]\n Security --> S1[Strict Authentication: SEC-REQ-AUTH-001]\n Maintainability --> M1[Cyclomatic Complexity <= 10: quality-policy.yaml]\n\\`\\`\\`\n\n---\n\n## 2. Assessable Quality Scenarios\nDefinition of concrete scenarios with stimulus, environment, response, and measure:\n\n| Requirement ID | ISO Attribute | Stimulus and Environment | System Response | Objective Measure |\n| :--- | :--- | :--- | :--- | :--- |\n| \\`QR-LATENCY-001\\` | Performance | Peak load of 10,000 req/s | Processing and queuing persistence | p95 latency < 50ms |\n| \\`QR-AVAILABILITY-001\\` | Reliability | Abrupt crash of 1 worker node | Automatic pod redistribution | Service downtime = 0s |\n| \\`QR-MAINTAINABILITY-001\\`| Maintainability | Submodule refactoring | Deterministic Release Gates execution | CC $\\\\le 10$, LOC $\\\\le 40$ |\n\n---\n\n## 3. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial quality tree definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_RISKS_AND_TECHNICAL_DEBT = `---\nid: ARCH-RISK-001\ntype: risks-and-technical-debt\ntitle: \"11. Architecture Risks and Technical Debt\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 11\nnaf-perspective: \"Risk & Technical Debt\"\nrisks:\n - RSK-SCALE-001\n - RSK-DEP-002\nsupersedes: null\nsuperseded-by: null\n---\n\n# 11. Risks and Technical Debt (arc42 Sec. 11 / NAF Risk & Debt)\n\n## 1. Architectural Risks Matrix (\\`RSK-*\\`)\nAssessment and tracking of identified technical risks:\n\n| Risk ID | Risk Description | Probability | Impact | Mitigation Strategy |\n| :--- | :--- | :---: | :---: | :--- |\n| \\`RSK-SCALE-001\\` | Database bottleneck during telemetry bursts | Medium | High | Horizontal partitioning and second-level cache |\n| \\`RSK-DEP-002\\` | Stale cryptographic runtime dependencies | Low | Critical | Automated SCA auditing in CI with daily scanning |\n| \\`RSK-MEM-003\\` | Memory degradation due to ingestion buffer accumulation | Medium | Medium | Continuous heap metrics monitoring and deterministic restarts |\n\n---\n\n## 2. Technical Debt and Incurred Compromises Log\nDocumentation of temporary shortcuts, provisional decisions, or pending refactorings:\n\n| Debt Item | Affected Component | Trade-off Justification | Payoff / Refactoring Plan |\n| :--- | :--- | :--- | :--- |\n| JSON serialization instead of binary | \\`CMP-INGEST-001\\` | Fast initial MVP delivery | Planned migration to Protobuf in release v2.0 |\n| Manual mock in integration tests | \\`packages/core\\` | Avoid external broker dependency in CI | Adoption of hermetic testcontainers |\n\n---\n\n## 3. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial risks and technical debt definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_RUNTIME_VIEW = `---\nid: ARCH-RUN-001\ntype: runtime-view\ntitle: \"06. Runtime View and Dynamic Behavior\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 6\nnaf-perspective: \"Behaviour & Sequences\"\nsequences:\n - SEQ-NOMINAL-001\n - SEQ-DEGRADED-002\nflows:\n - FLW-LIFECYCLE-001\nsatisfies-requirements:\n - FR-FEATURE-001\n - SEC-REQ-AUTH-001\nsupersedes: null\nsuperseded-by: null\n---\n\n# 06. Runtime View (arc42 Sec. 6 / NAF Behaviour)\n\n## 1. Nominal Scenario: Main Business Flow (\\`SEQ-NOMINAL-001\\`)\nDescribes sequence orchestration and component interactions for a typical user request or system event:\n\n\\`\\`\\`mermaid\nsequenceDiagram\n autonumber\n actor Client as External Client (ACT-CLIENT-001)\n participant Gateway as API Gateway (CMP-GATEWAY-001)\n participant Core as Domain Engine (CMP-CORE-001)\n participant Storage as Persistence / DB (CMP-STORAGE-001)\n\n Client->>Gateway: POST /api/v1/resource (Bearer Token / mTLS)\n Gateway->>Gateway: Validate input schema and authentication\n alt Validation Failed\n Gateway-->>Client: 400 Bad Request / 401 Unauthorized\n else Valid Input\n Gateway->>Core: In-process invocation / gRPC\n Core->>Core: Execute business rules\n Core->>Storage: Deterministic transaction (INSERT / UPDATE)\n Storage-->>Core: Confirmation (ACK)\n Core-->>Gateway: Business result\n Gateway-->>Client: 200 OK with response payload\n end\n\\`\\`\\`\n\n---\n\n## 2. Security Scenario / Abuse Mitigation (\\`SEQ-SEC-002\\`)\nModels behavior and isolation under malicious attempts or anomalous loads:\n\n\\`\\`\\`mermaid\nsequenceDiagram\n autonumber\n actor Attacker as Threat Actor (ACT-THREAT-001)\n participant DMZ as Ingestion Gateway (SEC-ENC-DMZ-001)\n participant SIEM as Audit and SIEM (CMP-AUDIT-001)\n\n Attacker->>DMZ: Anomalous request (missing credentials or oversized payload)\n DMZ->>DMZ: Detected by strict validation filter\n DMZ->>SIEM: Log anomaly event with IP and fingerprint\n DMZ-->>Attacker: 403 Forbidden / Connection aborted\n\\`\\`\\`\n\n---\n\n## 3. Dynamic Scenarios and Associated Requirements Matrix\n\n| Scenario ID | Type | Satisfied Requirements | Participating Components |\n| :--- | :---: | :--- | :--- |\n| \\`SEQ-NOMINAL-001\\` | Nominal | \\`FR-FEATURE-001\\` | \\`CMP-GATEWAY-001\\`, \\`CMP-CORE-001\\` |\n| \\`SEQ-SEC-002\\` | Security | \\`SEC-REQ-AUTH-001\\` | \\`CMP-GATEWAY-001\\`, \\`CMP-AUDIT-001\\` |\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial runtime views definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_SOLUTION_STRATEGY = `---\nid: ARCH-STRAT-001\ntype: solution-strategy\ntitle: \"04. Architecture Solution Strategy\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 4\nnaf-perspective: \"Service & Resource Strategy\"\nstrategies:\n - STRAT-ARCH-001\n - STRAT-DATA-001\nsupersedes: null\nsuperseded-by: null\n---\n\n# 04. Solution Strategy (arc42 Sec. 4 / NAF Strategy)\n\n## 1. Fundamental Structural Decisions (\\`STRAT-*\\`)\nDescribes global choices shaping the system and how they address priority quality goals:\n\n| Strategy ID | Fundamental Pattern / Decision | Technical Rationale & Trade-offs |\n| :--- | :--- | :--- |\n| \\`STRAT-ARCH-001\\` | Hexagonal Architecture / Ports and Adapters | Strict isolation of domain logic from I/O frameworks |\n| \\`STRAT-COMM-002\\` | Event-Driven Asynchronous Communication | Temporal decoupling between fast ingestion and batch processing |\n| \\`STRAT-SEC-003\\` | Zero Trust Verification | Every internal channel validates identity using mTLS and short-lived tokens |\n\n---\n\n## 2. Decomposition and Design Principles\n- **Domain-Driven Design (DDD)**: Identification of independent Bounded Contexts with decoupled canonical schemas.\n- **Immutability and Determinism**: Reproducible states, cryptographic hashing of inputs and outputs (PDaC).\n- **Error Handling and Graceful Degradation**: Circuit Breaker pattern and Dead-Letter-Queue (DLQ) retry mechanisms.\n\n---\n\n## 3. Quality Goals Fulfillment Matrix\nMapping of strategies against non-functional requirements (\\`QR-*\\`):\n\n| Quality Goal | Adopted Decision / Strategy | Guarantee Mechanism |\n| :--- | :--- | :--- |\n| \\`QR-LATENCY-REALTIME\\` | Zero-Copy binary ingestion and in-memory queues | Static buffers and HTTP/2 connection pooling |\n| \\`QR-AVAILABILITY-HIGH\\` | Stateless multi-zone deployment | Automated horizontal autoscaling with Health Checks |\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial solution strategy definition | CHG-ARCH-001 |\n`;\n\nexport interface ArchTemplateDef {\n filename: string;\n content: string;\n isMinimal: boolean;\n}\n\nexport const ALL_ARCHITECTURE_TEMPLATES: ArchTemplateDef[] = [\n { filename: \"adr.template.md\", content: STARTER_ARCH_ADR, isMinimal: true },\n { filename: \"architecture-constraints.template.md\", content: STARTER_ARCH_ARCHITECTURE_CONSTRAINTS, isMinimal: false },\n { filename: \"component.template.md\", content: STARTER_ARCH_COMPONENT, isMinimal: true },\n { filename: \"context-and-scope.template.md\", content: STARTER_ARCH_CONTEXT_AND_SCOPE, isMinimal: false },\n { filename: \"cross-cutting-concepts.template.md\", content: STARTER_ARCH_CROSS_CUTTING_CONCEPTS, isMinimal: false },\n { filename: \"deployment-view.template.md\", content: STARTER_ARCH_DEPLOYMENT_VIEW, isMinimal: false },\n { filename: \"glossary.template.md\", content: STARTER_ARCH_GLOSSARY, isMinimal: false },\n { filename: \"introduction-and-goals.template.md\", content: STARTER_ARCH_INTRODUCTION_AND_GOALS, isMinimal: false },\n { filename: \"level-1-whitebox.template.md\", content: STARTER_ARCH_LEVEL_1_WHITEBOX, isMinimal: false },\n { filename: \"quality-requirements.template.md\", content: STARTER_ARCH_QUALITY_REQUIREMENTS, isMinimal: false },\n { filename: \"risks-and-technical-debt.template.md\", content: STARTER_ARCH_RISKS_AND_TECHNICAL_DEBT, isMinimal: false },\n { filename: \"runtime-view.template.md\", content: STARTER_ARCH_RUNTIME_VIEW, isMinimal: false },\n { filename: \"solution-strategy.template.md\", content: STARTER_ARCH_SOLUTION_STRATEGY, isMinimal: false },\n];\n\nexport const VALID_ARCHITECTURE_GRANULARITIES = ['minimal', 'full', 'complete', 'none'] as const;\nexport type ArchitectureGranularity = (typeof VALID_ARCHITECTURE_GRANULARITIES)[number];\n\nexport function getArchitectureTemplates(\n granularity: ArchitectureGranularity | string = 'minimal'\n): { filename: string; content: string }[] {\n const normalized = String(granularity || 'minimal').toLowerCase();\n if (normalized === 'none') {\n return [];\n }\n if (normalized === 'full' || normalized === 'complete') {\n return ALL_ARCHITECTURE_TEMPLATES.map((t) => ({ filename: t.filename, content: t.content }));\n }\n // Default to minimal\n return ALL_ARCHITECTURE_TEMPLATES.filter((t) => t.isMinimal).map((t) => ({\n filename: t.filename,\n content: t.content,\n }));\n}\n","/**\n * AI-SDLC: Core Project Initialization and Governance Setup\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { installGitHooks } from '../git/hook-installer.js';\nimport {\n STARTER_ANTIGRAVITY_RULES,\n STARTER_CURSOR_CORE_RULES,\n STARTER_CURSOR_PRODUCT_RULES,\n STARTER_CURSOR_QUALITY_RULES,\n STARTER_CLAUDE_RULES,\n STARTER_COPILOT_RULES,\n STARTER_CURSOR_MCP,\n STARTER_ANTIGRAVITY_MCP,\n STARTER_VSCODE_MCP,\n SPECIALIZED_AGENT_TEMPLATES,\n renderAntigravityAgentFile,\n renderClaudeAgentFile,\n renderCopilotAgentFile,\n renderCursorAgentFile,\n} from './agent-templates.js';\nimport {\n getArchitectureTemplates,\n VALID_ARCHITECTURE_GRANULARITIES,\n ArchitectureGranularity,\n} from './architecture-templates.js';\n\nexport const VALID_CI_PROVIDERS = ['github', 'gitlab', 'azure', 'bitbucket'] as const;\nexport type SupportedCiProvider = (typeof VALID_CI_PROVIDERS)[number];\n\nexport const STARTER_QUALITY_POLICY = `# ==============================================================================\n# AI-SDLC: Software Quality, Coding Rules & Release Gate Policy\n# ==============================================================================\nversion: \"1.0\"\nproject: \"Standard AI-SDLC Project\"\nenforcement_mode: \"STRICT\"\n\nscope:\n target_directories:\n - \"src\"\n - \"lib\"\n - \"examples\"\n - \"tests\"\n supported_extensions:\n - \".ts\"\n - \".js\"\n - \".py\"\n - \".java\"\n - \".go\"\n - \".cs\"\n - \".rs\"\n - \".cpp\"\n - \".c\"\n exclude_patterns:\n - \"node_modules\"\n - \"__pycache__\"\n - \".pytest_cache\"\n - \"target\"\n - \"bin\"\n - \"obj\"\n - \".git\"\n - \"reports\"\n - \"dist\"\n - \".changeset\"\n\nthresholds:\n cyclomatic_complexity:\n max_per_function: 10\n cognitive_complexity:\n max_per_function: 15\n maintainability_index:\n min_acceptable_score: 50.0\n function_length:\n max_function_lines: 40\n`;\n\nexport const STARTER_LICENSE_POLICY = `# ==============================================================================\n# AI-SDLC: Open Source License Compliance & Governance Policy\n# ==============================================================================\nversion: \"1.0\"\nproject: \"Standard AI-SDLC Project\"\ndefault_action: \"DENY\"\n\ncategories:\n permissive_free:\n action: \"ALLOW\"\n description: \"Permissive commercial use licenses. Attribution only required.\"\n spdx_identifiers:\n - \"MIT\"\n - \"Apache-2.0\"\n - \"BSD-2-Clause\"\n - \"BSD-3-Clause\"\n - \"ISC\"\n - \"Unlicense\"\n - \"CC0-1.0\"\n - \"0BSD\"\n\n weak_copyleft_conditional:\n action: \"REVIEW_REQUIRED\"\n description: \"Allowed only as dynamically linked decoupled libraries.\"\n spdx_identifiers:\n - \"LGPL-2.1-only\"\n - \"LGPL-3.0-only\"\n - \"MPL-2.0\"\n\n strong_copyleft_viral:\n action: \"DENY\"\n description: \"Forbidden due to viral copyleft forcing source code disclosure.\"\n spdx_identifiers:\n - \"GPL-2.0-only\"\n - \"GPL-3.0-only\"\n - \"AGPL-3.0-only\"\n - \"AGPL-3.0-or-later\"\n\n commercial_acquisition_required:\n action: \"COMMERCIAL_APPROVAL_REQUIRED\"\n description: \"Source-available code requiring commercial license for SaaS deployment.\"\n spdx_identifiers:\n - \"SSPL-1.0\"\n - \"BSL-1.1\"\n`;\n\nexport const STARTER_TASK_TEMPLATE = `---\ntasks:\n - id: \"TSK-001-setup\"\n title: \"Initial component setup\"\n complexity: \"LOW\"\n risk-level: \"LOW\"\n autonomy-mode: \"AUTONOMOUS\"\n assigned-to: \"agent-developer\"\n status: \"PENDING\"\n verification:\n method: \"COMMAND_VERIFICATION\"\n command-or-criteria: \"pnpm test\"\n---\n\n# Task Plan: Component\n`;\n\nexport const STARTER_REQUIREMENT_TEMPLATE = `---\nid: \"FR-SAMPLE-001\"\ntype: \"requirement\"\ntitle: \"Sample Feature\"\nstatus: \"active\"\nversion: \"1.0.0\"\ncategory: \"functional\"\nderives-from:\n - \"UC-SAMPLE-USECASE\"\nverifiable-by: \"cucumber-bdd\"\nacceptance-format: \"gherkin\"\ncucumber-tags:\n - \"@FR-SAMPLE-001\"\n---\n\n# Requirement: Sample Feature\n\n\\`\\`\\`gherkin\nFeature: Sample Feature\n Scenario: Basic execution\n Given system is ready\n When user triggers action\n Then system responds with 200 OK\n\\`\\`\\`\n`;\n\nexport const STARTER_WORKFLOW_HANDOFF_TEMPLATE = `# Workflow Handoff Template\n\n> **Canonical reference:** [\\`process/09_agent_protocols.md\\`](../../process/09_agent_protocols.md) and [\\`process/01_governance_and_roles.md\\`](../../process/01_governance_and_roles.md).\n>\n> **Activation Criterion by Autonomy Mode:**\n> - 🟢 **\\`AUTONOMOUS\\` (or exclusive supervision at the end in PR/CI):** OMITTED. The agent executes and delivers without interrupting the user with this handoff block.\n> - 🟡 **\\`HUMAN_REVIEW_PLAN\\` | 🟠 \\`AMBIGUOUS\\` | 🔴 \\`HIGH_RISK_MANUAL\\`:** MANDATORY. Upon completing the phase or proposal, the agent emits this block and **halts**, granting visibility to the user and relinquishing control.\n\n---\n\n### 🔄 Workflow Handoff\n\n- **Completed Phase / Activity**: \\`[Current phase, e.g. Product Definition / Threat Modeling / Architecture / SDD Implementation]\\`\n- **Acting Role**: \\`[agent-product-analyst | agent-threat-modeler | agent-system-architect | agent-developer | agent-expert-user | agent-security-auditor | agent-compliance-checker]\\`\n- **Task Autonomy Mode**: \\`[HUMAN_REVIEW_PLAN | AMBIGUOUS | HIGH_RISK_MANUAL]\\`\n- **Produced Deliverables**:\n - [x] \\`[Path or ID of generated artifact, e.g. specs/product/uc-mission.md]\\`\n - [x] \\`[Path or ID of generated artifact, e.g. quality-report.md]\\`\n\n- **Recommended Next Role(s) in Workflow**:\n - \\`[Suggested role name, e.g. agent-threat-modeler]\\`: \\`[Technical rationale, e.g. Model STRIDE adversaries and mitigate abuse cases]\\`\n - *(Optional)* \\`[Alternative role, e.g. agent-expert-user]\\`: \\`[Technical rationale, e.g. Evaluate UX and MVP boundary]\\`\n\n- **Suggested Invocation Prompt**:\n > \"Act as \\`[next-role]\\` and proceed with the \\`[next phase]\\` phase on the generated deliverables: \\`[key artifacts]\\`.\"\n\n- **Human Action Window (User Sovereignty and Priority)**:\n - ✋ **Review and Validate**: Inspect generated artifacts and validate alignment with project vision before proceeding.\n - ✏️ **Edit Directly**: Modify requirements, code, or acceptance criteria directly at any time.\n - 🛑 **Pause, Divert, or Discard**: Freeze workflow, redirect toward another goal, or discard proposal.\n - ▶️ **Delegate to Next Agent**: If satisfied with output, execute suggested prompt to continue the chain.\n\n---\n`;\n\nexport const STARTER_GITLAB_CI = `# ==============================================================================\n# AI-SDLC: GitLab CI/CD Pipeline Template\n# ==============================================================================\n\nstages:\n - validate\n - test\n - integrate\n\ndefault:\n image: node:20\n cache:\n key:\n files:\n - pnpm-lock.yaml\n paths:\n - .pnpm-store\n\nvariables:\n PNPM_HOME: \"$CI_PROJECT_DIR/.pnpm\"\n\nbefore_script:\n - corepack enable\n - corepack prepare pnpm@10 --activate\n - pnpm config set store-dir .pnpm-store\n - pnpm install --frozen-lockfile\n - pnpm approve-builds --all\n - pnpm run build\n\nquality-gates:\n stage: validate\n rules:\n - if: '$CI_PIPELINE_SOURCE == \"merge_request_event\"'\n - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'\n - if: '$CI_COMMIT_BRANCH =~ /^release\\\\/.*/'\n script:\n - node packages/cli/bin/aisdlc.js check\n\ntest-and-verify:\n stage: test\n rules:\n - if: '$CI_PIPELINE_SOURCE == \"merge_request_event\"'\n - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'\n - if: '$CI_COMMIT_BRANCH =~ /^release\\\\/.*/'\n script:\n - pnpm test\n - node packages/cli/bin/aisdlc.js verify all\n\nsdd-canonical-integration:\n stage: integrate\n rules:\n - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == \"push\"'\n - if: '$CI_COMMIT_BRANCH =~ /^release\\\\/.*/ && $CI_PIPELINE_SOURCE == \"push\"'\n - if: '$CI_PIPELINE_SOURCE == \"web\"'\n variables:\n GIT_STRATEGY: clone\n GIT_DEPTH: 0\n script:\n - node packages/cli/bin/aisdlc.js sdd integrate --auto || true\n - |\n git config user.name \"gitlab-ci-bot\"\n git config user.email \"gitlab-ci-bot@noreply.gitlab.com\"\n git add -A\n if ! git diff --cached --quiet; then\n git commit -m \"chore(sdd): integrate changes into canonical baseline [skip ci]\"\n git push \"https://oauth2:\\${CI_JOB_TOKEN}@\\${CI_SERVER_HOST}/\\${CI_PROJECT_PATH}.git\" \"HEAD:\\${CI_COMMIT_BRANCH}\"\n fi\n`;\n\nexport const STARTER_AZURE_PIPELINES = `# ==============================================================================\n# AI-SDLC: Azure DevOps Pipelines Template\n# ==============================================================================\n\ntrigger:\n branches:\n include:\n - main\n - release/*\n\npr:\n branches:\n include:\n - main\n - release/*\n\npool:\n vmImage: 'ubuntu-latest'\n\nstages:\n - stage: ValidateAndTest\n displayName: 'Verificación y Quality Gates'\n jobs:\n - job: QualityAndTests\n displayName: 'Quality Gates, Linting & Tests'\n steps:\n - task: NodeTool@0\n inputs:\n versionSpec: '20.x'\n displayName: 'Instalar Node.js 20'\n\n - script: |\n corepack enable\n corepack prepare pnpm@10 --activate\n pnpm install --frozen-lockfile\n pnpm approve-builds --all\n pnpm run build\n displayName: 'Instalar dependencias y compilar monorepo'\n\n - script: |\n node packages/cli/bin/aisdlc.js check\n displayName: 'Ejecutar pre-vuelo AI-SDLC (check)'\n\n - script: |\n pnpm test\n displayName: 'Ejecutar suite de pruebas unitarias'\n\n - script: |\n node packages/cli/bin/aisdlc.js verify all\n displayName: 'Ejecutar Release Gate Completo (verify all)'\n\n - stage: CanonicalIntegration\n displayName: 'Integración Canónica Post-Merge SDD'\n dependsOn: ValidateAndTest\n condition: and(succeeded(), in(variables['Build.SourceBranch'], 'refs/heads/main', 'refs/heads/release/'))\n jobs:\n - job: SddPromote\n displayName: 'Consolidar especificaciones canónicas SDD'\n steps:\n - checkout: self\n persistCredentials: true\n fetchDepth: 0\n\n - task: NodeTool@0\n inputs:\n versionSpec: '20.x'\n displayName: 'Instalar Node.js 20'\n\n - script: |\n corepack enable\n corepack prepare pnpm@10 --activate\n pnpm install --frozen-lockfile\n pnpm approve-builds --all\n pnpm run build\n displayName: 'Instalar dependencias'\n\n - script: |\n node packages/cli/bin/aisdlc.js sdd integrate --auto || true\n name: SddIntegrate\n displayName: 'Detectar e integrar incremento SDD'\n\n - script: |\n git config user.name \"azure-pipelines[bot]\"\n git config user.email \"azure-pipelines[bot]@dev.azure.com\"\n git add -A\n if ! git diff --cached --quiet; then\n git commit -m \"chore(sdd): integrate changes into canonical baseline [skip ci]\"\n git push origin HEAD:$(Build.SourceBranchName)\n fi\n displayName: 'Sincronizar cambios canónicos en repositorio'\n`;\n\nexport const STARTER_BITBUCKET_PIPELINES = `# ==============================================================================\n# AI-SDLC: Bitbucket Pipelines Template\n# ==============================================================================\n\nimage: node:20\n\ndefinitions:\n caches:\n pnpm: $BITBUCKET_CLONE_DIR/.pnpm-store\n steps:\n - step: &build-and-verify\n name: Quality Gates & Verification\n caches:\n - pnpm\n script:\n - corepack enable\n - corepack prepare pnpm@10 --activate\n - pnpm config set store-dir $BITBUCKET_CLONE_DIR/.pnpm-store\n - pnpm install --frozen-lockfile\n - pnpm approve-builds --all\n - pnpm run build\n - node packages/cli/bin/aisdlc.js check\n - pnpm test\n - node packages/cli/bin/aisdlc.js verify all\n\n - step: &sdd-integrate\n name: SDD Canonical Integration\n caches:\n - pnpm\n script:\n - corepack enable\n - corepack prepare pnpm@10 --activate\n - pnpm config set store-dir $BITBUCKET_CLONE_DIR/.pnpm-store\n - pnpm install --frozen-lockfile\n - pnpm approve-builds --all\n - pnpm run build\n - node packages/cli/bin/aisdlc.js sdd integrate --auto || true\n - |\n git config user.name \"bitbucket-pipelines[bot]\"\n git config user.email \"pipelines[bot]@bitbucket.org\"\n git add -A\n if ! git diff --cached --quiet; then\n git commit -m \"chore(sdd): integrate changes into canonical baseline [skip ci]\"\n git push origin HEAD:$BITBUCKET_BRANCH\n fi\n\npipelines:\n pull-requests:\n '**':\n - step: *build-and-verify\n\n branches:\n main:\n - step: *build-and-verify\n - step: *sdd-integrate\n 'release/*':\n - step: *build-and-verify\n - step: *sdd-integrate\n`;\n\nexport const STARTER_GITHUB_CI = `name: CI - AI-SDLC Quality Gates & Testing\n\non:\n push:\n branches: [ main ]\n pull_request:\n branches: [ main ]\n\njobs:\n verify-and-test:\n runs-on: ubuntu-latest\n strategy:\n matrix:\n node-version: [ 18.x, 20.x, 22.x ]\n\n steps:\n - name: Checkout Code\n uses: actions/checkout@v4\n\n - name: Install pnpm\n uses: pnpm/action-setup@v4\n with:\n version: 10\n\n - name: Setup Node.js \\${{ matrix.node-version }}\n uses: actions/setup-node@v4\n with:\n node-version: \\${{ matrix.node-version }}\n cache: 'pnpm'\n\n - name: Install Dependencies\n run: |\n pnpm install --frozen-lockfile\n pnpm approve-builds --all\n\n - name: Build Monorepo Packages (@aisdlc/core & @aisdlc/cli)\n run: pnpm run build\n\n - name: Run Vitest Unit & Integration Suites\n run: pnpm test\n\n - name: Dogfooding - Run AI-SDLC Full Verification Suite\n run: node packages/cli/bin/aisdlc.js verify all\n`;\n\nexport const STARTER_GITHUB_SDD_INTEGRATE = `name: SDD Canonical Integration on Merge\n\non:\n pull_request:\n types: [closed]\n branches:\n - main\n - 'release/**'\n workflow_dispatch:\n inputs:\n change_id:\n description: 'Manual SDD change ID to integrate (e.g. chg-001-telemetry)'\n required: false\n type: string\n\npermissions:\n contents: write\n pull-requests: read\n\nconcurrency:\n group: sdd-integrate-\\${{ github.ref }}\n cancel-in-progress: false\n\njobs:\n integrate-sdd:\n name: SDD Canonical Integration\n if: github.event.pull_request.merged == true || github.event_name == 'workflow_dispatch'\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout Repository\n uses: actions/checkout@v4\n with:\n ref: \\${{ github.event.pull_request.base.ref || github.ref_name }}\n fetch-depth: 0\n token: \\${{ secrets.GITHUB_TOKEN }}\n\n - name: Install pnpm\n uses: pnpm/action-setup@v4\n with:\n version: 10\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: 20\n cache: 'pnpm'\n\n - name: Install Dependencies\n run: |\n pnpm install --frozen-lockfile\n pnpm approve-builds --all\n\n - name: Build Packages\n run: pnpm run build\n\n - name: Detect and Integrate SDD Change\n id: integrate\n env:\n PR_HEAD_REF: \\${{ github.event.pull_request.head.ref }}\n PR_TITLE: \\${{ github.event.pull_request.title }}\n PR_BODY: \\${{ github.event.pull_request.body }}\n MANUAL_CHANGE_ID: \\${{ github.event.inputs.change_id }}\n run: |\n node packages/cli/bin/aisdlc.js sdd integrate --auto || true\n\n - name: Commit and Push Canonical Baseline Changes\n run: |\n git config user.name \"github-actions[bot]\"\n git config user.email \"github-actions[bot]@users.noreply.github.com\"\n git add -A\n if ! git diff --cached --quiet; then\n git commit -m \"chore(sdd): integrate changes into canonical baseline [skip ci]\"\n git push\n echo \"✔ Canonical integration committed and synchronized in repository.\"\n else\n echo \"ℹ No pending modifications generated in working tree.\"\n fi\n`;\n\nexport * from './agent-templates.js';\nexport * from './architecture-templates.js';\n\nexport const VALID_AGENT_TARGETS = ['cursor', 'claude', 'antigravity', 'copilot', 'mcp', 'all'] as const;\nexport type AgentTarget = (typeof VALID_AGENT_TARGETS)[number];\n\nexport interface InitProjectOptions {\n rootDir?: string;\n targetDir?: string;\n ci?: string;\n agents?: string | boolean | string[];\n architecture?: ArchitectureGranularity | string;\n dryRun?: boolean;\n}\n\nexport interface InitProjectResult {\n success: boolean;\n targetDir: string;\n directoriesCreated: string[];\n filesCreated: string[];\n ciProvider?: SupportedCiProvider;\n agentsConfigured: string[];\n architectureGranularity?: ArchitectureGranularity;\n gitHookInstalled: boolean;\n error?: string;\n}\n\nconst DISABLED_AGENT_VALUES = new Set<unknown>([false, 'none', 'false', '']);\nconst ALL_AGENT_VALUES = new Set<unknown>([undefined, null, true, 'all']);\n\nexport function resolveAgentTargets(agents?: string | boolean | string[]): Set<string> {\n const result = new Set<string>();\n if (DISABLED_AGENT_VALUES.has(agents)) return result;\n if (ALL_AGENT_VALUES.has(agents)) {\n VALID_AGENT_TARGETS.forEach((t) => result.add(t));\n return result;\n }\n const rawList = Array.isArray(agents) ? agents : String(agents).split(',');\n for (const raw of rawList) {\n const item = raw.trim().toLowerCase();\n if (item === 'all') {\n VALID_AGENT_TARGETS.forEach((t) => result.add(t));\n return result;\n }\n if (VALID_AGENT_TARGETS.includes(item as AgentTarget)) {\n result.add(item);\n }\n }\n return result;\n}\n\nfunction appendAntigravityFiles(dirs: string[], files: { relPath: string; content: string }[]): void {\n dirs.push('.agent/rules', '.agent/agents', '.agent/skills');\n files.push({ relPath: '.agent/rules/ai-sdlc.md', content: STARTER_ANTIGRAVITY_RULES });\n for (const agent of SPECIALIZED_AGENT_TEMPLATES) {\n const content = renderAntigravityAgentFile(agent);\n dirs.push(`.agent/skills/${agent.id}`);\n files.push(\n { relPath: `.agent/agents/${agent.id}.md`, content },\n { relPath: `.agent/skills/${agent.id}/SKILL.md`, content }\n );\n }\n}\n\nfunction appendCursorFiles(dirs: string[], files: { relPath: string; content: string }[]): void {\n dirs.push('.cursor/rules');\n files.push(\n { relPath: '.cursor/rules/ai-sdlc-core.mdc', content: STARTER_CURSOR_CORE_RULES },\n { relPath: '.cursor/rules/ai-sdlc-product.mdc', content: STARTER_CURSOR_PRODUCT_RULES },\n { relPath: '.cursor/rules/ai-sdlc-quality.mdc', content: STARTER_CURSOR_QUALITY_RULES }\n );\n for (const agent of SPECIALIZED_AGENT_TEMPLATES) {\n files.push({ relPath: `.cursor/rules/${agent.id}.mdc`, content: renderCursorAgentFile(agent) });\n }\n}\n\nfunction appendClaudeFiles(dirs: string[], files: { relPath: string; content: string }[]): void {\n dirs.push('.claude/agents');\n files.push({ relPath: 'CLAUDE.md', content: STARTER_CLAUDE_RULES });\n for (const agent of SPECIALIZED_AGENT_TEMPLATES) {\n files.push({ relPath: `.claude/agents/${agent.id}.md`, content: renderClaudeAgentFile(agent) });\n }\n}\n\nfunction appendCopilotFiles(dirs: string[], files: { relPath: string; content: string }[]): void {\n dirs.push('.github', '.github/agents');\n files.push({ relPath: '.github/copilot-instructions.md', content: STARTER_COPILOT_RULES });\n for (const agent of SPECIALIZED_AGENT_TEMPLATES) {\n files.push({ relPath: `.github/agents/${agent.id}.agent.md`, content: renderCopilotAgentFile(agent) });\n }\n}\n\nexport function collectAgentFiles(targets: Set<string>): {\n dirs: string[];\n files: { relPath: string; content: string }[];\n} {\n const dirs: string[] = [];\n const files: { relPath: string; content: string }[] = [];\n\n const includeAll = targets.has('all');\n const includeCursor = includeAll || targets.has('cursor');\n const includeClaude = includeAll || targets.has('claude');\n const includeAntigravity = includeAll || targets.has('antigravity');\n const includeCopilot = includeAll || targets.has('copilot');\n const includeMcp = includeAll || targets.has('mcp');\n\n if (includeAntigravity) appendAntigravityFiles(dirs, files);\n if (includeCursor) appendCursorFiles(dirs, files);\n if (includeClaude) appendClaudeFiles(dirs, files);\n if (includeCopilot) appendCopilotFiles(dirs, files);\n\n if (includeMcp || includeCursor) {\n dirs.push('.cursor');\n files.push({ relPath: '.cursor/mcp.json', content: STARTER_CURSOR_MCP });\n }\n if (includeMcp || includeAntigravity) {\n files.push({ relPath: 'antigravity.mcp.json', content: STARTER_ANTIGRAVITY_MCP });\n }\n if (includeMcp) {\n dirs.push('.vscode');\n files.push({ relPath: '.vscode/mcp.json', content: STARTER_VSCODE_MCP });\n }\n\n return { dirs, files };\n}\n\nfunction writeProjectFiles(\n destDir: string,\n files: { relPath: string; content: string }[],\n dryRun?: boolean\n): string[] {\n const filesCreated: string[] = [];\n for (const f of files) {\n const fullFilePath = path.join(destDir, f.relPath);\n const parentDir = path.dirname(fullFilePath);\n if (!dryRun) {\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n if (!fs.existsSync(fullFilePath)) {\n fs.writeFileSync(fullFilePath, f.content, 'utf-8');\n filesCreated.push(f.relPath);\n }\n } else {\n filesCreated.push(f.relPath);\n }\n }\n return filesCreated;\n}\n\nexport function initProject(options: InitProjectOptions = {}): InitProjectResult {\n const baseDir = options.rootDir || process.cwd();\n const destDir = path.resolve(baseDir, options.targetDir || '.');\n\n let ciProvider: SupportedCiProvider | undefined;\n if (options.ci) {\n const normalized = options.ci.trim().toLowerCase();\n if (!VALID_CI_PROVIDERS.includes(normalized as SupportedCiProvider)) {\n return {\n success: false,\n targetDir: destDir,\n directoriesCreated: [],\n filesCreated: [],\n agentsConfigured: [],\n gitHookInstalled: false,\n error: `Unrecognized CI provider: '${options.ci}'. Valid options: ${VALID_CI_PROVIDERS.join(', ')}.`,\n };\n }\n ciProvider = normalized as SupportedCiProvider;\n }\n\n let archGranularity: ArchitectureGranularity = 'minimal';\n if (options.architecture !== undefined && options.architecture !== null) {\n const rawArch = String(options.architecture).trim().toLowerCase();\n if (!VALID_ARCHITECTURE_GRANULARITIES.includes(rawArch as ArchitectureGranularity)) {\n return {\n success: false,\n targetDir: destDir,\n directoriesCreated: [],\n filesCreated: [],\n agentsConfigured: [],\n gitHookInstalled: false,\n error: `Unrecognized architecture granularity level: '${options.architecture}'. Valid options: ${VALID_ARCHITECTURE_GRANULARITIES.join(', ')}.`,\n };\n }\n archGranularity = rawArch as ArchitectureGranularity;\n }\n\n const directories = [\n 'process',\n 'schemas/product',\n 'schemas/security',\n 'schemas/compliance',\n 'schemas/architecture',\n 'schemas/safety',\n 'schemas/sdd',\n 'schemas/manuals',\n 'templates/product',\n 'templates/security',\n 'templates/compliance',\n 'templates/architecture',\n 'templates/safety',\n 'templates/sdd',\n 'templates/manuals',\n 'templates/ci',\n 'templates/workflow',\n 'specs',\n 'reports',\n 'tests/features',\n ];\n\n if (ciProvider === 'github') {\n directories.push('.github/workflows');\n }\n\n const agentTargets = resolveAgentTargets(options.agents);\n const { dirs: agentDirs, files: agentFiles } = collectAgentFiles(agentTargets);\n for (const d of agentDirs) {\n if (!directories.includes(d)) {\n directories.push(d);\n }\n }\n\n const directoriesCreated: string[] = [];\n for (const d of directories) {\n const fullDir = path.join(destDir, d);\n if (!options.dryRun) {\n fs.mkdirSync(fullDir, { recursive: true });\n }\n directoriesCreated.push(d);\n }\n\n const filesToWrite: { relPath: string; content: string }[] = [\n { relPath: 'quality-policy.yaml', content: STARTER_QUALITY_POLICY },\n { relPath: 'license-policy.yaml', content: STARTER_LICENSE_POLICY },\n { relPath: 'templates/sdd/tasks.template.md', content: STARTER_TASK_TEMPLATE },\n { relPath: 'templates/product/requirement.template.md', content: STARTER_REQUIREMENT_TEMPLATE },\n { relPath: 'templates/workflow/agent-handoff.template.md', content: STARTER_WORKFLOW_HANDOFF_TEMPLATE },\n { relPath: 'templates/ci/.gitlab-ci.yml', content: STARTER_GITLAB_CI },\n { relPath: 'templates/ci/azure-pipelines.yml', content: STARTER_AZURE_PIPELINES },\n { relPath: 'templates/ci/bitbucket-pipelines.yml', content: STARTER_BITBUCKET_PIPELINES },\n ];\n\n if (ciProvider === 'gitlab') {\n filesToWrite.push({ relPath: '.gitlab-ci.yml', content: STARTER_GITLAB_CI });\n } else if (ciProvider === 'azure') {\n filesToWrite.push({ relPath: 'azure-pipelines.yml', content: STARTER_AZURE_PIPELINES });\n } else if (ciProvider === 'bitbucket') {\n filesToWrite.push({ relPath: 'bitbucket-pipelines.yml', content: STARTER_BITBUCKET_PIPELINES });\n } else if (ciProvider === 'github') {\n filesToWrite.push(\n { relPath: '.github/workflows/ci.yml', content: STARTER_GITHUB_CI },\n { relPath: '.github/workflows/sdd-integrate-on-merge.yml', content: STARTER_GITHUB_SDD_INTEGRATE }\n );\n }\n\n filesToWrite.push(...agentFiles);\n\n const archTemplates = getArchitectureTemplates(archGranularity);\n for (const tpl of archTemplates) {\n filesToWrite.push({\n relPath: path.join('templates', 'architecture', tpl.filename).replace(/\\\\/g, '/'),\n content: tpl.content,\n });\n }\n\n const filesCreated = writeProjectFiles(destDir, filesToWrite, options.dryRun);\n\n let gitHookInstalled = false;\n if (!options.dryRun) {\n const gitDir = path.join(destDir, '.git');\n if (fs.existsSync(gitDir)) {\n const hookRes = installGitHooks(destDir);\n gitHookInstalled = hookRes.success;\n }\n }\n\n const agentsConfigured = Array.from(agentTargets).filter((t) => t !== 'all');\n if (agentTargets.has('all')) {\n agentsConfigured.unshift('all');\n }\n\n return {\n success: true,\n targetDir: destDir,\n directoriesCreated,\n filesCreated,\n ciProvider,\n agentsConfigured,\n architectureGranularity: archGranularity,\n gitHookInstalled,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/index.ts","../src/verifiers/ast/typescript-ast.ts","../src/verifiers/ast/polyglot-scanner.ts","../src/verifiers/quality-gate.ts","../src/utils/fs.ts","../src/verifiers/gherkin.ts","../src/adapters/sdd/openspec.ts","../src/adapters/sdd/speckit.ts","../src/adapters/sdd/integration.ts","../src/verifiers/pdac-graph.ts","../src/verifiers/schemas.ts","../src/adapters/sdd/scaffold.ts","../src/adapters/sdd/ci.ts","../src/adapters/sdd/index.ts","../src/verifiers/traceability.ts","../src/verifiers/governance.ts","../src/verifiers/testing-coverage.ts","../src/verifiers/sca/scanner.ts","../src/verifiers/sca/sbom.ts","../src/verifiers/licenses.ts","../src/verifiers/progressive-friction.ts","../src/verifiers/duplicates.ts","../src/verifiers/secrets.ts","../src/verifiers/sast.ts","../src/reporters/quality-report.ts","../src/git/workflow.ts","../src/git/checkout.ts","../src/git/trailers.ts","../src/git/agent-detector.ts","../src/git/hook-installer.ts","../src/reporters/pr-kpis.ts","../src/reporters/release-kpis.ts","../src/reporters/cytoscape-bundle.ts","../src/reporters/dashboard.ts","../src/init/agent-templates.ts","../src/init/architecture-templates.ts","../src/init/index.ts"],"names":["SyntaxKind","Project","Node","path","path2","yaml","path3","fs","fs2","path4","path5","fs3","path6","fs4","path7","fs5","path8","fs6","crypto","fs7","path9","path10","fs8","path11","fs9","specPath","specFmObj","specContent","specGherkinBlocks","wsValidation","specValidation","fs10","path12","fs11","fs12","path13","fs13","path14","fs14","path15","child_process","path16","fs15","path17","fs16","crypto2","fs17","path18","dependencies","violations","permittedCount","reportMarkdown","fs18","path19","crypto3","fs19","path20","execFileSync","fs20","path21","path22","fs21","path23","fs22","path24","fs23","path25","fs24","path26","fs25","sep","path27","fs26","createRequire","path28","fs27","path29","fs28","path30","fs29"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+IO,IAAM,qBAAA,GAAkD,CAAC,OAAA,EAAS,UAAA,EAAY,UAAU;AAiIxF,IAAM,oBAAA,GAAgD;AAAA,EAC3D,YAAA;AAAA,EACA,mBAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF;AC5QA,IAAM,gBAAA,uBAAuB,GAAA,CAAgB;AAAA,EAC3CA,kBAAA,CAAW,WAAA;AAAA,EACXA,kBAAA,CAAW,qBAAA;AAAA,EACXA,kBAAA,CAAW,YAAA;AAAA,EACXA,kBAAA,CAAW,cAAA;AAAA,EACXA,kBAAA,CAAW,cAAA;AAAA,EACXA,kBAAA,CAAW,cAAA;AAAA,EACXA,kBAAA,CAAW,WAAA;AAAA,EACXA,kBAAA,CAAW,UAAA;AAAA,EACXA,kBAAA,CAAW;AACb,CAAC,CAAA;AAED,IAAM,kBAAA,uBAAyB,GAAA,CAAgB;AAAA,EAC7CA,kBAAA,CAAW,uBAAA;AAAA,EACXA,kBAAA,CAAW,WAAA;AAAA,EACXA,kBAAA,CAAW;AACb,CAAC,CAAA;AAED,IAAI,aAAA,GAAgC,IAAA;AAEpC,SAAS,gBAAA,GAA4B;AACnC,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,aAAA,GAAgB,IAAIC,eAAA,CAAQ;AAAA,MAC1B,qBAAA,EAAuB,IAAA;AAAA,MACvB,eAAA,EAAiB,EAAE,OAAA,EAAS,IAAA,EAAM,KAAK,CAAA;AAAE,KAC1C,CAAA;AAAA,EACH;AACA,EAAA,OAAO,aAAA;AACT;AAEA,SAAS,uBAAuB,IAAA,EAA2B;AACzD,EAAA,IACEC,YAAA,CAAK,qBAAA,CAAsB,IAAI,CAAA,IAC/BA,aAAK,mBAAA,CAAoB,IAAI,CAAA,IAC7BA,YAAA,CAAK,yBAAyB,IAAI,CAAA,IAClCA,YAAA,CAAK,wBAAA,CAAyB,IAAI,CAAA,EAClC;AACA,IAAA,MAAM,MAAA,GAASA,YAAA,CAAK,wBAAA,CAAyB,IAAI,CAAA,GAAI,SAASA,YAAA,CAAK,wBAAA,CAAyB,IAAI,CAAA,GAAI,MAAA,GAAS,EAAA;AAC7G,IAAA,OAAO,GAAG,MAAM,CAAA,EAAG,IAAA,CAAK,OAAA,MAAa,WAAW,CAAA,CAAA;AAAA,EAClD;AACA,EAAA,IAAIA,YAAA,CAAK,wBAAA,CAAyB,IAAI,CAAA,EAAG,OAAO,aAAA;AAChD,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,4BAA4B,MAAA,EAAsB;AACzD,EAAA,IAAIA,aAAK,qBAAA,CAAsB,MAAM,KAAKA,YAAA,CAAK,oBAAA,CAAqB,MAAM,CAAA,EAAG;AAC3E,IAAA,OAAO,OAAO,OAAA,EAAQ;AAAA,EACxB;AACA,EAAA,IAAIA,YAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA,EAAG;AACjC,IAAA,MAAM,IAAA,GAAO,OAAO,YAAA,EAAa;AACjC,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,IAAKA,YAAA,CAAK,gBAAgB,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG;AACpD,MAAA,OAAO,IAAA,CAAK,CAAC,CAAA,CAAE,cAAA,EAAe;AAAA,IAChC;AACA,IAAA,OAAO,MAAA,CAAO,aAAA,EAAc,CAAE,OAAA,EAAQ;AAAA,EACxC;AACA,EAAA,OAAO,WAAA;AACT;AAEA,SAAS,oBAAoB,IAAA,EAAoB;AAC/C,EAAA,MAAM,QAAA,GAAW,uBAAuB,IAAI,CAAA;AAC5C,EAAA,IAAI,UAAU,OAAO,QAAA;AAErB,EAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,EAAA,OAAO,MAAA,GAAS,2BAAA,CAA4B,MAAM,CAAA,GAAI,WAAA;AACxD;AAEA,SAAS,YAAA,CAAa,MAAkB,KAAA,EAAsB;AAC5D,EAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,IAAA;AACvC,EAAA,IAAI,IAAA,KAASF,mBAAW,gBAAA,EAAkB;AACxC,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,CAAOA,kBAAA,CAAW,gBAAgB,CAAA;AACxD,IAAA,OAAO,kBAAA,CAAmB,IAAI,OAAA,EAAS,gBAAA,GAAmB,OAAA,EAAQ,IAAKA,mBAAW,OAAO,CAAA;AAAA,EAC3F;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,yBAAyB,IAAA,EAAoB;AACpD,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAA,CAAK,iBAAA,CAAkB,CAAC,KAAA,KAAU;AAChC,IAAA,IAAI,wBAAA,CAAyB,KAAA,EAAO,IAAI,CAAA,EAAG;AAC3C,IAAA,IAAI,YAAA,CAAa,KAAA,CAAM,OAAA,EAAQ,EAAG,KAAK,CAAA,EAAG;AACxC,MAAA,UAAA,EAAA;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,wBAAA,CAAyB,OAAa,IAAA,EAAqB;AAClE,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,KAAA;AAC3B,EAAA,OACEE,YAAA,CAAK,qBAAA,CAAsB,KAAK,CAAA,IAChCA,YAAA,CAAK,oBAAoB,KAAK,CAAA,IAC9BA,YAAA,CAAK,wBAAA,CAAyB,KAAK,CAAA;AAEvC;AAEA,SAAS,uBAAA,CAAwB,IAAA,EAAY,cAAA,GAAiB,CAAA,EAAW;AACvE,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,WAAA,EAAY,EAAG;AACtC,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,EAAQ;AAC3B,IAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,GAAA,CAAI,IAAI,CAAA;AAC/C,IAAA,MAAM,WAAA,GAAc,aAAA,GAAgB,cAAA,GAAiB,CAAA,GAAI,cAAA;AAEzD,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,SAAA,IAAa,IAAA,KAASF,kBAAA,CAAW,UAAA,GAAa,CAAA,GAAI,CAAA,GAAI,cAAA;AAAA,IACxD;AAEA,IAAA,IAAI,CAAC,wBAAA,CAAyB,KAAA,EAAO,IAAI,CAAA,EAAG;AAC1C,MAAA,SAAA,IAAa,uBAAA,CAAwB,OAAO,WAAW,CAAA;AAAA,IACzD;AAAA,EACF;AACA,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,uBAAA,CAAwB,UAAkB,UAAA,EAAiD;AAClG,EAAA,MAAM,WAAW,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AACxF,EAAA,MAAM,eAAe,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,UAAA,CAAW,IAAI,CAAA,IAAK,CAAA,CAAE,WAAW,IAAI,CAAA,IAAK,EAAE,UAAA,CAAW,GAAG,CAAC,CAAA,CAAE,MAAA;AAC3G,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,CAAS,SAAS,YAAY,CAAA;AAEtD,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,0BAAA,EAA4B,EAAE,CAAA;AACjE,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,KAAA,CAAM,6BAA6B,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AACxF,EAAA,MAAM,CAAA,GAAI,OAAO,MAAA,IAAU,CAAA;AAC3B,EAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,MAAM,EAAE,IAAA,IAAQ,CAAA;AAClC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAEnD,EAAA,MAAM,QAAQ,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,YAAA,GAAe,SAAS,MAAA,GAAS,CAAA;AACrE,EAAA,MAAM,aAAA,GAAgB,KAAK,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,CAAK,GAAA,GAAM,KAAK,CAAC,CAAA;AAE1D,EAAA,MAAM,KAAA,GAAQ,GAAA,GAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,GAAO,UAAA,GAAa,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,aAAA;AACnF,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,GAAA,EAAM,KAAA,GAAQ,GAAA,GAAO,GAAG,CAAC,CAAA;AAEnE,EAAA,OAAO,EAAE,KAAK,EAAA,EAAI,IAAA,CAAK,MAAM,YAAA,GAAe,EAAE,IAAI,EAAA,EAAG;AACvD;AAEA,SAAS,mBAAA,CAAoB,IAAA,EAAY,GAAA,EAAa,QAAA,EAA4B;AAChF,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,KAAK,oBAAA,CAAqBA,kBAAA,CAAW,UAAU,CAAA,CAAE,SAAS,CAAA,EAAG;AAC/D,IAAA,MAAA,CAAO,KAAK,wBAAwB,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,yCAAA,CAA0C,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC5D,IAAA,MAAA,CAAO,KAAK,sCAAmC,CAAA;AAAA,EACjD;AACA,EAAA,IAAI,MAAM,EAAA,EAAI;AACZ,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,oBAAA,EAAoB,GAAG,CAAA,0BAAA,CAAsB,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,sBAAsB,IAAA,EAAqB;AAClD,EAAA,OACEE,aAAK,qBAAA,CAAsB,IAAI,KAC/BA,YAAA,CAAK,mBAAA,CAAoB,IAAI,CAAA,IAC7BA,YAAA,CAAK,wBAAA,CAAyB,IAAI,KAClCA,YAAA,CAAK,wBAAA,CAAyB,IAAI,CAAA,IAClCA,YAAA,CAAK,yBAAyB,IAAI,CAAA;AAEtC;AAEA,SAAS,wBAAwB,IAAA,EAAqB;AACpD,EAAA,IAAI,CAACA,YAAA,CAAK,eAAA,CAAgB,IAAI,CAAA,IAAK,CAACA,YAAA,CAAK,oBAAA,CAAqB,IAAI,CAAA,EAAG,OAAO,KAAA;AAC5E,EAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,EAAA,IAAIA,YAAA,CAAK,sBAAsB,MAAM,CAAA,IAAKA,aAAK,oBAAA,CAAqB,MAAM,GAAG,OAAO,IAAA;AACpF,EAAA,IAAIA,YAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA,EAAG;AACjC,IAAA,OAAO,CAAC,MAAM,MAAM,CAAA,CAAE,SAAS,MAAA,CAAO,aAAA,EAAc,CAAE,OAAA,EAAS,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,qBAAqB,IAAA,EAAqB;AACjD,EAAA,OAAO,qBAAA,CAAsB,IAAI,CAAA,IAAK,uBAAA,CAAwB,IAAI,CAAA;AACpE;AAEA,SAAS,gBAAA,CAAiB,MAAY,QAAA,EAAmC;AACvE,EAAA,MAAM,YAAA,GAAe,oBAAoB,IAAI,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,yBAAyB,IAAI,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,wBAAwB,IAAI,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,EAAA,MAAM,QAAA,GAAW,KAAK,OAAA,EAAQ;AAC9B,EAAA,MAAM,EAAE,GAAA,EAAK,EAAA,EAAG,GAAI,uBAAA,CAAwB,UAAU,UAAU,CAAA;AAChE,EAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,IAAA,EAAM,GAAA,EAAK,QAAQ,CAAA;AAE1D,EAAA,OAAO,EAAE,cAAc,QAAA,EAAU,GAAA,EAAK,YAAY,SAAA,EAAW,eAAA,EAAiB,IAAI,UAAA,EAAW;AAC/F;AAEA,SAAS,mBAAA,CAAoB,SAAiB,QAAA,EAAmC;AAC/E,EAAA,MAAM,EAAE,GAAA,EAAK,EAAA,EAAG,GAAI,uBAAA,CAAwB,SAAS,CAAC,CAAA;AACtD,EAAA,MAAM,UAAA,GAAa,MAAM,EAAA,GAAK,CAAC,uBAAoB,GAAG,CAAA,0BAAA,CAAsB,IAAI,EAAC;AACjF,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,aAAA;AAAA,IACd,QAAA;AAAA,IACA,GAAA;AAAA,IACA,UAAA,EAAY,CAAA;AAAA,IACZ,SAAA,EAAW,CAAA;AAAA,IACX,eAAA,EAAiB,EAAA;AAAA,IACjB;AAAA,GACF;AACF;AAEO,SAAS,6BAAA,CAA8B,SAAiB,QAAA,EAAqC;AAClG,EAAA,MAAM,UAAU,gBAAA,EAAiB;AACjC,EAAA,MAAM,GAAA,GAAWC,gBAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,aAAY,IAAK,KAAA;AACpD,EAAA,MAAM,WAAW,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA,CAAA;AACvF,EAAA,MAAM,UAAA,GAAa,QAAQ,gBAAA,CAAiB,QAAA,EAAU,SAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AAClF,EAAA,MAAM,cAAiC,EAAC;AAExC,EAAA,IAAI;AACF,IAAA,UAAA,CAAW,iBAAA,CAAkB,CAAC,IAAA,KAAS;AACrC,MAAA,IAAI,oBAAA,CAAqB,IAAI,CAAA,EAAG;AAC9B,QAAA,WAAA,CAAY,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,MACnD;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,WAAA,CAAY,SAAS,CAAA,GAAI,WAAA,GAAc,CAAC,mBAAA,CAAoB,OAAA,EAAS,QAAQ,CAAC,CAAA;AAAA,EACvF,CAAA,SAAE;AACA,IAAA,UAAA,CAAW,MAAA,EAAO;AAAA,EACpB;AACF;AClNO,SAAS,wBAAA,CAAyB,SAAiB,QAAA,EAAqC;AAC7F,EAAA,MAAM,GAAA,GAAWC,gBAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,WAAA,EAAY;AAC/C,EAAA,OAAO,GAAA,KAAQ,QAAQ,sBAAA,CAAuB,OAAA,EAAS,QAAQ,CAAA,GAAI,qBAAA,CAAsB,SAAS,QAAQ,CAAA;AAC5G;AAEA,SAAS,kBAAkB,OAAA,EAA0B;AACnD,EAAA,MAAM,UAAU,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,IAAK,EAAC,EAAG,MAAA;AAC7C,EAAA,MAAM,UAAU,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,IAAK,EAAC,EAAG,MAAA;AAC7C,EAAA,OAAO,MAAA,GAAS,CAAA,KAAM,CAAA,IAAK,MAAA,GAAS,CAAA,KAAM,CAAA;AAC5C;AAEA,SAAS,sBAAA,CAAuB,IAAA,EAAc,UAAA,EAAoB,KAAA,EAAyB;AACzF,EAAA,IAAI,SAAS,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,KAAW,GAAG,OAAO,IAAA;AAC9C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,WAAU,CAAE,MAAA;AAClD,EAAA,OAAO,UAAA,GAAa,UAAA;AACtB;AAEA,SAAS,kBAAA,CAAmB,MAAc,KAAA,EAAyD;AACjG,EAAA,IAAI,OAAO,OAAO,IAAA;AAClB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,gDAAgD,CAAA;AACzE,EAAA,OAAO,KAAA,GAAQ,EAAE,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EAAG,MAAA,EAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAO,GAAI,IAAA;AAC/D;AAEA,SAAS,gBAAA,CACP,KAAA,EACA,MAAA,EACA,SAAA,EACM;AACN,EAAA,IAAI,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC/C,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,CAAM,SAAA,EAAW,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,SAAA,EAAW,WAAW,CAAA;AAAA,EAC7F;AACA,EAAA,KAAA,CAAM,SAAA,GAAY,IAAA;AAClB,EAAA,KAAA,CAAM,UAAU,EAAC;AACnB;AAEA,SAAS,oBAAA,CACP,GAAA,EACA,KAAA,EACA,MAAA,EACA,SAAA,EACM;AACN,EAAA,IAAI,uBAAuB,GAAA,EAAK,KAAA,CAAM,UAAA,EAAY,KAAA,CAAM,WAAW,CAAA,EAAG;AACpE,IAAA,KAAA,CAAM,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,EACxB,CAAA,MAAO;AACL,IAAA,gBAAA,CAAiB,KAAA,EAAO,QAAQ,SAAS,CAAA;AAAA,EAC3C;AACF;AAEA,SAAS,iBAAA,CACP,GAAA,EACA,KAAA,EACA,MAAA,EACA,SAAA,EACM;AACN,EAAA,IAAI,iBAAA,CAAkB,IAAI,IAAA,EAAM,GAAG,KAAA,CAAM,WAAA,GAAc,CAAC,KAAA,CAAM,WAAA;AAE9D,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,GAAA,EAAK,KAAA,CAAM,WAAW,CAAA;AAC1D,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,gBAAA,CAAiB,KAAA,EAAO,QAAQ,SAAS,CAAA;AACzC,IAAA,KAAA,CAAM,YAAY,QAAA,CAAS,IAAA;AAC3B,IAAA,KAAA,CAAM,aAAa,QAAA,CAAS,MAAA;AAC5B,IAAA,KAAA,CAAM,OAAA,GAAU,CAAC,GAAG,CAAA;AACpB,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,MAAM,SAAA,EAAW;AACnB,IAAA,oBAAA,CAAqB,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,SAAS,CAAA;AAAA,EACpD;AACF;AAEA,SAAS,sBAAA,CAAuB,SAAiB,QAAA,EAAqC;AACpF,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,MAAM,SAA6B,EAAC;AACpC,EAAA,MAAM,KAAA,GAAQ,EAAE,SAAA,EAAW,IAAA,EAAuB,OAAA,EAAS,EAAC,EAAe,UAAA,EAAY,CAAA,EAAG,WAAA,EAAa,KAAA,EAAM;AAE7G,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,iBAAA,CAAkB,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC/C,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,CAAM,WAAW,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,SAAA,EAAW,KAAA,CAAM,QAAQ,CAAA;AAAA,EAChG;AAEA,EAAA,OAAO,sBAAA,CAAuB,MAAA,EAAQ,OAAA,EAAS,QAAQ,CAAA;AACzD;AASA,SAAS,gBAAA,CACP,IAAA,EACA,KAAA,EACA,MAAA,EACA,WACA,GAAA,EACM;AACN,EAAA,IAAI,CAAC,MAAM,SAAA,EAAW;AACpB,IAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,IAAA,EAAM,GAAG,CAAA;AAC/C,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,KAAA,CAAM,SAAA,GAAY,SAAA;AAClB,IAAA,KAAA,CAAM,UAAA,GAAa,CAAA;AACnB,IAAA,KAAA,CAAM,UAAU,EAAC;AAAA,EACnB;AAEA,EAAA,KAAA,CAAM,OAAA,CAAQ,KAAK,IAAI,CAAA;AACvB,EAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,IAAA,EAAM,KAAA,CAAM,gBAAgB,GAAG,CAAA;AAC5D,EAAA,KAAA,CAAM,iBAAiB,GAAA,CAAI,UAAA;AAC3B,EAAA,KAAA,CAAM,cAAc,GAAA,CAAI,KAAA;AAExB,EAAA,IAAI,MAAM,UAAA,KAAe,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtD,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,CAAM,SAAA,EAAW,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,SAAA,EAAW,WAAW,CAAA;AAC3F,IAAA,KAAA,CAAM,SAAA,GAAY,IAAA;AAClB,IAAA,KAAA,CAAM,UAAU,EAAC;AAAA,EACnB;AACF;AAEA,SAAS,qBAAA,CAAsB,SAAiB,QAAA,EAAqC;AACnF,EAAA,MAAM,GAAA,GAAWA,gBAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,WAAA,EAAY;AAC/C,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,MAAM,SAA6B,EAAC;AACpC,EAAA,MAAM,KAAA,GAAwB,EAAE,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,GAAG,OAAA,EAAS,EAAC,EAAG,cAAA,EAAgB,KAAA,EAAM;AAEnG,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,gBAAA,CAAiB,MAAM,CAAC,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,GAAG,GAAG,CAAA;AAAA,EAClD;AAEA,EAAA,OAAO,sBAAA,CAAuB,MAAA,EAAQ,OAAA,EAAS,QAAQ,CAAA;AACzD;AAEA,SAAS,kBAAkB,IAAA,EAA6B;AACtD,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAAA,IACjB;AAAA,GACF;AACA,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA,IAAK,MAAM,CAAC,CAAA,IAAK,MAAM,CAAC,CAAA;AACjD,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,UAAU,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS,QAAQ,CAAA;AACjG,EAAA,OAAO,aAAa,CAAC,UAAA,CAAW,QAAA,CAAS,SAAS,IAAI,SAAA,GAAY,IAAA;AACpE;AAEA,SAAS,mBAAA,CAAoB,MAAc,GAAA,EAA4B;AACrE,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,IAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,IAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,IAAA;AAE5F,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,+CAA+C,CAAA;AACxE,IAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA;AAAA,EAC5B;AACA,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,kEAAkE,CAAA;AAC3F,IAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA;AAAA,EAC5B;AACA,EAAA,OAAO,kBAAkB,IAAI,CAAA;AAC/B;AAOA,SAAS,gBAAA,CAAiB,MAAc,QAAA,EAAqE;AAC3G,EAAA,IAAI,SAAS,QAAA,EAAU,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,MAAM,KAAA,EAAM;AAC5D,EAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,IAAA,KAAS,IAAA,EAAK;AACzC;AAEA,SAAS,gBAAA,CAAiB,IAAA,EAAc,IAAA,EAAc,OAAA,EAAuD;AAC3G,EAAA,IAAI,OAAA,IAAW,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,SAAY,EAAE,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK;AACjF,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAChC;AAEA,SAAS,mBAAA,CACP,IAAA,EACA,IAAA,EACA,GAAA,EACuE;AACvE,EAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,EAAK,OAAO,EAAE,UAAA,EAAY,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,aAAA,EAAe,IAAA,EAAK;AAC/F,EAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,EAAK,OAAO,EAAE,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,aAAA,EAAe,KAAA,EAAM;AAC/F,EAAA,MAAM,UAAU,IAAA,KAAS,GAAA,IAAO,SAAS,GAAA,IAAQ,IAAA,KAAS,OAAO,GAAA,KAAQ,KAAA;AACzE,EAAA,OAAO,EAAE,YAAY,KAAA,EAAO,KAAA,EAAO,UAAU,IAAA,GAAO,IAAA,EAAM,eAAe,KAAA,EAAM;AACjF;AAEA,SAAS,gBAAA,CACP,IAAA,EACA,IAAA,EACA,OAAA,EACA,QAAA,EACgF;AAChF,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA;AAChD,IAAA,OAAO,EAAE,SAAS,GAAA,CAAI,OAAA,EAAS,UAAU,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AAAA,EACzE;AACA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,IAAA,EAAM,QAAQ,CAAA;AAC3C,IAAA,OAAO,EAAE,SAAS,QAAA,EAAU,GAAA,CAAI,UAAU,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AAAA,EAC1E;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,SAAS,KAAA,EAAM;AAC1D;AAEA,SAAS,aAAA,CACP,IAAA,EACA,IAAA,EACA,GAAA,EAC6E;AAC7E,EAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,IAAA,EAAM,IAAA,EAAM,GAAG,CAAA;AACnD,EAAA,IAAI,OAAA,CAAQ,aAAA,EAAe,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,UAAA,EAAY,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AACzF,EAAA,IAAI,OAAA,CAAQ,UAAA,EAAY,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,KAAA,EAAM;AACtF,EAAA,IAAI,OAAA,CAAQ,KAAA,EAAO,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,UAAA,EAAY,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAM,KAAA,EAAM;AAC3F,EAAA,MAAM,QAAQ,IAAA,KAAS,GAAA,GAAM,CAAA,GAAI,IAAA,KAAS,MAAM,EAAA,GAAK,CAAA;AACrD,EAAA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAY,OAAO,KAAA,EAAO,IAAA,EAAM,MAAM,KAAA,EAAM;AAC9D;AAEA,SAAS,aAAA,CACP,KACA,KAAA,EACoC;AACpC,EAAA,IAAI,IAAI,IAAA,EAAM,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,MAAM,IAAA,EAAK;AAC9C,EAAA,IAAI,IAAI,UAAA,EAAY;AAClB,IAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,IAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,EACnC;AACA,EAAA,IAAI,IAAI,KAAA,EAAO;AACb,IAAA,KAAA,CAAM,WAAW,GAAA,CAAI,KAAA;AACrB,IAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAAA,EACnC;AACA,EAAA,KAAA,CAAM,SAAS,GAAA,CAAI,KAAA;AACnB,EAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AACnC;AAEA,SAAS,gBAAA,CAAiB,IAAA,EAAc,UAAA,EAAqB,GAAA,EAAyB;AACpF,EAAA,MAAM,QAAQ,EAAE,KAAA,EAAO,GAAG,OAAA,EAAS,UAAA,EAAY,UAAU,IAAA,EAAsB;AAE/E,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,IAAA,GAAO,KAAK,CAAC,CAAA;AACnB,IAAA,MAAM,IAAA,GAAO,IAAI,CAAA,GAAI,IAAA,CAAK,SAAS,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,GAAI,EAAA;AAEjD,IAAA,MAAM,UAAU,gBAAA,CAAiB,IAAA,EAAM,MAAM,KAAA,CAAM,OAAA,EAAS,MAAM,QAAQ,CAAA;AAC1E,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,KAAA,CAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,MAAA,KAAA,CAAM,WAAW,OAAA,CAAQ,QAAA;AACzB,MAAA,IAAI,QAAQ,IAAA,EAAM,CAAA,EAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,EAAM,IAAA,EAAM,GAAG,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,GAAA,EAAK,KAAK,CAAA;AACrC,IAAA,IAAI,KAAK,IAAA,EAAM;AACf,IAAA,CAAA,IAAK,IAAA,CAAK,OAAA;AAAA,EACZ;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,UAAA,EAAY,MAAM,OAAA,EAAQ;AACzD;AAEA,SAAS,sBAAA,CAAuB,MAAA,EAA4B,OAAA,EAAiB,QAAA,EAAqC;AAChH,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,CAAC,wBAAA,CAAyB,OAAA,EAAS,aAAA,EAAe,QAAQ,CAAC,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,wBAAA,CAAyB,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,QAAQ,CAAC,CAAA;AAC7E;AAEA,SAAS,oBAAA,CAAqB,MAAc,GAAA,EAAuB;AACjE,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,+CAAA,CAAgD,IAAA,CAAK,IAAI,CAAA,EAAG;AAC9D,IAAA,MAAA,CAAO,KAAK,sCAAmC,CAAA;AAAA,EACjD;AACA,EAAA,IAAI,MAAM,EAAA,EAAI;AACZ,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,oBAAA,EAAoB,GAAG,CAAA,0BAAA,CAAsB,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,IAAA,EAAc,UAAA,EAAoB,GAAA,EAAa,YAAA,EAA8B;AACtG,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,8BAAA,EAAgC,EAAE,CAAA;AACjE,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,KAAA,CAAM,6BAA6B,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AACxF,EAAA,MAAM,CAAA,GAAI,OAAO,MAAA,IAAU,CAAA;AAC3B,EAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,MAAM,EAAE,IAAA,IAAQ,CAAA;AAClC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAEnD,EAAA,MAAM,aAAa,GAAA,GAAM,YAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,UAAA,GAAa,CAAA,GAAI,YAAA,GAAe,UAAA,GAAa,CAAA;AAC3D,EAAA,MAAM,aAAA,GAAgB,KAAK,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,CAAK,GAAA,GAAM,KAAK,CAAC,CAAA;AAE1D,EAAA,MAAM,KAAA,GAAQ,GAAA,GAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,GAAO,UAAA,GAAa,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,aAAA;AACnF,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,KAAA,GAAQ,GAAA,GAAO,GAAG,CAAC,CAAA,GAAI,EAAE,CAAA,GAAI,EAAA;AAC5E;AAEA,SAAS,aAAA,CAAc,MAAc,IAAA,EAAwB;AAC3D,EAAA,OAAO,IAAA,GACH,KAAK,UAAA,CAAW,GAAG,KAAK,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,GACvE,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,IAAK,IAAA,CAAK,WAAW,IAAI,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AAC3E;AAEA,SAAS,mBAAA,CAAoB,UAAoB,IAAA,EAA4E;AAC3H,EAAA,MAAM,YAAA,GAAe,SAAS,MAAA,CAAO,CAAC,MAAM,aAAA,CAAc,CAAA,EAAG,IAAI,CAAC,CAAA,CAAE,MAAA;AACpE,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,CAAS,SAAS,YAAY,CAAA;AACtD,EAAA,MAAM,UAAA,GAAa,SAAS,MAAA,CAAO,CAAC,MAAM,CAAC,aAAA,CAAc,CAAA,EAAG,IAAI,CAAC,CAAA;AACjE,EAAA,OAAO,EAAE,GAAA,EAAK,YAAA,EAAc,UAAA,EAAW;AACzC;AAEA,SAAS,wBAAA,CAAyB,IAAA,EAAc,IAAA,EAAc,QAAA,EAAmC;AAC/F,EAAA,MAAM,GAAA,GAAWA,gBAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,WAAA,EAAY;AAC/C,EAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AACpF,EAAA,MAAM,EAAE,KAAK,YAAA,EAAc,UAAA,KAAe,mBAAA,CAAoB,QAAA,EAAU,QAAQ,KAAK,CAAA;AAErF,EAAA,MAAM,UAAA,GAAa,yBAAA,CAA0B,IAAA,EAAM,GAAG,CAAA;AACtD,EAAA,MAAM,SAAA,GAAY,wBAAA,CAAyB,UAAA,EAAY,GAAA,KAAQ,KAAK,CAAA;AACpE,EAAA,MAAM,eAAA,GAAkB,iBAAA,CAAkB,IAAA,EAAM,UAAA,EAAY,KAAK,YAAY,CAAA;AAE7E,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,IAAA;AAAA,IACd,QAAA;AAAA,IACA,GAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,UAAA,EAAY,oBAAA,CAAqB,IAAA,EAAM,GAAG;AAAA,GAC5C;AACF;AAEA,SAAS,yBAAA,CAA0B,MAAc,GAAA,EAAqB;AACpE,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,KAAA,GAAQ,8CAAA;AAAA,EACV,CAAA,MAAA,IAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,KAAA,GAAQ,mCAAA;AAAA,EACV,CAAA,MAAA,IAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,KAAA,GAAQ,sCAAA;AAAA,EACV,CAAA,MAAO;AACL,IAAA,KAAA,GAAQ,qDAAA;AAAA,EACV;AACA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,sCAAA,EAAwC,EAAE,CAAA;AACzE,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA;AACrC,EAAA,OAAO,CAAA,IAAK,OAAA,GAAU,OAAA,CAAQ,MAAA,GAAS,CAAA,CAAA;AACzC;AAEA,SAAS,wBAAA,CAAyB,OAAiB,IAAA,EAAuB;AACxE,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,OAAA,GAAU,CAAA;AAEd,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,WAAU,CAAE,MAAA;AAC9C,MAAA,IAAI,gCAAA,CAAiC,IAAA,CAAK,IAAI,CAAA,EAAG;AAC/C,QAAA,SAAA,IAAa,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAAA,MACxC;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG,OAAA,EAAA;AACxB,MAAA,IAAI,IAAA,CAAK,SAAS,GAAG,CAAA,YAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,GAAU,CAAC,CAAA;AACzD,MAAA,IAAI,uCAAA,CAAwC,IAAA,CAAK,IAAI,CAAA,EAAG;AACtD,QAAA,SAAA,IAAa,CAAA,GAAI,OAAA;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;;;AChWO,IAAM,kBAAA,GAAwC;AAAA,EACnD,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF;AAEO,IAAM,gBAAA,GAAsC;AAAA,EACjD,cAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF;AAEA,IAAM,mBAAsC,CAAC,KAAA,EAAO,QAAQ,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAElF,SAAS,0BAAA,GAA4C;AAC1D,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,EAAA;AAAA,IAChB,aAAA,EAAe,EAAA;AAAA,IACf,mBAAA,EAAqB,EAAA;AAAA,IACrB,kBAAA,EAAoB,EAAA;AAAA,IACpB,iBAAA,EAAmB,EAAA;AAAA,IACnB,mBAAA,EAAqB,EAAA;AAAA,IACrB,qBAAA,EAAuB,EAAA;AAAA,IACvB,YAAA,EAAc,QAAA;AAAA,IACd,kBAAA,EAAoB,CAAC,KAAA,EAAO,KAAA,EAAO,YAAY,OAAO,CAAA;AAAA,IACtD,oBAAA,EAAsB,CAAC,GAAG,kBAAkB,CAAA;AAAA,IAC5C,gBAAA,EAAkB,CAAC,GAAG,gBAAgB;AAAA,GACxC;AACF;AAEA,SAAS,aAAA,CAAc,QAAuB,GAAA,EAAoC;AAChF,EAAA,IAAI,OAAO,GAAA,CAAI,gBAAA,KAAqB,QAAA,EAAU,MAAA,CAAO,eAAe,GAAA,CAAI,gBAAA;AACxE,EAAA,IAAI,CAAC,GAAA,CAAI,KAAA,IAAS,OAAO,GAAA,CAAI,UAAU,QAAA,EAAU;AACjD,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAElB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,kBAAkB,CAAA,EAAG;AAC3C,IAAA,MAAA,CAAO,kBAAA,GAAqB,KAAA,CAAM,kBAAA,CAAmB,GAAA,CAAI,MAAM,CAAA;AAAA,EACjE;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,oBAAoB,CAAA,EAAG;AAC7C,IAAA,MAAA,CAAO,oBAAA,GAAuB,KAAA,CAAM,oBAAA,CAAqB,GAAA,CAAI,MAAM,CAAA;AAAA,EACrE;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,gBAAgB,CAAA,EAAG;AACzC,IAAA,KAAA,MAAW,GAAA,IAAO,MAAM,gBAAA,EAAkB;AACxC,MAAA,MAAM,CAAA,GAAI,OAAO,GAAG,CAAA;AACpB,MAAA,IAAI,CAAC,OAAO,gBAAA,CAAiB,QAAA,CAAS,CAAC,CAAA,EAAG,MAAA,CAAO,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAA;AAAA,IAC1E;AAAA,EACF;AACF;AAEA,SAAS,uBAAA,CAAwB,QAAuB,MAAA,EAAuB;AAC7E,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AAC3C,EAAA,MAAM,GAAA,GAAM,MAAA;AACZ,EAAA,IAAI,IAAI,yBAAA,KAA8B,MAAA,SAAkB,iBAAA,GAAoB,MAAA,CAAO,IAAI,yBAAyB,CAAA;AAChH,EAAA,IAAI,IAAI,2BAAA,KAAgC,MAAA,SAAkB,mBAAA,GAAsB,MAAA,CAAO,IAAI,2BAA2B,CAAA;AACtH,EAAA,IAAI,GAAA,CAAI,kCAAkC,MAAA,EAAW;AACnD,IAAA,MAAA,CAAO,qBAAA,GAAwB,MAAA,CAAO,GAAA,CAAI,6BAA6B,CAAA;AAAA,EACzE;AACF;AAEA,SAAS,kBAAA,CAAmB,QAAuB,GAAA,EAAoC;AACrF,EAAA,MAAM,WAAW,CAAC,GAAA,CAAI,kBAAA,EAAoB,GAAA,CAAI,UAAU,CAAA,CAAE,MAAA;AAAA,IACxD,CAAC,CAAA,KAAoC,OAAA,CAAQ,CAAA,IAAK,OAAO,MAAM,QAAQ;AAAA,GACzE;AAEA,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,EAAA,GAAM,EAAE,qBAAA,EAAmD,gBAAA;AACjE,IAAA,MAAM,GAAA,GAAO,EAAE,oBAAA,EAAkD,gBAAA;AACjE,IAAA,MAAM,EAAA,GAAM,EAAE,qBAAA,EAAmD,oBAAA;AACjE,IAAA,MAAM,GAAA,GAAO,EAAE,eAAA,EAA6C,kBAAA;AAE5D,IAAA,IAAI,EAAA,KAAO,MAAA,EAAW,MAAA,CAAO,cAAA,GAAiB,OAAO,EAAE,CAAA;AACvD,IAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,MAAA,CAAO,aAAA,GAAgB,OAAO,GAAG,CAAA;AACxD,IAAA,IAAI,EAAA,KAAO,MAAA,EAAW,MAAA,CAAO,mBAAA,GAAsB,OAAO,EAAE,CAAA;AAC5D,IAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,MAAA,CAAO,kBAAA,GAAqB,OAAO,GAAG,CAAA;AAC7D,IAAA,uBAAA,CAAwB,MAAA,EAAQ,EAAE,aAAa,CAAA;AAAA,EACjD;AAEA,EAAA,MAAM,cAAc,GAAA,CAAI,YAAA;AACxB,EAAA,MAAM,QAAQ,WAAA,EAAa,KAAA;AAC3B,EAAA,IAAI,KAAA,EAAO,uBAAuB,MAAA,EAAW;AAC3C,IAAA,MAAA,CAAO,kBAAA,GAAqB,MAAA,CAAO,KAAA,CAAM,kBAAkB,CAAA;AAAA,EAC7D;AACF;AAEA,SAAS,mBAAmB,MAAA,EAA6B;AACvD,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,CAAC,QAAQ,GAAA,EAAK;AACpD,EAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AAEpB,EAAA,IAAI,IAAI,sBAAA,EAAwB,MAAA,CAAO,iBAAiB,QAAA,CAAS,GAAA,CAAI,wBAAwB,EAAE,CAAA;AAC/F,EAAA,IAAI,IAAI,qBAAA,EAAuB,MAAA,CAAO,gBAAgB,QAAA,CAAS,GAAA,CAAI,uBAAuB,EAAE,CAAA;AAC5F,EAAA,IAAI,IAAI,2BAAA,EAA6B,MAAA,CAAO,mBAAA,GAAsB,UAAA,CAAW,IAAI,2BAA2B,CAAA;AAC5G,EAAA,IAAI,IAAI,0BAAA,EAA4B,MAAA,CAAO,qBAAqB,QAAA,CAAS,GAAA,CAAI,4BAA4B,EAAE,CAAA;AAC3G,EAAA,IAAI,GAAA,CAAI,oBAAA,EAAsB,MAAA,CAAO,YAAA,GAAe,GAAA,CAAI,oBAAA;AAC1D;AAEA,SAAS,oBAAA,CAAqB,QAAuB,SAAA,EAAqC;AACxF,EAAA,IAAI,CAAC,SAAA,EAAW;AAChB,EAAA,IAAI,UAAU,cAAA,KAAmB,MAAA,SAAkB,cAAA,GAAiB,MAAA,CAAO,UAAU,cAAc,CAAA;AACnG,EAAA,IAAI,UAAU,aAAA,KAAkB,MAAA,SAAkB,aAAA,GAAgB,MAAA,CAAO,UAAU,aAAa,CAAA;AAChG,EAAA,IAAI,UAAU,mBAAA,KAAwB,MAAA,SAAkB,mBAAA,GAAsB,MAAA,CAAO,UAAU,mBAAmB,CAAA;AAClH,EAAA,IAAI,UAAU,kBAAA,KAAuB,MAAA,SAAkB,kBAAA,GAAqB,MAAA,CAAO,UAAU,kBAAkB,CAAA;AAC/G,EAAA,IAAI,SAAA,CAAU,YAAA,KAAiB,MAAA,EAAW,MAAA,CAAO,eAAe,SAAA,CAAU,YAAA;AAC5E;AAEO,SAAS,kBAAA,CAAmB,SAAiB,SAAA,EAA8C;AAChG,EAAA,MAAM,SAAS,0BAAA,EAA2B;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMC,sBAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAC7B,IAAA,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AAClC,MAAA,MAAM,MAAA,GAAS,GAAA;AACf,MAAA,aAAA,CAAc,QAAQ,MAAM,CAAA;AAC5B,MAAA,kBAAA,CAAmB,QAAQ,MAAM,CAAA;AACjC,MAAA,IAAI,OAAO,gBAAA,KAAqB,KAAA,CAAA,SAAkB,cAAA,GAAiB,MAAA,CAAO,OAAO,gBAAgB,CAAA;AACjG,MAAA,IAAI,OAAO,oBAAA,KAAyB,KAAA,CAAA,SAAkB,mBAAA,GAAsB,MAAA,CAAO,OAAO,oBAAoB,CAAA;AAC9G,MAAA,IAAI,OAAO,kBAAA,KAAuB,KAAA,CAAA,SAAkB,kBAAA,GAAqB,MAAA,CAAO,OAAO,kBAAkB,CAAA;AAAA,IAC3G;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,oBAAA,CAAqB,QAAQ,SAAS,CAAA;AACtC,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,gBAAA,CAAiB,SAAiB,QAAA,EAAqC;AACrF,EAAA,MAAM,GAAA,GAAWC,gBAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,WAAA,EAAY;AAC/C,EAAA,OAAO,gBAAA,CAAiB,QAAA,CAAS,GAAG,CAAA,GAChC,6BAAA,CAA8B,SAAS,QAAQ,CAAA,GAC/C,wBAAA,CAAyB,OAAA,EAAS,QAAQ,CAAA;AAChD;AAEO,SAAS,8BAAA,CAA+B,SAAiB,QAAA,EAAqC;AACnG,EAAA,OAAO,gBAAA,CAAiB,SAAS,QAAQ,CAAA;AAC3C;AAEO,SAAS,sBAAA,CAAuB,SAAiB,QAAA,EAAqC;AAC3F,EAAA,OAAO,wBAAA,CAAyB,SAAS,QAAQ,CAAA;AACnD;AAEO,SAAS,gBAAA,CAAiB,MAAA,EAAgB,MAAA,EAAgB,QAAA,EAAmC;AAClG,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,MAAA,EAAQ,QAAQ,CAAA;AACnD,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,YAAA,KAAiB,MAAM,CAAA,IAAK,SAAA,CAAU,CAAC,CAAA;AAC/E,IAAA,OAAO,EAAE,GAAG,OAAA,EAAS,YAAA,EAAc,MAAA,EAAO;AAAA,EAC5C;AACA,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,MAAA;AAAA,IACd,QAAA;AAAA,IACA,GAAA,EAAK,CAAA;AAAA,IACL,UAAA,EAAY,CAAA;AAAA,IACZ,SAAA,EAAW,CAAA;AAAA,IACX,eAAA,EAAiB,GAAA;AAAA,IACjB,YAAY;AAAC,GACf;AACF;AAEO,SAAS,OAAA,CACd,GAAA,EACA,UAAA,GAAgC,kBAAA,EAChC,kBAAqC,gBAAA,EAC3B;AACV,EAAA,IAAI,UAAoB,EAAC;AACzB,EAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,OAAA;AAChC,EAAA,MAAM,IAAA,GAAUA,2BAAY,GAAG,CAAA;AAC/B,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,IAAA,MAAM,QAAA,GAAgBD,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AACpC,IAAA,MAAM,IAAA,GAAUC,wBAAS,QAAQ,CAAA;AACjC,IAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,WAAA,EAAY,EAAG;AAC9B,MAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,CAAC,OAAA,KAAY,IAAA,KAAS,OAAA,IAAW,QAAA,CAAS,QAAA,CAAS,OAAO,CAAC,CAAA,EAAG;AACtF,QAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,OAAA,CAAQ,QAAA,EAAU,UAAA,EAAY,eAAe,CAAC,CAAA;AAAA,MACzE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,GAAA,GAAWD,gBAAA,CAAA,OAAA,CAAQ,IAAI,CAAA,CAAE,WAAA,EAAY;AAC3C,MAAA,IAAI,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5B,QAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,aAAA,CAAc,SAAiB,OAAA,EAA4C;AAClF,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAmBA,gBAAA,CAAA,IAAA,CAAK,SAAS,qBAAqB,CAAA;AACjF,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAM,MAAA,GAAS,EAAE,GAAG,OAAA,CAAQ,MAAA,EAAO;AACnC,IAAA,oBAAA,CAAqB,MAAA,EAAQ,QAAQ,UAAU,CAAA;AAC/C,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7B,IAAA,OAAO,mBAAsBA,cAAA,CAAA,YAAA,CAAa,UAAA,EAAY,OAAO,CAAA,EAAG,QAAQ,UAAU,CAAA;AAAA,EACpF;AACA,EAAA,OAAO,kBAAA,CAAmB,EAAA,EAAI,OAAA,CAAQ,UAAU,CAAA;AAClD;AAEA,SAAS,kBAAA,CAAmB,SAAiB,MAAA,EAAiC;AAC5E,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,SAAA,IAAa,OAAO,kBAAA,EAAoB;AACjD,IAAA,MAAM,OAAA,GAAeD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,SAAS,CAAA;AAC5C,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,OAAO,CAAA,EAAG;AAC1B,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,OAAA,CAAQ,OAAA,EAAS,OAAO,oBAAA,EAAsB,MAAA,CAAO,gBAAgB,CAAC,CAAA;AAAA,IACtF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,kBAAA,CAAmB,IAAqB,MAAA,EAAiC;AAChF,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,IAAI,EAAA,CAAG,UAAA,GAAa,MAAA,CAAO,cAAA,EAAgB;AACzC,IAAA,UAAA,CAAW,KAAK,CAAA,sBAAA,EAAyB,EAAA,CAAG,UAAU,CAAA,sBAAA,EAAyB,MAAA,CAAO,cAAc,CAAA,CAAE,CAAA;AAAA,EACxG;AACA,EAAA,IAAI,EAAA,CAAG,SAAA,GAAY,MAAA,CAAO,aAAA,EAAe;AACvC,IAAA,UAAA,CAAW,KAAK,CAAA,qBAAA,EAAwB,EAAA,CAAG,SAAS,CAAA,sBAAA,EAAyB,MAAA,CAAO,aAAa,CAAA,CAAE,CAAA;AAAA,EACrG;AACA,EAAA,IAAI,EAAA,CAAG,eAAA,GAAkB,MAAA,CAAO,mBAAA,EAAqB;AACnD,IAAA,UAAA,CAAW,KAAK,CAAA,sBAAA,EAAyB,EAAA,CAAG,eAAe,CAAA,kBAAA,EAAqB,MAAA,CAAO,mBAAmB,CAAA,CAAE,CAAA;AAAA,EAC9G;AACA,EAAA,IAAI,EAAA,CAAG,GAAA,GAAM,MAAA,CAAO,kBAAA,EAAoB;AACtC,IAAA,UAAA,CAAW,KAAK,CAAA,eAAA,EAAkB,EAAA,CAAG,GAAG,CAAA,oBAAA,EAAuB,MAAA,CAAO,kBAAkB,CAAA,CAAE,CAAA;AAAA,EAC5F;AACA,EAAA,IAAI,EAAA,CAAG,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAC5B,IAAA,UAAA,CAAW,IAAA,CAAK,GAAG,EAAA,CAAG,UAAU,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,mBAAA,CAAoB,IAAA,EAAc,OAAA,EAAiB,MAAA,EAAyC;AACnG,EAAA,MAAM,OAAA,GAAaA,cAAA,CAAA,YAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AAC7C,EAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,OAAA,EAAS,IAAI,CAAA;AAC1C,EAAA,OAAO,GAAA,CAAI,GAAA,CAAI,CAAC,EAAA,KAAO;AACrB,IAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,EAAA,EAAI,MAAM,CAAA;AAChD,IAAA,OAAO;AAAA,MACL,GAAG,EAAA;AAAA,MACH,SAAcD,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,MACxD,MAAA,EAAQ,UAAA,CAAW,MAAA,KAAW,CAAA,GAAI,MAAA,GAAS,MAAA;AAAA,MAC3C;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,sBAAA,CACP,OAAA,EACA,UAAA,EACA,MAAA,EACmB;AACnB,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA,CAAE,MAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAA,GAAS,SAAA;AACnC,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,UAAA,CAAW,MAAA,EAAQ,CAAC,CAAA;AAC/E,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,YAAA,KAAiB,QAAA,GAAW,cAAc,CAAA,GAAI,IAAA;AAErE,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,UAAA;AAAA,IACA,gBAAgB,OAAA,CAAQ,MAAA;AAAA,IACxB,SAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,iBAAA,CAAkB,OAAA,GAA8B,EAAC,EAAsB;AACrF,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,EAAS,OAAO,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,OAAA,EAAS,MAAM,CAAA;AACnD,EAAA,MAAM,UAA4B,EAAC;AAEnC,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,KAAK,GAAG,mBAAA,CAAoB,IAAA,EAAM,OAAA,EAAS,MAAM,CAAC,CAAA;AAAA,IAC5D,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,sBAAA,CAAuB,OAAA,EAAS,QAAA,CAAS,MAAA,EAAQ,MAAM,CAAA;AAChE;ACnTO,SAAS,WAAA,CACd,GAAA,EACA,QAAA,GAAqB,IACrB,WAAA,GAAwB;AAAA,EACtB,cAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EACU;AACV,EAAA,IAAI;AACF,IAAA,IAAI,CAAIE,cAAA,CAAA,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,QAAA;AAChC,IAAA,MAAM,KAAA,GAAWA,2BAAY,GAAG,CAAA;AAChC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,QAAA,GAAgBC,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AACpC,MAAA,IAAI;AACF,QAAA,IAAOD,cAAA,CAAA,QAAA,CAAS,QAAQ,CAAA,CAAE,WAAA,EAAY,EAAG;AACvC,UAAA,IAAI,CAAC,WAAA,CAAY,QAAA,CAAS,IAAI,KAAK,CAAC,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,IAAK,CAAC,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC1F,YAAA,WAAA,CAAY,QAAA,EAAU,UAAU,WAAW,CAAA;AAAA,UAC7C;AAAA,QACF,CAAA,MAAA,IAAW,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AAC/B,UAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,QACxB;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,QAAA;AACT;;;ACxBO,SAAS,yBAAyB,OAAA,EAGvC;AACA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,6BAA6B,CAAA;AACzD,EAAA,IAAI,CAAC,OAAO,OAAO,EAAE,aAAa,EAAC,EAAG,MAAM,OAAA,EAAQ;AAEpD,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,IAAI,CAAA;AACrC,EAAA,MAAM,cAAmC,EAAC;AAE1C,EAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAC1B,MAAA,IAAI,GAAA,GAAM,MAAM,KAAA,CAAM,CAAC,EAAE,IAAA,CAAK,GAAG,EAAE,IAAA,EAAK;AACxC,MAAA,IAAK,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,IAAK,IAAI,QAAA,CAAS,GAAG,CAAA,IAAO,GAAA,CAAI,WAAW,GAAG,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAI;AAC5F,QAAA,GAAA,GAAM,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,GAAA,CAAI,SAAS,CAAC,CAAA;AAAA,MACvC;AACA,MAAA,WAAA,CAAY,GAAG,CAAA,GAAI,GAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,OAAA,CAAQ,SAAA,CAAU,KAAA,CAAM,CAAC,EAAE,MAAM,CAAA;AAC9C,EAAA,OAAO,EAAE,aAAa,IAAA,EAAK;AAC7B;AAEO,SAAS,oBAAoB,IAAA,EAAwB;AAC1D,EAAA,MAAM,YAAA,GAAe,oCAAA;AACrB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,KAAA;AACJ,EAAA,OAAA,CAAQ,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,IAAI,OAAO,IAAA,EAAM;AACjD,IAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,kBAAA,CAAmB,SAAiB,UAAA,EAA+B;AACjF,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,aAAkBE,gBAAA,CAAA,UAAA,CAAW,UAAU,IAAI,UAAA,GAAkBA,gBAAA,CAAA,IAAA,CAAK,SAAS,UAAU,CAAA;AAC3F,IAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,UAAU,CAAA,SAAU,EAAC;AACxC,IAAA,OAAUA,cAAA,CAAA,QAAA,CAAS,UAAU,CAAA,CAAE,WAAA,KAAgB,WAAA,CAAY,UAAU,CAAA,GAAI,CAAC,UAAU,CAAA;AAAA,EACtF;AACA,EAAA,MAAM,UAAA,GAAa;AAAA,IACZD,gBAAA,CAAA,IAAA,CAAK,SAAS,SAAS,CAAA;AAAA,IACvBA,gBAAA,CAAA,IAAA,CAAK,SAAS,UAAU,CAAA;AAAA,IACxBA,gBAAA,CAAA,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,IACrBA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,UAAA,EAAY,SAAS,CAAA;AAAA,IACnCA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,UAAA,EAAY,UAAU,CAAA;AAAA,IACpCA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,UAAA,EAAY,OAAO;AAAA,GACxC;AACA,EAAA,OAAO,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAASC,cAAA,CAAA,UAAA,CAAW,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,KAAM,WAAA,CAAY,CAAC,CAAC,CAAA;AACjF;AAEO,SAAS,sBAAA,CACd,OAAA,EACA,QAAA,EACA,EAAA,EACA,YAAA,EACQ;AACR,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAYD,4BAAW,YAAY,CAAA,GAAI,YAAA,GAAoBA,gBAAA,CAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACvF;AACA,EAAA,MAAM,OAAA,GAAeA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,UAAU,CAAA;AACtD,EAAA,MAAM,iBAAA,GAAyBA,sBAAK,OAAA,EAAS,UAAA,EAAY,GAAG,EAAA,CAAG,WAAA,EAAa,CAAA,QAAA,CAAU,CAAA;AACtF,EAAA,MAAM,gBAAqBA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,GAAG,EAAA,CAAG,WAAA,EAAa,CAAA,QAAA,CAAU,CAAA;AACtE,EAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,iBAAiB,CAAA,EAAG,OAAO,iBAAA;AAC7C,EAAA,IAAOA,cAAA,CAAA,UAAA,CAAW,aAAa,CAAA,EAAG,OAAO,aAAA;AACzC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,QAAA,CAAS,UAAU,IAAI,UAAA,GAAa,EAAA;AAC5D,EAAA,OAAYD,sBAAK,OAAA,EAAS,MAAA,EAAQ,GAAG,EAAA,CAAG,WAAA,EAAa,CAAA,QAAA,CAAU,CAAA;AACjE;AAEO,SAAS,uBAAA,CACd,OAAA,EACA,QAAA,EACA,EAAA,EACA,SACA,aAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,CAAA,gFAAA,CAAA;AAAA,IACA,CAAA,kDAAA,CAAA;AAAA,IACA,CAAA,UAAA,EAAkBA,0BAAS,OAAA,EAAS,QAAQ,EAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA,CAAA;AAAA,IACjE,uBAAuB,EAAE,CAAA,CAAA;AAAA,IACzB,CAAA,cAAA,EAAc,WAAW,OAAO,CAAA,CAAA;AAAA,IAChC,CAAA,gFAAA,CAAA;AAAA,IACA,CAAA,gFAAA,CAAA;AAAA,IACA,EAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACX,EAAA,OAAO,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA;AAC/C;AAEA,SAAS,eAAe,aAAA,EAAiC;AACvD,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,iEAAiE,CAAA;AAC7F,IAAA,IAAI,OAAA,WAAkB,OAAA,CAAQ,MAAA;AAAA,EAChC;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,sBAAA,CACd,OAAA,GAAoC,EAAC,EACZ;AACzB,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,MAAM,WAA+B,EAAC;AACtC,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,OAAA,EAAS,OAAA,CAAQ,UAAU,CAAA;AAElE,EAAA,KAAA,MAAW,YAAY,WAAA,EAAa;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAaC,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AACjD,MAAA,MAAM,EAAE,WAAA,EAAa,IAAA,EAAK,GAAI,yBAAyB,OAAO,CAAA;AAC9D,MAAA,MAAM,aAAA,GAAgB,oBAAoB,IAAI,CAAA;AAC9C,MAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAEhC,MAAA,MAAM,KAAK,WAAA,CAAY,EAAA,IAAWD,0BAAS,QAAA,EAAeA,gBAAA,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC3E,MAAA,MAAM,aAAa,sBAAA,CAAuB,OAAA,EAAS,UAAU,EAAA,EAAI,WAAA,CAAY,uBAAuB,CAAC,CAAA;AACrG,MAAGC,yBAAeD,gBAAA,CAAA,OAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAE1D,MAAA,MAAM,cAAc,uBAAA,CAAwB,OAAA,EAAS,UAAU,EAAA,EAAI,WAAA,CAAY,SAAS,aAAa,CAAA;AACrG,MAAGC,cAAA,CAAA,aAAA,CAAc,UAAA,EAAY,WAAA,EAAa,OAAO,CAAA;AAEjD,MAAA,MAAM,aAAA,GAAgB,eAAe,aAAa,CAAA;AAClD,MAAA,cAAA,IAAkB,aAAA;AAClB,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,YAAiBD,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,QAC/D,YAAiBA,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,UAAU,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,QACjE,WAAA,EAAa,EAAA;AAAA,QACb;AAAA,OACD,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,cAAA,EAAe;AACnD;AAEO,SAAS,kBAAA,CACd,OAAA,GAAoC,EAAC,EACb;AACxB,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,OAAA,EAAS,OAAA,CAAQ,UAAU,CAAA;AAClE,EAAA,MAAM,iBAA2B,EAAC;AAClC,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,EAAA,KAAA,MAAW,YAAY,WAAA,EAAa;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAaC,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AACjD,MAAA,MAAM,EAAE,WAAA,EAAa,IAAA,EAAK,GAAI,yBAAyB,OAAO,CAAA;AAC9D,MAAA,MAAM,aAAA,GAAgB,oBAAoB,IAAI,CAAA;AAC9C,MAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAEhC,MAAA,aAAA,EAAA;AACA,MAAA,MAAM,KAAK,WAAA,CAAY,EAAA,IAAWD,0BAAS,QAAA,EAAeA,gBAAA,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC3E,MAAA,MAAM,aAAa,sBAAA,CAAuB,OAAA,EAAS,UAAU,EAAA,EAAI,WAAA,CAAY,uBAAuB,CAAC,CAAA;AACrG,MAAA,MAAM,YAAiBA,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,UAAU,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAEvE,MAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,QAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,kBAAkB,uBAAA,CAAwB,OAAA,EAAS,UAAU,EAAA,EAAI,WAAA,CAAY,SAAS,aAAa,CAAA;AACzG,MAAA,MAAM,aAAA,GAAmBA,cAAA,CAAA,YAAA,CAAa,UAAA,EAAY,OAAO,CAAA;AACzD,MAAA,IAAI,aAAA,CAAc,QAAQ,OAAA,EAAS,IAAI,MAAM,eAAA,CAAgB,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA,EAAG;AACnF,QAAA,cAAA,CAAe,KAAK,SAAS,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,YAAA,CAAa,MAAA,KAAW,CAAA,IAAK,eAAe,MAAA,KAAW,CAAA;AAAA,IAC/D,cAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC7LO,IAAM,kBAAN,MAA4C;AAAA,EACxC,SAAA,GAAY,UAAA;AAAA,EAErB,qBAAA,CAAsB,SAAiB,QAAA,EAA0B;AAE/D,IAAA,MAAM,WAAA,GAAmBC,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,UAAA,EAAY,WAAW,QAAQ,CAAA;AACtE,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,WAAW,CAAA,EAAG,OAAO,WAAA;AAGvC,IAAA,MAAM,kBAAuBD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,UAAU,QAAQ,CAAA;AACjF,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,eAAe,CAAA,EAAG,OAAO,eAAA;AAG3C,IAAA,MAAM,qBAA0BD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,aAAa,QAAQ,CAAA;AACvF,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,kBAAkB,CAAA,EAAG,OAAO,kBAAA;AAG9C,IAAA,OAAO,eAAA;AAAA,EACT;AAAA,EAEA,eAAe,OAAA,EAKJ;AACT,IAAA,MAAM,YAAY,IAAA,CAAK,qBAAA,CAAsB,OAAA,CAAQ,OAAA,EAAS,QAAQ,QAAQ,CAAA;AAC9E,IAAA,IAAI,CAAIA,cAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7B,MAAGA,cAAA,CAAA,SAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,OAAA,CAAQ,OAAA,EAAQ;AACrC,IAAA,IAAI,CAAC,OAAA,CAAQ,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,EAAG;AAClC,MAAA,OAAA,CAAQ,EAAA,GAAK,CAAA,IAAA,EAAO,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,IAChC;AACA,IAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACrB,MAAA,OAAA,CAAQ,WAAW,OAAA,CAAQ,QAAA;AAAA,IAC7B;AACA,IAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACtB,MAAA,OAAA,CAAQ,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAC7C;AAEA,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,KAAW,MAAA,GAAS,cAAA,GAAiB,cAAA;AAC9D,IAAA,MAAM,QAAA,GAAgBD,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAE9C,IAAA,MAAM,UACJ,OAAA,CAAQ,MAAA,KAAW,SACf,IAAA,CAAK,SAAA,CAAU,SAAS,IAAA,EAAM,CAAC,CAAA,GAC/BP,sBAAAA,CAAK,KAAK,OAAA,EAAS,EAAE,QAAQ,CAAA,EAAG,SAAA,EAAW,IAAI,CAAA;AAErD,IAAGQ,cAAA,CAAA,aAAA,CAAc,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAC3C,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,YAAY,kBAAA,EAAmD;AAC7D,IAAA,IAAI,CAAIA,cAAA,CAAA,UAAA,CAAW,kBAAkB,CAAA,EAAG,OAAO,IAAA;AAE/C,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,cAAA;AAAA,MACA,aAAA;AAAA,MACA,sBAAA;AAAA,MACA,qBAAA;AAAA,MACA,eAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AACjC,MAAA,MAAM,QAAA,GAAgBD,gBAAA,CAAA,IAAA,CAAK,kBAAA,EAAoB,IAAI,CAAA;AACnD,MAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,QAAA,IAAI;AACF,UAAA,MAAM,MAASA,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA,CAAE,OAAA,CAAQ,WAAW,EAAE,CAAA;AACpE,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAKR,sBAAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AACxE,UAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,EAAA,IAAM,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA,CAAE,UAAA,CAAW,MAAM,CAAA,EAAG;AAC7F,YAAA,OAAO,MAAA;AAAA,UACT;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,kBAAkB,kBAAA,EAAiD;AACjE,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,WAAqB,EAAC;AAE5B,IAAA,IAAI,CAAIQ,cAAA,CAAA,UAAA,CAAW,kBAAkB,CAAA,EAAG;AACtC,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,CAAC,CAAA,6CAAA,EAAgD,kBAAkB,CAAA,CAAE,CAAA;AAAA,QAC7E,UAAU;AAAC,OACb;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAgBD,0BAAS,kBAAkB,CAAA;AAEjD,IAAA,MAAM,YAAA,GAAoBA,gBAAA,CAAA,IAAA,CAAK,kBAAA,EAAoB,aAAa,CAAA;AAChE,IAAA,MAAM,QAAA,GAAgBA,gBAAA,CAAA,IAAA,CAAK,kBAAA,EAAoB,SAAS,CAAA;AACxD,IAAA,MAAM,UAAA,GAAkBA,gBAAA,CAAA,IAAA,CAAK,kBAAA,EAAoB,WAAW,CAAA;AAC5D,IAAA,MAAM,SAAA,GAAiBA,gBAAA,CAAA,IAAA,CAAK,kBAAA,EAAoB,UAAU,CAAA;AAE1D,IAAA,IAAI,OAAA,GAAyB,UAAA;AAC7B,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,UAAaA,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA,CAAE,OAAA,CAAQ,WAAW,EAAE,CAAA;AACxE,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,6BAA6B,CAAA;AACzD,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,QAAA,GAAWR,sBAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACnC,UAAA,IAAI,QAAA,IAAY,QAAA,CAAS,OAAA,IAAW,CAAC,OAAA,EAAS,UAAA,EAAY,UAAU,CAAA,CAAE,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG;AAChG,YAAA,OAAA,GAAU,QAAA,CAAS,OAAA;AAAA,UACrB;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAI,CAAIQ,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,0CAAA,EAA6C,kBAAkB,CAAA,CAAA,CAAG,CAAA;AAAA,IAChF,CAAA,MAAO;AACL,MAAA,IAAI;AACF,QAAA,MAAM,UAAaA,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA,CAAE,OAAA,CAAQ,WAAW,EAAE,CAAA;AACxE,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,6BAA6B,CAAA;AACzD,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,QAAA,GAAWR,sBAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACnC,UAAA,IAAI,YAAY,QAAA,CAAS,mBAAmB,KAAK,QAAA,CAAS,mBAAmB,MAAM,SAAA,EAAW;AAC5F,YAAA,MAAA,CAAO,IAAA;AAAA,cACL,CAAA,gDAAA,EAAmD,QAAA,CAAS,mBAAmB,CAAC,CAAA,gDAAA;AAAA,aAClF;AAAA,UACF;AACA,UAAA,IAAI,QAAA,IAAY,QAAA,CAAS,mBAAmB,CAAA,KAAM,SAAA,EAAW;AAC3D,YAAA,MAAM,MAAA,GAAS,oBAAoB,OAAO,CAAA;AAC1C,YAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,cAAA,MAAA,CAAO,IAAA;AAAA,gBACL,2BAA2B,kBAAkB,CAAA,kIAAA;AAAA,eAC/C;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,OAAA,GAAiC,IAAA;AAErC,IAAA,IAAI,YAAY,OAAA,EAAS;AACvB,MAAA,OAAA,GAAU,IAAA,CAAK,YAAY,kBAAkB,CAAA;AAC7C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,WAAA,GAAmBO,gBAAA,CAAA,IAAA,CAAK,oBAAoB,cAAc,CAAA;AAAA,MAC5D;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,YAAY,CAAA,EAAG;AAChC,QAAA,QAAA,CAAS,KAAK,CAAA,sDAAA,CAAwD,CAAA;AAAA,MACxE;AACA,MAAA,IAAI,CAAIA,cAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7B,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,2CAAA,EAA8C,kBAAkB,CAAA,CAAA,CAAG,CAAA;AAAA,MACjF;AAEA,MAAA,OAAA,GAAU,IAAA,CAAK,YAAY,kBAAkB,CAAA;AAC7C,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,+FAA4F,kBAAkB,CAAA,CAAA;AAAA,SAChH;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAI,CAAC,QAAQ,QAAA,IAAY,CAAC,MAAM,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA,EAAG;AACtE,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,OAAA,CAAQ,EAAE,CAAA,oDAAA,CAAmD,CAAA;AAAA,QAC1F;AACA,QAAA,WAAA,GAAmBD,gBAAA,CAAA,IAAA,CAAK,oBAAoB,cAAc,CAAA;AAAA,MAC5D;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAA8B;AAAA,MAClC,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,QAAA;AAAA,MACA,SAAA,EAAW,kBAAA;AAAA,MACX,OAAA;AAAA,MACA,YAAA,EAAiBC,cAAA,CAAA,UAAA,CAAW,YAAY,CAAA,GAAI,YAAA,GAAe,MAAA;AAAA,MAC3D,QAAA,EAAaA,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,GAAI,QAAA,GAAW,MAAA;AAAA,MAC/C,UAAA,EAAeA,cAAA,CAAA,UAAA,CAAW,UAAU,CAAA,GAAI,UAAA,GAAa,MAAA;AAAA,MACrD,SAAA,EAAcA,cAAA,CAAA,UAAA,CAAW,SAAS,CAAA,GAAI,SAAA,GAAY,MAAA;AAAA,MAClD,WAAA;AAAA,MACA,SAAS,OAAA,IAAW;AAAA,KACtB;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB,MAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;ACpMO,IAAM,iBAAN,MAA2C;AAAA,EACvC,SAAA,GAAY,SAAA;AAAA,EAErB,qBAAA,CAAsB,SAAiB,QAAA,EAA0B;AAE/D,IAAA,MAAM,WAAA,GAAmBC,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,QAAQ,CAAA;AACxD,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,WAAW,CAAA,EAAG,OAAO,WAAA;AAGvC,IAAA,MAAM,kBAAuBD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,UAAU,QAAQ,CAAA;AACjF,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,eAAe,CAAA,EAAG,OAAO,eAAA;AAG3C,IAAA,MAAM,qBAA0BD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,aAAa,QAAQ,CAAA;AACvF,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,kBAAkB,CAAA,EAAG,OAAO,kBAAA;AAG9C,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,eAAe,OAAA,EAKJ;AACT,IAAA,MAAM,YAAY,IAAA,CAAK,qBAAA,CAAsB,OAAA,CAAQ,OAAA,EAAS,QAAQ,QAAQ,CAAA;AAC9E,IAAA,IAAI,CAAIA,cAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7B,MAAGA,cAAA,CAAA,SAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,OAAA,CAAQ,OAAA,EAAQ;AACrC,IAAA,IAAI,CAAC,OAAA,CAAQ,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,EAAG;AAClC,MAAA,OAAA,CAAQ,EAAA,GAAK,CAAA,IAAA,EAAO,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,IAChC;AACA,IAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACrB,MAAA,OAAA,CAAQ,WAAW,OAAA,CAAQ,QAAA;AAAA,IAC7B;AACA,IAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACtB,MAAA,OAAA,CAAQ,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAC7C;AAEA,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,KAAW,MAAA,GAAS,cAAA,GAAiB,cAAA;AAC9D,IAAA,MAAM,QAAA,GAAgBD,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAE9C,IAAA,MAAM,UACJ,OAAA,CAAQ,MAAA,KAAW,SACf,IAAA,CAAK,SAAA,CAAU,SAAS,IAAA,EAAM,CAAC,CAAA,GAC/BT,sBAAAA,CAAK,KAAK,OAAA,EAAS,EAAE,QAAQ,CAAA,EAAG,SAAA,EAAW,IAAI,CAAA;AAErD,IAAGU,cAAA,CAAA,aAAA,CAAc,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAG3C,IAAA,MAAM,gBAAA,GAAwBD,gBAAA,CAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,YAAY,QAAQ,CAAA;AACxE,IAAA,IAAOC,0BAAgBD,gBAAA,CAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,UAAU,CAAC,CAAA,EAAG;AACzD,MAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,gBAAgB,CAAA,EAAG;AACpC,QAAGA,cAAA,CAAA,SAAA,CAAU,gBAAA,EAAkB,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,MACpD;AACA,MAAGA,cAAA,CAAA,aAAA,CAAmBD,sBAAK,gBAAA,EAAkB,CAAA,EAAG,QAAQ,QAAQ,CAAA,aAAA,CAAe,CAAA,EAAG,OAAA,EAAS,OAAO,CAAA;AAAA,IACpG;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,YAAY,kBAAA,EAAmD;AAC7D,IAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,kBAAkB,CAAA,EAAG,OAAO,IAAA;AAE/C,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,cAAA;AAAA,MACA,aAAA;AAAA,MACA,sBAAA;AAAA,MACA,qBAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AACjC,MAAA,MAAM,QAAA,GAAgBD,gBAAA,CAAA,IAAA,CAAK,kBAAA,EAAoB,IAAI,CAAA;AACnD,MAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,QAAA,IAAI;AACF,UAAA,MAAM,MAASA,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA,CAAE,OAAA,CAAQ,WAAW,EAAE,CAAA;AACpE,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAKV,sBAAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AACxE,UAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,EAAA,IAAM,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA,CAAE,UAAA,CAAW,MAAM,CAAA,EAAG;AAC7F,YAAA,OAAO,MAAA;AAAA,UACT;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,kBAAkB,kBAAA,EAAiD;AACjE,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,WAAqB,EAAC;AAE5B,IAAA,IAAI,CAAIU,cAAA,CAAA,UAAA,CAAW,kBAAkB,CAAA,EAAG;AACtC,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,CAAC,CAAA,6CAAA,EAAgD,kBAAkB,CAAA,CAAE,CAAA;AAAA,QAC7E,UAAU;AAAC,OACb;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAgBD,0BAAS,kBAAkB,CAAA;AAEjD,IAAA,MAAM,QAAA,GAAgBA,gBAAA,CAAA,IAAA,CAAK,kBAAA,EAAoB,SAAS,CAAA;AACxD,IAAA,MAAM,QAAA,GAAgBA,gBAAA,CAAA,IAAA,CAAK,kBAAA,EAAoB,SAAS,CAAA;AACxD,IAAA,MAAM,SAAA,GAAiBA,gBAAA,CAAA,IAAA,CAAK,kBAAA,EAAoB,UAAU,CAAA;AAE1D,IAAA,IAAI,OAAA,GAAyB,UAAA;AAC7B,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,UAAaA,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA,CAAE,OAAA,CAAQ,WAAW,EAAE,CAAA;AACxE,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,6BAA6B,CAAA;AACzD,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,QAAA,GAAWV,sBAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACnC,UAAA,IAAI,QAAA,IAAY,QAAA,CAAS,OAAA,IAAW,CAAC,OAAA,EAAS,UAAA,EAAY,UAAU,CAAA,CAAE,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG;AAChG,YAAA,OAAA,GAAU,QAAA,CAAS,OAAA;AAAA,UACrB;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAI,CAAIU,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,+DAAA,EAA+D,kBAAkB,CAAA,CAAA,CAAG,CAAA;AAAA,IAClG,CAAA,MAAO;AACL,MAAA,IAAI;AACF,QAAA,MAAM,UAAaA,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA,CAAE,OAAA,CAAQ,WAAW,EAAE,CAAA;AACxE,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,6BAA6B,CAAA;AACzD,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,QAAA,GAAWV,sBAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACnC,UAAA,IAAI,YAAY,QAAA,CAAS,mBAAmB,KAAK,QAAA,CAAS,mBAAmB,MAAM,SAAA,EAAW;AAC5F,YAAA,MAAA,CAAO,IAAA;AAAA,cACL,CAAA,gDAAA,EAAmD,QAAA,CAAS,mBAAmB,CAAC,CAAA,gDAAA;AAAA,aAClF;AAAA,UACF;AACA,UAAA,IAAI,QAAA,IAAY,QAAA,CAAS,mBAAmB,CAAA,KAAM,SAAA,EAAW;AAC3D,YAAA,MAAM,MAAA,GAAS,oBAAoB,OAAO,CAAA;AAC1C,YAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,cAAA,MAAA,CAAO,IAAA;AAAA,gBACL,2BAA2B,kBAAkB,CAAA,kIAAA;AAAA,eAC/C;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,OAAA,GAAiC,IAAA;AAErC,IAAA,IAAI,YAAY,OAAA,EAAS;AACvB,MAAA,OAAA,GAAU,IAAA,CAAK,YAAY,kBAAkB,CAAA;AAC7C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,WAAA,GAAmBS,gBAAA,CAAA,IAAA,CAAK,oBAAoB,cAAc,CAAA;AAAA,MAC5D;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7B,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,qDAAA,EAAwD,kBAAkB,CAAA,CAAA,CAAG,CAAA;AAAA,MAC3F;AACA,MAAA,IAAI,CAAIA,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,QAAA,QAAA,CAAS,KAAK,CAAA,kEAAA,CAAoE,CAAA;AAAA,MACpF;AAEA,MAAA,OAAA,GAAU,IAAA,CAAK,YAAY,kBAAkB,CAAA;AAC7C,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,+FAA4F,kBAAkB,CAAA,CAAA;AAAA,SAChH;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAI,CAAC,QAAQ,QAAA,IAAY,CAAC,MAAM,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA,EAAG;AACtE,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,OAAA,CAAQ,EAAE,CAAA,oDAAA,CAAmD,CAAA;AAAA,QAC1F;AACA,QAAA,WAAA,GAAmBD,gBAAA,CAAA,IAAA,CAAK,oBAAoB,cAAc,CAAA;AAAA,MAC5D;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAA8B;AAAA,MAClC,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,QAAA;AAAA,MACA,SAAA,EAAW,kBAAA;AAAA,MACX,OAAA;AAAA,MACA,QAAA,EAAaC,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,GAAI,QAAA,GAAW,MAAA;AAAA,MAC/C,UAAA,EAAeA,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,GAAI,QAAA,GAAW,MAAA;AAAA,MACjD,SAAA,EAAcA,cAAA,CAAA,UAAA,CAAW,SAAS,CAAA,GAAI,SAAA,GAAY,MAAA;AAAA,MAClD,WAAA;AAAA,MACA,SAAS,OAAA,IAAW;AAAA,KACtB;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB,MAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AC7LO,SAAS,sBAAsB,OAAA,EAA+B;AACnE,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,gBAAA,CAAiB,OAAO,CAAA;AAEhD,EAAA,IAAI,WAAA,IAAe,KAAA,CAAM,OAAA,CAAQ,WAAA,CAAY,KAAK,CAAA,EAAG;AACnD,IAAA,KAAA,MAAW,CAAA,IAAK,YAAY,KAAA,EAAgB;AAC1C,MAAA,IAAI,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,IAAY,EAAE,EAAA,EAAI;AACtC,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,EAAA,EAAI,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,UACf,OAAO,CAAA,CAAE,KAAA,GAAQ,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA,GAAI,MAAA;AAAA,UACnC,MAAA,EAAQ,EAAE,MAAA,GAAS,MAAA,CAAO,EAAE,MAAM,CAAA,CAAE,aAAY,GAAI;AAAA,SACrD,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,gDAAgD,CAAA;AAC5E,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA,CAAE,aAAY,KAAM,GAAA;AAC1C,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA,IAAA,EAAO,MAAA,CAAO,KAAK,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAChE,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,EAAA,EAAI,MAAA;AAAA,UACJ,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,UACd,MAAA,EAAQ,SAAS,WAAA,GAAc;AAAA,SAChC,CAAA;AACD,QAAA,KAAA,EAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,wBAAA,CACd,MACA,KAAA,EACQ;AAER,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,SAAS,CAAA,EAAG;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,mBAAmB,IAAA,CAAK,KAAA;AAAA,IAC5B;AAAA,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,CAAA,IAAA,EAAO,KAAA,CAAM,OAAO,QAAQ,KAAA,CAAM,IAAI,CAAA,GAAA,EAAM,KAAA,CAAM,MAAM,CAAA,GAAA,EAAM,KAAA,CAAM,WAAW,CAAA,GAAA,EAAM,MAAM,SAAS,CAAA;AAAA,CAAA;AAEnH,EAAA,IAAI,gBAAA,IAAoB,gBAAA,CAAiB,KAAA,KAAU,MAAA,EAAW;AAC5D,IAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,KAAA,GAAQ,gBAAA,CAAiB,CAAC,CAAA,CAAE,MAAA;AAC/D,IAAA,OAAO,IAAA,CAAK,UAAU,CAAA,EAAG,SAAS,IAAI,MAAA,GAAS,IAAA,CAAK,UAAU,SAAS,CAAA;AAAA,EACzE;AAGA,EAAA,MAAM,UAAA,GAAa;;AAAA;;AAAA;AAAA;AAAA,EAA6K,MAAM,CAAA,CAAA;AACtM,EAAA,OAAO,IAAA,GAAO,UAAA;AAChB;AA+BO,SAAS,sBAAsB,WAAA,EAAuC;AAC3E,EAAA,MAAM,WAAiC,EAAC;AACxC,EAAA,MAAM,gBAA2C,EAAC;AAGlD,EAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,KAAA,CAAM,gGAAgG,CAAA;AACzI,EAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,KAAA,CAAM,6FAA6F,CAAA;AAGtI,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAC,CAAA,CAAE,MAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAK,CAAE,UAAA,CAAW,GAAG,CAAC,CAAA;AACpF,IAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAE3B,MAAA,IAAI,oBAAoB,IAAA,CAAK,GAAG,KAAK,kBAAA,CAAmB,IAAA,CAAK,GAAG,CAAA,EAAG;AACnE,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAC7D,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA,CAAE,QAAQ,IAAA,EAAM,EAAE,EAAE,IAAA,EAAK;AAC7C,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY;AAC/D,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,SAAA,EAAW;AAC1B,MAAA,IAAI,SAAA,KAAc,UAAA,IAAc,SAAA,KAAc,YAAA,EAAc;AAC1D,QAAA,aAAA,CAAc,IAAA,CAAK,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,WAAwC,QAAA,EAAU,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA;AAAA,MACrG;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAC,CAAA,CAAE,MAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAK,CAAE,UAAA,CAAW,GAAG,CAAC,CAAA;AACpF,IAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,MAAA,IAAI,oBAAoB,IAAA,CAAK,GAAG,KAAK,kBAAA,CAAmB,IAAA,CAAK,GAAG,CAAA,EAAG;AACnE,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAC7D,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA,CAAE,QAAQ,IAAA,EAAM,EAAE,EAAE,IAAA,EAAK;AAC7C,MAAA,MAAM,MAAA,GAAS,KAAK,CAAC,CAAA,CAAE,QAAQ,IAAA,EAAM,EAAE,EAAE,IAAA,EAAK;AAC9C,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAA,EAAQ;AACvB,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,EAAA,EAAI,KAAA,EAAO,WAAW,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,CAAC,GAAG,KAAA,EAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAI,CAAA;AAAA,IACzF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,UAAU,aAAA,EAAc;AACnC;AAMA,SAAS,4BAAA,CACP,OAAA,EACA,IAAA,EACA,QAAA,EACA,QACA,IAAA,EACQ;AACR,EAAA,MAAM,UAAA,GAAkBC,sBAAK,OAAA,EAAS,IAAA,CAAK,WAAW,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,GAAA,CAAK,CAAA;AACrE,EAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,UAAU,CAAA,EAAG,OAAO,UAAA;AAEtC,EAAGA,yBAAeD,gBAAA,CAAA,OAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAE1D,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,uBAAA,EAAyB,aAAA;AAAA,IACzB,oBAAA,EAAsB,UAAA;AAAA,IACtB,iBAAA,EAAmB,OAAA;AAAA,IACnB,yBAAA,EAA2B,eAAA;AAAA,IAC3B,mBAAA,EAAqB,SAAA;AAAA,IACrB,wBAAA,EAA0B,sBAAA;AAAA,IAC1B,eAAA,EAAiB;AAAA,GACnB;AACA,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,IAAK,UAAA;AAChD,EAAA,MAAM,WAAA,GAAc,CAAA,IAAA,EAAO,IAAA,CAAK,EAAE;AAAA,MAAA,EAAW,YAAY;AAAA;AAAA;AAAA,CAAA;AACzD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,EAAA;AACjC,EAAA,MAAM,WAAA,GAAc,iBAAiB,IAAI,CAAA,GAAA,EAAM,MAAM,CAAA,6BAAA,EAA6B,QAAQ,MAAM,QAAQ,CAAA;AAAA,CAAA;AACxG,EAAA,MAAM,IAAA,GAAO,CAAA,EAAA,EAAK,IAAA,CAAK,EAAE,KAAK,KAAK;;AAAA;;AAAA;AAAA;AAAA,EAA6K,WAAW,CAAA,CAAA;AAE3N,EAAGC,6BAAc,UAAA,EAAY,CAAA;AAAA,EAAQ,WAAW,CAAA;AAAA,EAAQ,IAAI,IAAI,OAAO,CAAA;AACvE,EAAA,OAAO,UAAA;AACT;AAEO,SAAS,sBAAA,CAAuB,SAAiB,QAAA,EAAiC;AACvF,EAAA,MAAM,aAAA,GAAgB;AAAA,IACfD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,UAAU,QAAQ,CAAA;AAAA,IACpDA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,QAAQ,CAAA;AAAA,IAC/BA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,UAAA,EAAY,SAAA,EAAW,QAAQ,CAAA;AAAA,IAC7CA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,aAAa,QAAQ;AAAA,GAC9D;AAEA,EAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC/B,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,GAAA;AAAA,EACjC;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,mBAAmB,OAAA,EAAsD;AACvF,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AACzB,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,4BAAA;AACjC,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAA,iBAAQ,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AAClE,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,KAAgB,KAAA;AAE5C,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,0BAAoC,EAAC;AAC3C,EAAA,MAAM,+BAAyC,EAAC;AAGhD,EAAA,MAAM,SAAA,GAAY,sBAAA,CAAuB,OAAA,EAAS,QAAQ,CAAA;AAC1D,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,QAAA;AAAA,MACA,gBAAgB,EAAC;AAAA,MACjB,cAAc,EAAC;AAAA,MACf,wBAAwB,EAAC;AAAA,MACzB,yBAAyB,EAAC;AAAA,MAC1B,8BAA8B,EAAC;AAAA,MAC/B,QAAA,EAAU,KAAA;AAAA,MACV,MAAA,EAAQ,CAAC,CAAA,wDAAA,EAAwD,QAAQ,CAAA,EAAA,CAAI;AAAA,KAC/E;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAiBD,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AACjD,EAAA,MAAM,WAAyB,EAAC;AAChC,EAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC5B,IAAA,MAAM,YAAA,GAAkBA,cAAA,CAAA,YAAA,CAAa,SAAA,EAAW,OAAO,CAAA;AACvD,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,qBAAA,CAAsB,YAAY,CAAC,CAAA;AAAA,EACtD;AAEA,EAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AACvF,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAGrF,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,QAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA;AAAA,MACA,wBAAwB,EAAC;AAAA,MACzB,yBAAyB,EAAC;AAAA,MAC1B,8BAA8B,EAAC;AAAA,MAC/B,QAAA,EAAU,KAAA;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,mCAAmC,QAAQ,CAAA,iBAAA,EAAoB,YAAA,CAAa,MAAM,oCAAoC,YAAA,CAAa,IAAA;AAAA,UACjI;AAAA,SACD,CAAA,4GAAA;AAAA;AACH,KACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,GAAiC,0BAA0B,SAAS,CAAA;AAExE,EAAA,IAAI,CAAC,OAAA,EAAS;AAEZ,IAAA,MAAM,YAAA,GAAoBD,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,aAAa,CAAA;AACvD,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,YAAY,CAAA,EAAG;AAC/B,MAAA,MAAM,WAAA,GAAiBA,cAAA,CAAA,YAAA,CAAa,YAAA,EAAc,OAAO,CAAA;AACzD,MAAA,MAAM,EAAE,WAAA,EAAY,GAAI,gBAAA,CAAiB,WAAW,CAAA;AACpD,MAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,GAAK,WAAA,CAAY,YAAsB,EAAC;AAC7F,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,CAAE,MAAA,CAAO,CAAC,EAAA,KAAe,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,IAAK,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,IAAK,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,IAAK,EAAA,CAAG,UAAA,CAAW,UAAU,CAAC,CAAA;AACjK,MAAA,OAAA,GAAU;AAAA,QACR,EAAA,EAAI,CAAA,IAAA,EAAO,QAAA,CAAS,WAAA,EAAa,CAAA,CAAA;AAAA,QACjC,IAAA,EAAM,SAAA;AAAA,QACN,QAAA;AAAA,QACA,QAAA,EAAU;AAAA,UACR,YAAA,EAAc;AAAA,SAChB;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,QAAA,EAAU;AACjC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,QAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA;AAAA,MACA,wBAAwB,EAAC;AAAA,MACzB,yBAAyB,EAAC;AAAA,MAC1B,8BAA8B,EAAC;AAAA,MAC/B,QAAA,EAAU,KAAA;AAAA,MACV,MAAA,EAAQ,CAAC,CAAA,WAAA,EAAc,QAAQ,CAAA,6EAAA,CAA4E;AAAA,KAC7G;AAAA,EACF;AAIA,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,GAAI,OAAA,CAAQ,QAAA,CAAS,YAAA,IAAgB,EAAC;AAAA,IACtC,GAAI,OAAA,CAAQ,QAAA,CAAS,oBAAA,IAAwB;AAAC,GAChD;AAGA,EAAA,MAAM,4BAAsC,EAAC;AAC7C,EAAA,MAAM,QAAA,GAAgBD,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,SAAS,CAAA;AAC/C,EAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,IAAA,MAAM,WAAA,GAAiBA,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AACrD,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,qBAAA,CAAsB,WAAW,CAAA;AACtD,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,IAAI;AACF,QAAA,4BAAA,CAA6B,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,IAAI,CAAA;AAClE,QAAA,yBAAA,CAA0B,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,MACxC,SAAS,GAAA,EAAU;AACjB,QAAA,MAAA,CAAO,KAAK,CAAA,4CAAA,EAA4C,IAAA,CAAK,EAAE,CAAA,GAAA,EAAM,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,YAAY,OAAO,CAAA;AACtC,EAAA,MAAM,kBAAA,uBAAyB,GAAA,EAA8D;AAE7F,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,MAAM,UAAeD,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAE/D,IAAA,IAAI,QAAQ,QAAA,CAAS,gBAAgB,KAAK,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA,EAAG;AAE1E,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAaC,cAAA,CAAA,YAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AAC7C,MAAA,MAAM,EAAE,WAAA,EAAa,IAAA,EAAK,GAAI,iBAAiB,OAAO,CAAA;AACtD,MAAA,IAAI,YAAY,EAAA,EAAI;AAClB,QAAA,kBAAA,CAAmB,GAAA,CAAI,OAAO,WAAA,CAAY,EAAE,GAAG,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,CAAA;AAAA,MAC5E;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,IAAI,yBAAA,CAA0B,QAAA,CAAS,KAAK,CAAA,EAAG;AAC/C,IAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,GAAA,CAAI,KAAK,CAAA;AAC9C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,SAAA,CAAU,WAAA;AACrB,QAAA,IAAI,QAAA,GAAW,KAAA;AAEf,QAAA,IAAI,EAAA,CAAG,WAAW,QAAA,EAAU;AAC1B,UAAA,EAAA,CAAG,MAAA,GAAS,QAAA;AACZ,UAAA,QAAA,GAAW,IAAA;AAAA,QACb;AAEA,QAAA,MAAM,QAAA,GACJ,eAAe,MAAA,GAAS,CAAA,GACpB,iCAA8B,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GACvD,CAAA,mCAAA,CAAA;AAEN,QAAA,MAAM,WAAA,GAAc,wBAAA,CAAyB,SAAA,CAAU,IAAA,EAAM;AAAA,UAC3D,OAAA,EAAS,MAAA,CAAO,EAAA,CAAG,OAAA,IAAW,OAAO,CAAA;AAAA,UACrC,IAAA;AAAA,UACA,MAAA;AAAA,UACA,WAAA,EAAa,QAAA;AAAA,UACb,SAAA,EAAW;AAAA,SACZ,CAAA;AAED,QAAA,IAAI,WAAA,KAAgB,SAAA,CAAU,IAAA,IAAQ,QAAA,EAAU;AAC9C,UAAA,MAAM,UAAA,GAAa,CAAA;AAAA,EAAQZ,sBAAAA,CAAK,IAAA,CAAK,EAAA,EAAI,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAA,EAAW,CAAA,CAAA,EAAI,CAAA,CAAE,IAAA,EAAM;AAAA;AAAA,CAAA;AAC7E,UAAGY,cAAA,CAAA,aAAA,CAAc,SAAA,CAAU,IAAA,EAAM,UAAA,GAAa,aAAa,OAAO,CAAA;AAClE,UAAA,uBAAA,CAAwB,KAAK,KAAK,CAAA;AAAA,QACpC;AAAA,MACF,SAAS,GAAA,EAAU;AACjB,QAAA,MAAA,CAAO,KAAK,CAAA,0CAAA,EAA0C,KAAK,CAAA,GAAA,EAAM,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AAIA,EAAA,MAAM,kBAA4B,EAAC;AACnC,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,SAAA,EAAW;AACjC,MAAA,MAAM,MAAA,GAAU,CAAA,CAAU,QAAA,IAAa,CAAA,CAAU,EAAA;AACjD,MAAA,IACE,MAAA,KACC,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,IACvB,MAAA,CAAO,UAAA,CAAW,UAAU,CAAA,IAC5B,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,CAAA,EAC1B;AACA,QAAA,eAAA,CAAgB,KAAK,MAAM,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,GAAG,CAAA,IAAK,kBAAA,CAAmB,SAAQ,EAAG;AACvD,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA,IAAK,IAAI,WAAA,EAAa;AAC/C,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAY,wBAAwB,CAAC,CAAA,GACpE,GAAA,CAAI,WAAA,CAAY,wBAAwB,CAAA,GACzC,EAAC;AACL,MAAA,IAAI,UAAA,CAAW,KAAK,CAAC,CAAA,KAAM,UAAU,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AACjD,QAAA,IAAI,CAAC,eAAA,CAAgB,QAAA,CAAS,KAAK,CAAA,EAAG,eAAA,CAAgB,KAAK,KAAK,CAAA;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,IAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,GAAA,CAAI,KAAK,CAAA;AAC9C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,SAAA,CAAU,WAAA;AACrB,QAAA,IAAI,QAAA,GAAW,KAAA;AAGf,QAAA,IAAI,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA,EAAG;AAC5B,UAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,wBAAwB,CAAC,CAAA,GAChE,CAAC,GAAG,EAAA,CAAG,wBAAwB,CAAC,IAChC,EAAC;AACL,UAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,YAAA,IAAI,CAAC,iBAAA,CAAkB,QAAA,CAAS,GAAG,CAAA,EAAG;AACpC,cAAA,iBAAA,CAAkB,KAAK,GAAG,CAAA;AAC1B,cAAA,QAAA,GAAW,IAAA;AAAA,YACb;AAAA,UACF;AACA,UAAA,EAAA,CAAG,wBAAwB,CAAA,GAAI,iBAAA;AAAA,QACjC;AAEA,QAAA,MAAM,WAAA,GAAc,wBAAA,CAAyB,SAAA,CAAU,IAAA,EAAM;AAAA,UAC3D,OAAA,EAAS,MAAA,CAAO,EAAA,CAAG,OAAA,IAAW,OAAO,CAAA;AAAA,UACrC,IAAA;AAAA,UACA,MAAA;AAAA,UACA,WAAA,EAAa,2CAAwC,QAAQ,CAAA,CAAA;AAAA,UAC7D,SAAA,EAAW;AAAA,SACZ,CAAA;AAED,QAAA,IAAI,WAAA,KAAgB,SAAA,CAAU,IAAA,IAAQ,QAAA,EAAU;AAC9C,UAAA,MAAM,UAAA,GAAa,CAAA;AAAA,EAAQZ,sBAAAA,CAAK,IAAA,CAAK,EAAA,EAAI,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAA,EAAW,CAAA,CAAA,EAAI,CAAA,CAAE,IAAA,EAAM;AAAA;AAAA,CAAA;AAC7E,UAAGY,cAAA,CAAA,aAAA,CAAc,SAAA,CAAU,IAAA,EAAM,UAAA,GAAa,aAAa,OAAO,CAAA;AAClE,UAAA,4BAAA,CAA6B,KAAK,KAAK,CAAA;AAAA,QACzC;AAAA,MACF,SAAS,GAAA,EAAU;AACjB,QAAA,MAAA,CAAO,KAAK,CAAA,+CAAA,EAAkD,KAAK,CAAA,GAAA,EAAM,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,MACxF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,YAAA;AAEJ,EAAA,MAAM,iBAAiB,SAAA,CAAU,QAAA,CAAS,UAAeD,gBAAA,CAAA,GAAA,GAAM,SAAA,GAAiBA,uBAAM,QAAQ,CAAA;AAC9F,EAAA,MAAM,iBAAA,GAAoB,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,aAAa,MAAA,KAAW,CAAA;AAEzE,EAAA,IAAI,iBAAA,IAAqB,eAAe,cAAA,EAAgB;AACtD,IAAA,MAAM,eAAA,GAAuBA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,WAAW,WAAW,CAAA;AAC1E,IAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,eAAe,CAAA,EAAG;AACnC,MAAGA,cAAA,CAAA,SAAA,CAAU,eAAA,EAAiB,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,OAAA,GAAeD,gBAAA,CAAA,IAAA,CAAK,eAAA,EAAiB,QAAQ,CAAA;AACnD,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,OAAO,CAAA,EAAG;AAC1B,MAAGA,sBAAO,OAAA,EAAS,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,IACrD;AAGA,IAAGA,cAAA,CAAA,UAAA,CAAW,WAAW,OAAO,CAAA;AAChC,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,YAAA,GAAe,OAAA;AAGf,IAAA,MAAM,YAAA,GAAoBD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,aAAa,CAAA;AACrD,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,YAAY,CAAA,EAAG;AAC/B,MAAA,MAAM,OAAA,GAAaA,cAAA,CAAA,YAAA,CAAa,YAAA,EAAc,OAAO,CAAA;AACrD,MAAA,MAAM,EAAE,WAAA,EAAa,IAAA,EAAK,GAAI,iBAAiB,OAAO,CAAA;AACtD,MAAA,WAAA,CAAY,MAAA,GAAS,SAAA;AACrB,MAAA,MAAM,UAAA,GAAa,CAAA;AAAA,EAAQZ,sBAAAA,CAAK,IAAA,CAAK,WAAA,EAAa,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAA,EAAW,EAAA,EAAI,CAAA,CAAE,IAAA,EAAM;AAAA;AAAA,CAAA,GAAY,IAAA;AAClG,MAAGY,cAAA,CAAA,aAAA,CAAc,YAAA,EAAc,UAAA,EAAY,OAAO,CAAA;AAAA,IACpD;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,YAAA,GAAoBD,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,aAAa,CAAA;AACvD,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,YAAY,CAAA,EAAG;AAC/B,MAAA,MAAM,OAAA,GAAaA,cAAA,CAAA,YAAA,CAAa,YAAA,EAAc,OAAO,CAAA;AACrD,MAAA,MAAM,EAAE,WAAA,EAAa,IAAA,EAAK,GAAI,iBAAiB,OAAO,CAAA;AACtD,MAAA,IAAI,iBAAA,EAAmB;AACrB,QAAA,WAAA,CAAY,MAAA,GAAS,WAAA;AAAA,MACvB;AACA,MAAA,MAAM,UAAA,GAAa,CAAA;AAAA,EAAQZ,sBAAAA,CAAK,IAAA,CAAK,WAAA,EAAa,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAA,EAAW,EAAA,EAAI,CAAA,CAAE,IAAA,EAAM;AAAA;AAAA,CAAA,GAAY,IAAA;AAClG,MAAGY,cAAA,CAAA,aAAA,CAAc,YAAA,EAAc,UAAA,EAAY,OAAO,CAAA;AAAA,IACpD;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,QAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,sBAAA,EAAwB,UAAA;AAAA,IACxB,uBAAA;AAAA,IACA,4BAAA;AAAA,IACA,yBAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,oBAAA,CAAqB,OAAA,GAAgC,EAAC,EAIpE;AACA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,MAAM,SAAgC,EAAC;AACvC,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,MAAM,UAAA,GAAa;AAAA,IACZD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,WAAW,CAAA;AAAA,IAC7CA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,QAAQ;AAAA,GACjD;AAGA,EAAA,MAAM,UAAA,GAAa,YAAY,OAAO,CAAA;AACtC,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAiB;AAC1C,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,MAAM,MAAWA,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC3D,IAAA,IAAI,IAAI,QAAA,CAAS,gBAAgB,KAAK,GAAA,CAAI,QAAA,CAAS,YAAY,CAAA,EAAG;AAClE,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,aAAa,IAAA,EAAK,GAAI,iBAAoBC,cAAA,CAAA,YAAA,CAAa,IAAA,EAAM,OAAO,CAAC,CAAA;AAC7E,MAAA,IAAI,YAAY,EAAA,EAAI;AAClB,QAAA,YAAA,CAAa,GAAA,CAAI,OAAO,WAAA,CAAY,EAAE,GAAG,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,CAAA;AAAA,MACtE;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AAEA,EAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,IAAA,IAAI,CAAIA,cAAA,CAAA,UAAA,CAAW,MAAM,CAAA,EAAG;AAC5B,IAAA,MAAM,UAAaA,cAAA,CAAA,WAAA,CAAY,MAAA,EAAQ,EAAE,aAAA,EAAe,MAAM,CAAA;AAC9D,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAC,CAAA,CAAE,WAAA,EAAY,EAAG;AACtB,MAAA,MAAM,SAAA,GAAiBD,gBAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,CAAE,IAAI,CAAA;AAC1C,MAAA,MAAM,OAAA,GAAU,0BAA0B,SAAS,CAAA;AACnD,MAAA,IAAI,CAAC,OAAA,EAAS;AAEd,MAAA,MAAM,SAAA,GAAiBA,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AACjD,MAAA,MAAM,KAAA,GAAyBC,cAAA,CAAA,UAAA,CAAW,SAAS,CAAA,GAC/C,qBAAA,CAAyBA,4BAAa,SAAA,EAAW,OAAO,CAAC,CAAA,GACzD,EAAC;AAEL,MAAA,MAAM,YAAY,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,WAAW,CAAA;AAC9D,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,QAAA,EAAU,YAAA,IAAgB,EAAC;AACtD,MAAA,MAAM,aAAuB,EAAC;AAC9B,MAAA,MAAM,UAAoB,EAAC;AAC3B,MAAA,MAAM,OAAiB,EAAC;AAExB,MAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,QAAA,MAAM,SAAA,GAAY,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA;AACxC,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,UAAA,IAAA,CAAK,IAAA,CAAK,CAAA,kBAAA,EAAqB,KAAK,CAAA,gDAAA,CAA4C,CAAA;AAAA,QAClF,CAAA,MAAO;AAEL,UAAA,IAAI,SAAA,CAAU,WAAA,CAAY,MAAA,KAAW,QAAA,EAAU;AAC7C,YAAA,IAAA,CAAK,IAAA,CAAK,CAAA,kBAAA,EAAqB,KAAK,CAAA,8DAAA,CAA0D,CAAA;AAAA,UAChG;AACA,UAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,QACvB;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,GAAuE,cAAA;AAC3E,MAAA,IAAI,WAAW,MAAA,KAAW,UAAA,CAAW,MAAA,IAAU,IAAA,CAAK,WAAW,CAAA,EAAG;AAChE,QAAA,MAAA,GAAS,kBAAA;AAAA,MACX,CAAA,MAAA,IAAW,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAChC,QAAA,MAAA,GAAS,sBAAA;AAAA,MACX;AAEA,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,QAAA,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,IAAI,uBAAoB,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAC7D;AAEA,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,UAAU,CAAA,CAAE,IAAA;AAAA,QACZ,MAAA;AAAA,QACA,qBAAqB,SAAA,CAAU,MAAA;AAAA,QAC/B,iBAAiB,KAAA,CAAM,MAAA;AAAA,QACvB,sBAAA,EAAwB,UAAA;AAAA,QACxB,mBAAA,EAAqB,OAAA;AAAA,QACrB;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,qBAAA,CAAsB,QAAgB,SAAA,EAA4B;AACzE,EAAA,MAAM,MAAA,GAAS,OAAO,WAAA,EAAY;AAClC,EAAA,MAAM,MAAA,GAAS,UAAU,WAAA,EAAY;AACrC,EAAA,IAAI,WAAW,MAAA,IAAU,MAAA,CAAO,QAAA,CAAS,MAAM,GAAG,OAAO,IAAA;AACzD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,qBAAqB,CAAA;AAClD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,oBAAoB,CAAA;AACjD,EAAA,OAAO,OAAA,CAAQ,WAAW,OAAA,IAAW,OAAA,CAAQ,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAChE;AAEA,SAAS,wBAAA,CACP,eACA,OAAA,EACkF;AAClF,EAAA,MAAM,iBAAA,GAAoB,OAAA;AAAA,IACxB,OAAA,CAAQ,OAAA,IACP,OAAA,CAAQ,YAAA,IAAgB,OAAA,CAAQ,aAAa,MAAA,GAAS,CAAA,IACvD,OAAA,CAAQ,OAAA,IACR,OAAA,CAAQ;AAAA,GACV;AAEA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAM,KAAA,GAAQ,cAAc,IAAA,CAAK,CAAC,MAAM,qBAAA,CAAsB,CAAA,EAAG,OAAA,CAAQ,OAAQ,CAAC,CAAA;AAClF,IAAA,IAAI,KAAA,EAAO,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,CAAA,8BAAA,EAAiC,OAAA,CAAQ,OAAO,CAAA,EAAA,CAAA,EAAK;AAAA,EACtH;AACA,EAAA,IAAI,OAAA,CAAQ,YAAA,IAAgB,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3D,IAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,YAAA,EAAc;AACvC,MAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA,CAAE,MAAM,iCAAiC,CAAA;AAC9E,MAAA,IAAI,SAAS,aAAA,CAAc,QAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG;AAC7C,QAAA,OAAO,EAAE,QAAA,EAAU,KAAA,CAAM,CAAC,CAAA,EAAG,QAAQ,OAAA,EAAS,MAAA,EAAQ,CAAA,qCAAA,EAAwC,IAAI,CAAA,EAAA,CAAA,EAAK;AAAA,MACzG;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAM,KAAA,GAAQ,cAAc,IAAA,CAAK,CAAC,MAAM,qBAAA,CAAsB,CAAA,EAAG,OAAA,CAAQ,OAAQ,CAAC,CAAA;AAClF,IAAA,IAAI,KAAA,EAAO,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,CAAA,mCAAA,EAAmC,OAAA,CAAQ,OAAO,CAAA,EAAA,CAAA,EAAK;AAAA,EACvH;AACA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAM,KAAA,GAAQ,cAAc,IAAA,CAAK,CAAC,MAAM,qBAAA,CAAsB,CAAA,EAAG,OAAA,CAAQ,MAAO,CAAC,CAAA;AACjF,IAAA,IAAI,KAAA,SAAc,EAAE,QAAA,EAAU,OAAO,MAAA,EAAQ,MAAA,EAAQ,QAAQ,CAAA,6CAAA,CAAA,EAA6C;AAAA,EAC5G;AACA,EAAA,IAAI,CAAC,iBAAA,IAAqB,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG;AACpD,IAAA,OAAO,EAAE,QAAA,EAAU,aAAA,CAAc,CAAC,CAAA,EAAG,MAAA,EAAQ,yBAAA,EAA2B,MAAA,EAAQ,CAAA,mCAAA,EAAmC,aAAA,CAAc,CAAC,CAAC,CAAA,EAAA,CAAA,EAAK;AAAA,EAC1I;AACA,EAAA,OAAO,EAAC;AACV;AAMO,SAAS,gCAAA,CACd,OAAA,GAAkC,EAAC,EACZ;AACvB,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,MAAM,YAAA,GAAoBD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,WAAW,QAAQ,CAAA;AACpE,EAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,YAAY,CAAA,EAAG;AAChC,IAAA,OAAO,EAAE,UAAU,KAAA,EAAO,OAAA,EAAS,CAAC,CAAA,+CAAA,EAAkD,YAAY,IAAI,CAAA,EAAE;AAAA,EAC1G;AAEA,EAAA,MAAM,UAAaA,cAAA,CAAA,WAAA,CAAY,YAAA,EAAc,EAAE,aAAA,EAAe,MAAM,CAAA;AACpE,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAC9E,EAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,IAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,OAAA,EAAS,CAAC,yEAAyE,CAAA,EAAE;AAAA,EACjH;AAEA,EAAA,MAAM,KAAA,GAAQ,wBAAA,CAAyB,aAAA,EAAe,OAAO,CAAA;AAC7D,EAAA,IAAI,CAAC,MAAM,QAAA,EAAU;AACnB,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,KAAA;AAAA,MACV,SAAS,CAAC,CAAA,+CAAA,EAA4C,cAAc,IAAA,CAAK,IAAI,CAAC,CAAA,kCAAA,CAAoC;AAAA,KACpH;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAiBD,gBAAA,CAAA,IAAA,CAAK,YAAA,EAAc,KAAA,CAAM,QAAQ,CAAA;AACxD,EAAA,MAAM,SAAA,GAAiBA,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AACjD,EAAA,MAAM,KAAA,GAAWC,cAAA,CAAA,UAAA,CAAW,SAAS,CAAA,GAAI,qBAAA,CAAyBA,4BAAa,SAAA,EAAW,OAAO,CAAC,CAAA,GAAI,EAAC;AACvG,EAAA,MAAM,YAAY,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,WAAW,CAAA;AAC9D,EAAA,MAAM,eAAe,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,SAAA,CAAU,WAAW,KAAA,CAAM,MAAA;AAEpE,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,IAAA;AAAA,IACV,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,SAAA;AAAA,IACA,iBAAA,EAAmB,YAAA;AAAA,IACnB,qBAAqB,SAAA,CAAU,MAAA;AAAA,IAC/B,iBAAiB,KAAA,CAAM,MAAA;AAAA,IACvB,SAAS,KAAA,CAAM,MAAA,GAAS,CAAC,KAAA,CAAM,MAAM,IAAI;AAAC,GAC5C;AACF;ACzqBO,SAAS,uBAAuB,OAAA,EAAyB;AAE9D,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AAChD,EAAA,OAAcC,iBAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,YAAY,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAC7E;AAEO,SAAS,mBAAmB,OAAA,EAAiE;AAClG,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,6BAA6B,CAAA;AACzD,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AAEpB,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,IAAI,CAAA;AACjC,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,KAAA;AAEJ,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAC1B,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,EAAK,CAAE,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA;AACtE,MAAA,IAAI,GAAA,KAAQ,MAAM,EAAA,GAAK,GAAA;AACvB,MAAA,IAAI,GAAA,KAAQ,QAAQ,IAAA,GAAO,GAAA;AAC3B,MAAA,IAAI,GAAA,KAAQ,SAAS,KAAA,GAAQ,GAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAM;AAC3B;AASO,SAAS,gBAAA,CAAiB,SAAiB,UAAA,EAAqC;AACrF,EAAA,MAAM,YAA6B,EAAC;AACpC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAEhC,EAAA,IAAI,WAAA,GAAc,KAAA;AAClB,EAAA,IAAI,aAAA,GAA+B,IAAA;AACnC,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,aAAA;AAEJ,EAAA,KAAA,MAAW,WAAW,KAAA,EAAO;AAC3B,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAEnC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA,EAAG;AACjC,MAAA,WAAA,GAAc,IAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,IAAK,CAAC,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,IAAK,CAAC,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,IAAK,CAAC,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,IAAK,CAAC,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,IAAK,CAAC,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,EAAG;AACzK,QAAA,WAAA,GAAc,KAAA;AACd,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,SAAA,CAAU,IAAA,CAAK,EAAE,QAAA,EAAU,aAAA,EAAe,gBAAgB,aAAA,EAAe,MAAA,EAAQ,aAAA,EAAe,UAAA,EAAY,CAAA;AAC5G,UAAA,aAAA,GAAgB,IAAA;AAChB,UAAA,aAAA,GAAgB,MAAA;AAChB,UAAA,aAAA,GAAgB,MAAA;AAAA,QAClB;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AAC5B,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,SAAA,CAAU,IAAA,CAAK,EAAE,QAAA,EAAU,aAAA,EAAe,gBAAgB,aAAA,EAAe,MAAA,EAAQ,aAAA,EAAe,UAAA,EAAY,CAAA;AAAA,QAC9G;AACA,QAAA,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,EAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CAAE,IAAA,EAAK;AAC7D,QAAA,aAAA,GAAgB,MAAA;AAChB,QAAA,aAAA,GAAgB,MAAA;AAAA,MAClB,WAAW,aAAA,EAAe;AACxB,QAAA,IAAI,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG;AAC9B,UAAA,IAAI,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,EAAE,IAAA,EAAK;AACvE,UAAA,IAAI,IAAI,UAAA,CAAW,SAAS,GAAG,GAAA,GAAM,GAAA,CAAI,UAAU,CAAC,CAAA;AACpD,UAAA,aAAA,GAAgB,GAAA;AAAA,QAClB,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG;AACrC,UAAA,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,EAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CAAE,IAAA,EAAK;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,SAAA,CAAU,IAAA,CAAK,EAAE,QAAA,EAAU,aAAA,EAAe,gBAAgB,aAAA,EAAe,MAAA,EAAQ,aAAA,EAAe,UAAA,EAAY,CAAA;AAAA,EAC9G;AAEA,EAAA,OAAO,SAAA;AACT;AAIO,SAAS,0BAAA,CACd,KAAA,EACA,MAAA,EACA,eAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,eAAA,KAAoB,CAAA;AACxD,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,CAAA,sEAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,uBAAA,EAAA,iBAA0B,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA,CAAA;AAAA,IAClD,kBAAkB,IAAA,GAAO,kDAAA,GAAgD,CAAA,uBAAA,EAAqB,MAAA,CAAO,MAAM,CAAA,sBAAA,CAAwB,CAAA,CAAA;AAAA,IACnI,CAAA,CAAA;AAAA,IACA,CAAA,GAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,gCAAA,EAAmC,MAAM,MAAM,CAAA,CAAA,CAAA;AAAA,IAC/C,CAAA,CAAA;AAAA,IACA,CAAA,0DAAA,CAAA;AAAA,IACA,CAAA,6BAAA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,CAAA,CAAE,EAAE,CAAA,SAAA,EAAY,CAAA,CAAE,IAAI,CAAA,KAAA,EAAQ,CAAA,CAAE,KAAA,IAAS,UAAU,eAAe,CAAA,CAAE,MAAA,CAAO,UAAU,CAAA,EAAG,EAAE,CAAC,CAAA,OAAA,CAAS,CAAA;AAAA,EAC1H;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,qDAAqD,CAAA;AAChE,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,oFAAoF,CAAA;AAC/F,IAAA,KAAA,CAAM,KAAK,+BAA+B,CAAA;AAC1C,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,OAAO,CAAA,CAAE,UAAU,YAAY,CAAA,CAAE,QAAQ,mBAAmB,CAAA,CAAE,cAAA,CAAe,UAAU,CAAA,EAAG,EAAE,CAAC,CAAA,iBAAA,EAAoB,CAAA,CAAE,aAAa,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,OAAA;AAAA,OAClJ;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,SAAS,eAAA,CAAgB,OAAA,GAA4B,EAAC,EAAoB;AAC/E,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,MAAM,UAAA,GAAa,YAAY,OAAO,CAAA;AAEtC,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsB;AAC9C,EAAA,MAAM,eAAgC,EAAC;AAEvC,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAaC,cAAA,CAAA,YAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AAC7C,MAAA,MAAM,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAM,GAAI,mBAAmB,OAAO,CAAA;AACtD,MAAA,MAAM,MAAA,GAAS,uBAAuB,OAAO,CAAA;AAC7C,MAAA,MAAM,UAAeC,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAE/D,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,OAAA,EAAS,OAAO,CAAA;AACnD,QAAA,WAAA,CAAY,IAAI,EAAA,EAAI;AAAA,UAClB,EAAA;AAAA,UACA,MAAM,IAAA,IAAQ,UAAA;AAAA,UACd,QAAA,EAAU,OAAA;AAAA,UACV,KAAA;AAAA,UACA,MAAA;AAAA,UACA,UAAA,EAAY,OAAA;AAAA,UACZ,SAAA,EAAW,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,YAC/B,UAAU,CAAA,CAAE,QAAA;AAAA,YACZ,gBAAgB,CAAA,CAAE,cAAA;AAAA,YAClB,QAAQ,CAAA,CAAE;AAAA,WACZ,CAAE;AAAA,SACH,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,aAAA,GAAA,CACH,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA,IAC1B,QAAQ,UAAA,CAAW,MAAM,CAAA,IACzB,OAAA,CAAQ,UAAA,CAAW,WAAW,KAC9B,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,IAC7B,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,KAC5B,CAAC,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA;AAChC,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,OAAA,EAAS,OAAO,CAAA;AACvD,QAAA,YAAA,CAAa,IAAA,CAAK,GAAG,aAAa,CAAA;AAAA,MACpC;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,IAAI,eAAA,GAAkB,CAAA;AAEtB,EAAA,KAAA,MAAW,YAAY,YAAA,EAAc;AACnC,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,GAAA,CAAI,QAAA,CAAS,QAAQ,CAAA;AACpD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,eAAA,EAAA;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,MAAA,IAAI,QAAA,CAAS,cAAA,KAAmB,UAAA,CAAW,MAAA,EAAQ;AACjD,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,UAAU,QAAA,CAAS,UAAA;AAAA,UACnB,UAAU,QAAA,CAAS,QAAA;AAAA,UACnB,YAAY,QAAA,CAAS,UAAA;AAAA,UACrB,gBAAgB,QAAA,CAAS,cAAA;AAAA,UACzB,cAAc,UAAA,CAAW;AAAA,SAC1B,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAC7C,EAAA,MAAM,cAAA,GAAiB,0BAAA,CAA2B,KAAA,EAAO,MAAA,EAAQ,eAAe,CAAA;AAEhF,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,YAAY,KAAA,CAAM,MAAA;AAAA,IAClB,YAAY,YAAA,CAAa,MAAA;AAAA,IACzB,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,wBAAA,CACd,OAAA,EACA,WAAA,EACA,UAAA,EACA,OAAA,EAC8C;AAC9C,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AACnC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,WAAA,GAAc,KAAA;AAClB,EAAA,IAAI,aAAA,GAA+B,IAAA;AACnC,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,WAAW,KAAA,EAAO;AAC3B,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAE7B,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,YAAY,CAAA,EAAG;AACpC,MAAA,WAAA,GAAc,IAAA;AACd,MAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IACE,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,IACpB,CAAC,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,IACxB,CAAC,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,IACzB,CAAC,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,IAC7B,CAAC,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,IAC7B,CAAC,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,EAC9B;AACA,QAAA,WAAA,GAAc,KAAA;AACd,QAAA,aAAA,GAAgB,IAAA;AAChB,QAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AACrB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAC/B,QAAA,aAAA,GAAgB,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,EAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CAAE,IAAA,EAAK;AAChE,QAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AACrB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,aAAA,IAAiB,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AAClD,QAAA,MAAM,UAAA,GAAa,WAAA,CAAY,GAAA,CAAI,aAAa,CAAA;AAChD,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,IAAI,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,EAAE,IAAA,EAAK;AACjF,UAAA,MAAM,YAAA,GAAe,UAAA,CAAW,UAAA,CAAW,SAAS,CAAA;AACpD,UAAA,IAAI,YAAA,EAAc,UAAA,GAAa,UAAA,CAAW,SAAA,CAAU,CAAC,CAAA;AACrD,UAAA,MAAM,YAAY,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,IAAK,OAAA,CAAQ,SAAS,GAAG,CAAA;AAE/D,UAAA,IAAI,UAAA,KAAe,WAAW,MAAA,EAAQ;AACpC,YAAA,MAAM,SAAS,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,GAAI,CAAC,CAAA,IAAK,MAAA;AAC7C,YAAA,MAAM,MAAA,GAAS,eAAe,SAAA,GAAY,EAAA;AAC1C,YAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAM,CAAA,EAAG,WAAW,MAAM,CAAA,CAAA;AACzC,YAAA,MAAM,OAAA,GAAU,SAAA,GAAY,CAAA,EAAG,MAAM,CAAA,SAAA,EAAY,GAAG,CAAA,CAAA,CAAA,GAAM,CAAA,EAAG,MAAM,CAAA,QAAA,EAAW,GAAG,CAAA,CAAA;AACjF,YAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AACrB,YAAA,OAAA,GAAU,IAAA;AACV,YAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,cACX,UAAA;AAAA,cACA,QAAA,EAAU,aAAA;AAAA,cACV,cAAA,EAAgB,UAAA;AAAA,cAChB,WAAW,UAAA,CAAW;AAAA,aACvB,CAAA;AACD,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,EACvB;AAEA,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,QAAA,CAAS,MAAM,IAAI,MAAA,GAAS,IAAA;AAChD,EAAA,OAAO,EAAE,cAAA,EAAgB,QAAA,CAAS,IAAA,CAAK,GAAG,GAAG,OAAA,EAAQ;AACvD;AAEO,SAAS,eAAA,CAAgB,OAAA,GAA2B,EAAC,EAAmB;AAC7E,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,MAAM,UAAA,GAAa,YAAY,OAAO,CAAA;AACtC,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsB;AAE9C,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAaD,cAAA,CAAA,YAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AAC7C,MAAA,MAAM,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAM,GAAI,mBAAmB,OAAO,CAAA;AACtD,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAM,MAAA,GAAS,uBAAuB,OAAO,CAAA;AAC7C,QAAA,MAAM,UAAeC,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC/D,QAAA,WAAA,CAAY,IAAI,EAAA,EAAI;AAAA,UAClB,EAAA;AAAA,UACA,MAAM,IAAA,IAAQ,UAAA;AAAA,UACd,QAAA,EAAU,OAAA;AAAA,UACV,KAAA;AAAA,UACA,MAAA;AAAA,UACA,UAAA,EAAY,OAAA;AAAA,UACZ,WAAW;AAAC,SACb,CAAA;AAAA,MACH;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,UAA4B,EAAC;AACnC,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,MAAM,iBAA2B,EAAC;AAElC,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,UAAA,GAAkBA,gBAAA,CAAA,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA,GAAI,QAAQ,UAAA,GAAkBA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,CAAQ,UAAU,CAAA;AACnH,IAAA,IAAOD,cAAA,CAAA,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7B,MAAA,IAAOA,cAAA,CAAA,QAAA,CAAS,UAAU,CAAA,CAAE,WAAA,EAAY,iBAAkB,IAAA,CAAK,GAAG,WAAA,CAAY,UAAU,CAAC,CAAA;AAAA,WACpF,cAAA,CAAe,KAAK,UAAU,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,MAAA,MAAM,UAAeC,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC/D,MAAA,MAAM,aAAA,GAAA,CACH,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA,IAC1B,QAAQ,UAAA,CAAW,MAAM,CAAA,IACzB,OAAA,CAAQ,UAAA,CAAW,WAAW,KAC9B,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,IAC7B,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,KAC5B,CAAC,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA;AAChC,MAAA,IAAI,aAAA,EAAe,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAAA,IAC7C;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAaD,cAAA,CAAA,YAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AAC7C,MAAA,MAAM,UAAeC,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC/D,MAAA,MAAM,EAAE,gBAAgB,OAAA,EAAQ,GAAI,yBAAyB,OAAA,EAAS,WAAA,EAAa,SAAS,OAAO,CAAA;AACnG,MAAA,IAAI,OAAA,EAAS;AACX,QAAGD,cAAA,CAAA,aAAA,CAAc,IAAA,EAAM,cAAA,EAAgB,OAAO,CAAA;AAC9C,QAAA,YAAA,CAAa,KAAK,OAAO,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,aAAa,OAAA,CAAQ,MAAA;AAAA,IACrB,YAAA;AAAA,IACA;AAAA,GACF;AACF;AC/WO,IAAM,kBAAA,GAA6C;AAAA;AAAA,EAExD,KAAA,EAAO,mCAAA;AAAA,EACP,eAAA,EAAiB,2CAAA;AAAA,EACjB,OAAA,EAAS,qCAAA;AAAA,EACT,WAAA,EAAa,yCAAA;AAAA,EACb,IAAA,EAAM,kCAAA;AAAA,EACN,UAAA,EAAY,sCAAA;AAAA;AAAA,EAGZ,YAAA,EAAc,yCAAA;AAAA,EACd,kBAAA,EAAoB,sCAAA;AAAA,EACpB,sBAAA,EAAwB,2CAAA;AAAA,EACxB,cAAA,EAAgB,2CAAA;AAAA;AAAA,EAGhB,8BAAA,EAAgC,sCAAA;AAAA,EAChC,SAAA,EAAW,4CAAA;AAAA;AAAA,EAGX,MAAA,EAAQ,mCAAA;AAAA,EACR,oBAAA,EAAsB,uCAAA;AAAA;AAAA,EAGtB,aAAA,EAAe,yCAAA;AAAA,EACf,mBAAA,EAAqB,+CAAA;AAAA;AAAA,EAGrB,KAAA,EAAO,+BAAA;AAAA,EACP,OAAA,EAAS,iCAAA;AAAA,EACT,sBAAA,EAAwB,kCAAA;AAAA,EACxB,QAAA,EAAU,kCAAA;AAAA,EACV,aAAA,EAAe,gCAAA;AAAA,EACf,oBAAA,EAAsB,gCAAA;AAAA,EACtB,MAAA,EAAQ,gCAAA;AAAA,EACR,eAAA,EAAiB,8BAAA;AAAA,EACjB,IAAA,EAAM,8BAAA;AAAA,EACN,cAAA,EAAgB,sCAAA;AAAA,EAChB,mBAAA,EAAqB,2CAAA;AAAA;AAAA,EAGrB,kBAAA,EAAoB,iDAAA;AAAA;AAAA,EAGpB,eAAA,EAAiB,4CAAA;AAAA;AAAA,EAGjB,YAAA,EAAc;AAChB;AAEA,IAAM,eAAA,GAA2C;AAAA,EAC/C,CAAC,eAAe,cAAc,CAAA;AAAA,EAC9B,CAAC,QAAQ,OAAO,CAAA;AAAA,EAChB,CAAC,OAAO,UAAU,CAAA;AAAA,EAClB,CAAC,OAAO,eAAe,CAAA;AAAA,EACvB,CAAC,OAAO,aAAa,CAAA;AAAA,EACrB,CAAC,OAAO,aAAa,CAAA;AAAA,EACrB,CAAC,QAAQ,aAAa,CAAA;AAAA,EACtB,CAAC,QAAQ,SAAS,CAAA;AAAA,EAClB,CAAC,SAAS,MAAM,CAAA;AAAA,EAChB,CAAC,UAAU,YAAY,CAAA;AAAA,EACvB,CAAC,YAAY,kBAAkB,CAAA;AAAA,EAC/B,CAAC,YAAY,sBAAsB,CAAA;AAAA,EACnC,CAAC,QAAQ,QAAQ,CAAA;AAAA,EACjB,CAAC,YAAY,oBAAoB,CAAA;AAAA,EACjC,CAAC,QAAQ,oBAAoB,CAAA;AAAA,EAC7B,CAAC,QAAQ,8BAA8B,CAAA;AAAA,EACvC,CAAC,QAAQ,WAAW,CAAA;AAAA,EACpB,CAAC,aAAa,aAAa,CAAA;AAAA,EAC3B,CAAC,aAAa,mBAAmB,CAAA;AAAA,EACjC,CAAC,YAAY,kBAAkB,CAAA;AAAA,EAC/B,CAAC,YAAY,kBAAkB,CAAA;AAAA,EAC/B,CAAC,QAAQ,kBAAkB,CAAA;AAAA,EAC3B,CAAC,QAAQ,OAAO,CAAA;AAAA,EAChB,CAAC,iBAAiB,eAAe,CAAA;AAAA,EACjC,CAAC,SAAS,eAAe,CAAA;AAAA,EACzB,CAAC,QAAQ,SAAS,CAAA;AAAA,EAClB,CAAC,SAAS,eAAe,CAAA;AAAA,EACzB,CAAC,QAAQ,aAAa,CAAA;AAAA,EACtB,CAAC,QAAQ,sBAAsB,CAAA;AAAA,EAC/B,CAAC,UAAU,sBAAsB,CAAA;AAAA,EACjC,CAAC,SAAS,sBAAsB,CAAA;AAAA,EAChC,CAAC,YAAY,cAAc,CAAA;AAAA,EAC3B,CAAC,YAAY,cAAc,CAAA;AAAA,EAC3B,CAAC,YAAY,mBAAmB,CAAA;AAAA,EAChC,CAAC,YAAY,mBAAmB,CAAA;AAAA,EAChC,CAAC,QAAQ,mBAAmB,CAAA;AAAA,EAC5B,CAAC,YAAY,YAAY,CAAA;AAAA,EACzB,CAAC,YAAY,YAAY,CAAA;AAAA,EACzB,CAAC,QAAQ,YAAY;AACvB,CAAA;AAEO,SAAS,wBAAwB,EAAA,EAA2B;AACjE,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,IAAI,CAAA,IAAK,eAAA,EAAiB;AAC5C,IAAA,IAAI,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,EAAG;AACzB,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,mBAAmB,OAAA,EAAiD;AAClF,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,6BAA6B,CAAA;AACzD,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAASd,sBAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACjC,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AA0BO,SAAS,qBAAA,CACd,KAAA,EACA,MAAA,EACA,QAAA,GAAW,EAAA,EACD;AACV,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,cAAc,QAAA,IAAY,MAAA;AAGhC,EAAA,IAAI,MAAA,CAAO,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,OAAO,KAAA,EAAO;AACxD,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,EAAI,WAAW,CAAA,cAAA,EAAiB,MAAA,CAAO,KAAK,CAAA,aAAA,EAAgB,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AACxF,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,IAAa,CAAC,OAAO,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AAC7D,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,CAAA,CAAA,EAAI,WAAW,CAAA,kBAAA,EAAqB,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,aAAA,EAAgB,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,KACzF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,KAAA,MAAW,GAAA,IAAO,OAAO,KAAA,EAAO;AAC9B,MAAA,IAAI,sBAAsB,KAAA,EAAO,GAAA,EAAK,QAAQ,CAAA,CAAE,WAAW,CAAA,EAAG;AAC5D,QAAA,UAAA,EAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,EAAI,WAAW,CAAA,4CAAA,CAA8C,CAAA;AAAA,IAC3E;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,MAAM,UAAA,GAAa,OAAO,KAAA,CAAM,IAAA;AAAA,MAC9B,CAAC,GAAA,KAAQ,qBAAA,CAAsB,OAAO,GAAA,EAAK,QAAQ,EAAE,MAAA,KAAW;AAAA,KAClE;AACA,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,EAAI,WAAW,CAAA,gDAAA,CAAkD,CAAA;AAAA,IAC/E;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAW;AAC7B,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,IAAI,MAAA,CAAO,IAAA,GAAO,CAAC,MAAA,CAAO,IAAI,CAAA;AAC5E,IAAA,IAAI,aAAqB,OAAO,KAAA;AAChC,IAAA,IAAI,KAAA,KAAU,MAAM,UAAA,GAAa,MAAA;AAAA,SAAA,IACxB,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,UAAA,GAAa,OAAA;AAAA,SAAA,IACnC,eAAe,QAAA,IAAY,MAAA,CAAO,SAAA,CAAU,KAAK,GAAG,UAAA,GAAa,SAAA;AAE1E,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,KAAM;AAC3C,MAAA,IAAI,CAAA,KAAM,YAAY,OAAO,IAAA;AAC7B,MAAA,IAAI,CAAA,KAAM,QAAA,IAAY,UAAA,KAAe,SAAA,EAAW,OAAO,IAAA;AACvD,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,CAAA,CAAA,EAAI,WAAW,CAAA,iBAAA,EAAoB,YAAA,CAAa,KAAK,GAAG,CAAC,gBAAgB,UAAU,CAAA,CAAA;AAAA,OACrF;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI,OAAO,SAAA,KAAc,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,OAAO,SAAA,EAAW;AACrE,MAAA,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,WAAW,CAAA,oBAAA,EAAuB,MAAA,CAAO,SAAS,CAAA,CAAE,CAAA;AAAA,IACtE;AACA,IAAA,IAAI,OAAO,SAAA,KAAc,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,OAAO,SAAA,EAAW;AACrE,MAAA,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,WAAW,CAAA,oBAAA,EAAuB,MAAA,CAAO,SAAS,CAAA,CAAE,CAAA;AAAA,IACtE;AACA,IAAA,IAAI,MAAA,CAAO,YAAY,MAAA,EAAW;AAChC,MAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AACvC,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AACtB,QAAA,MAAA,CAAO,IAAA,CAAK,IAAI,WAAW,CAAA,SAAA,EAAY,KAAK,CAAA,yBAAA,EAA4B,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAAA,MAC1F;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAQ;AAC5B,MAAA,MAAM,SAAA,GAAY,qBAAA;AAClB,MAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,IAAK,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG;AACtD,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,EAAI,WAAW,CAAA,mDAAA,CAAqD,CAAA;AAAA,MAClF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI,MAAA,CAAO,OAAA,KAAY,MAAA,IAAa,KAAA,GAAQ,OAAO,OAAA,EAAS;AAC1D,MAAA,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,WAAW,CAAA,aAAA,EAAgB,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,MAAA,CAAO,OAAA,KAAY,MAAA,IAAa,KAAA,GAAQ,OAAO,OAAA,EAAS;AAC1D,MAAA,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,WAAW,CAAA,aAAA,EAAgB,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAAA,IAC7D;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,IAAI,OAAO,QAAA,KAAa,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,OAAO,QAAA,EAAU;AACnE,MAAA,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,WAAW,CAAA,yBAAA,EAA4B,MAAA,CAAO,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,OAAO,QAAA,KAAa,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,OAAO,QAAA,EAAU;AACnE,MAAA,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,WAAW,CAAA,yBAAA,EAA4B,MAAA,CAAO,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,GAAA,KAAQ;AAC3B,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,qBAAA,CAAsB,IAAA,EAAM,MAAA,CAAO,KAAA,EAAQ,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG,CAAC,CAAA;AAAA,MACrF,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtD,IAAA,MAAM,MAAA,GAAS,KAAA;AAGf,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,KAAA,MAAW,MAAA,IAAU,OAAO,QAAA,EAAU;AACpC,QAAA,IAAI,EAAE,MAAA,IAAU,MAAA,CAAA,IAAW,MAAA,CAAO,MAAM,MAAM,MAAA,EAAW;AACvD,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,EAAI,WAAW,CAAA,0BAAA,EAA6B,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,IAAc,EAAC;AACzC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACnD,MAAA,IAAI,OAAO,UAAA,EAAY;AACrB,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,GAAG,qBAAA;AAAA,YACD,OAAA;AAAA,YACA,WAAW,GAAG,CAAA;AAAA,YACd,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK;AAAA;AACpC,SACF;AAAA,MACF,CAAA,MAAA,IAAW,MAAA,CAAO,oBAAA,KAAyB,KAAA,EAAO;AAChD,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,EAAI,WAAW,CAAA,sCAAA,EAAyC,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,MAC5E,CAAA,MAAA,IAAW,OAAO,MAAA,CAAO,oBAAA,KAAyB,QAAA,EAAU;AAC1D,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,GAAG,qBAAA;AAAA,YACD,OAAA;AAAA,YACA,MAAA,CAAO,oBAAA;AAAA,YACP,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK;AAAA;AACpC,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,wBAAA,CACd,aACA,OAAA,EACuD;AACvD,EAAA,MAAM,IAAA,GACH,WAAA,CAAY,IAAA,KACZ,OAAO,WAAA,CAAY,OAAO,QAAA,GAAW,uBAAA,CAAwB,WAAA,CAAY,EAAE,CAAA,GAAI,IAAA,CAAA;AAElF,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,kBAAA,CAAmB,IAAI,CAAA,EAAG;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAA,GAAgB,mBAAmB,IAAI,CAAA;AAC7C,EAAA,IAAI,cAAA,GAAsBgB,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,aAAa,CAAA;AACrD,EAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,cAAc,CAAA,EAAG;AAClC,IAAA,MAAM,YAAA,GAAoBD,gBAAA,CAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,aAAa,CAAA;AAC3D,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,YAAY,CAAA,EAAG;AAC/B,MAAA,cAAA,GAAiB,YAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAASA,cAAA,CAAA,YAAA,CAAa,cAAA,EAAgB,OAAO,CAAA;AACnD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,OAAO,EAAE,UAAA,EAAY,aAAA,EAAe,MAAA,EAAO;AAAA,EAC7C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,uBACd,WAAA,EACA,YAAA,EACA,OAAA,GAAkB,OAAA,CAAQ,KAAI,EACJ;AAC1B,EAAA,IAAI,MAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,QAAA;AAEJ,EAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,IAAA,IAAI,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA,EAAG;AAClC,MAAA,IAAI,WAAgBD,gBAAA,CAAA,UAAA,CAAW,YAAY,IACvC,YAAA,GACKA,gBAAA,CAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AACnC,MAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,QAAA,MAAM,YAAA,GAAoBD,gBAAA,CAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,YAAY,CAAA;AAC1D,QAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,YAAY,CAAA,EAAG;AAC/B,UAAA,QAAA,GAAW,YAAA;AAAA,QACb;AAAA,MACF;AACA,MAAA,IAAOA,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,QAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAASA,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAC,CAAA;AACtD,QAAA,QAAA,GAAW,YAAA;AAAA,MACb;AAAA,IACF,CAAA,MAAA,IAAW,kBAAA,CAAmB,YAAY,CAAA,EAAG;AAC3C,MAAA,MAAM,OAAA,GAAU,mBAAmB,YAAY,CAAA;AAC/C,MAAA,IAAI,QAAA,GAAgBD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA;AACzC,MAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,QAAA,MAAM,YAAA,GAAoBD,gBAAA,CAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,OAAO,CAAA;AACrD,QAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,YAAY,CAAA,EAAG;AAC/B,UAAA,QAAA,GAAW,YAAA;AAAA,QACb;AAAA,MACF;AACA,MAAA,IAAOA,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,QAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAASA,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAC,CAAA;AACtD,QAAA,QAAA,GAAW,OAAA;AAAA,MACb;AAAA,IACF;AAAA,EACF,CAAA,MACI;AACF,IAAA,MAAA,GAAS,YAAA;AACT,IAAA,QAAA,GAAY,MAAA,CAA4B,GAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,QAAA,EAAU,EAAA;AAAA,MACV,IAAI,WAAA,CAAY,EAAA;AAAA,MAChB,MAAM,WAAA,CAAY,IAAA;AAAA,MAClB,QAAQ,CAAC,CAAA,kCAAA,EAAqC,MAAA,CAAO,YAAY,CAAC,CAAA,CAAA,CAAG;AAAA,KACvE;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,WAAA,EAAa,MAAM,CAAA;AACxD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB,QAAA,EAAU,EAAA;AAAA,IACV,IAAI,WAAA,CAAY,EAAA;AAAA,IAChB,MAAM,WAAA,CAAY,IAAA;AAAA,IAClB,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,sBAAA,CACd,OAAA,GAAiC,EAAC,EACZ;AACtB,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,IAAI,cAAwB,EAAC;AAE7B,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,MAAA,GAAcD,gBAAA,CAAA,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA,GAC7C,QAAQ,UAAA,GACHA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,CAAQ,UAAU,CAAA;AACzC,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,MAAM,CAAA,EAAG;AACzB,MAAA,IAAOA,cAAA,CAAA,QAAA,CAAS,MAAM,CAAA,CAAE,WAAA,EAAY,EAAG;AACrC,QAAA,WAAA,GAAc,YAAY,MAAM,CAAA;AAAA,MAClC,CAAA,MAAA,IAAW,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACjC,QAAA,WAAA,GAAc,CAAC,MAAM,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,WAAA,GAAc,YAAY,OAAO,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,aAAwC,EAAC;AAC/C,EAAA,MAAM,UAAsC,EAAC;AAC7C,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,MAAM,UAAeD,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAG/D,IAAA,IACE,QAAQ,UAAA,CAAW,UAAU,KAC7B,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,IAC7B,OAAA,CAAQ,WAAW,aAAa,CAAA,IAChC,QAAQ,UAAA,CAAW,UAAU,KAC7B,OAAA,CAAQ,UAAA,CAAW,eAAe,CAAA,IAClC,OAAA,CAAQ,WAAW,OAAO,CAAA,IACzB,CAAC,OAAA,CAAQ,UAAA,IAAc,QAAQ,UAAA,CAAW,YAAY,KACvD,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,IAC1B,OAAA,CAAQ,WAAW,OAAO,CAAA,IAC1B,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EACrB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAaC,cAAA,CAAA,YAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AAC7C,MAAA,MAAM,WAAA,GAAc,mBAAmB,OAAO,CAAA;AAC9C,MAAA,IAAI,CAAC,WAAA,IAAe,CAAC,WAAA,CAAY,EAAA,EAAI;AACnC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,UAAA,GAAa,wBAAA,CAAyB,WAAA,EAAa,OAAO,CAAA;AAChE,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA;AAAA,MACF;AAEA,MAAA,cAAA,EAAA;AACA,MAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,WAAA,EAAa,UAAA,CAAW,MAAM,CAAA;AACnE,MAAA,MAAM,OAAA,GAAU,OAAO,MAAA,KAAW,CAAA;AAElC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,UAAA,EAAA;AACA,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,KAAA,EAAO,IAAA;AAAA,UACP,QAAA,EAAU,OAAA;AAAA,UACV,EAAA,EAAI,MAAA,CAAO,WAAA,CAAY,EAAE,CAAA;AAAA,UACzB,IAAA,EAAM,MAAA,CAAO,WAAA,CAAY,IAAA,IAAQ,EAAE,CAAA;AAAA,UACnC,UAAU,UAAA,CAAW,UAAA;AAAA,UACrB,QAAQ;AAAC,SACV,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,KAAA,EAAO,KAAA;AAAA,UACP,QAAA,EAAU,OAAA;AAAA,UACV,EAAA,EAAI,MAAA,CAAO,WAAA,CAAY,EAAE,CAAA;AAAA,UACzB,IAAA,EAAM,MAAA,CAAO,WAAA,CAAY,IAAA,IAAQ,EAAE,CAAA;AAAA,UACnC,UAAU,UAAA,CAAW,UAAA;AAAA,UACrB;AAAA,SACD,CAAA;AAED,QAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,UAAA,UAAA,CAAW,IAAA,CAAK;AAAA,YACd,QAAA,EAAU,OAAA;AAAA,YACV,EAAA,EAAI,MAAA,CAAO,WAAA,CAAY,EAAE,CAAA;AAAA,YACzB,IAAA,EAAM,MAAA,CAAO,WAAA,CAAY,IAAA,IAAQ,EAAE,CAAA;AAAA,YACnC,UAAU,UAAA,CAAW,UAAA;AAAA,YACrB,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,SAAS,GAAA,EAAc;AACrB,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,QAAA,EAAU,OAAA;AAAA,QACV,OAAA,EAAS,CAAA,qCAAA,EAAwC,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,OAC7D,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,WAAW,MAAA,KAAW,CAAA;AAAA,IAC/B,cAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA,EAAc,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,iBAAiB,UAAA,GAAa,CAAA;AAAA,IACpE,UAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACnfO,SAAS,QAAQ,IAAA,EAAsB;AAC5C,EAAA,OAAO,KACJ,SAAA,CAAU,KAAK,CAAA,CACf,OAAA,CAAQ,oBAAoB,EAAE,CAAA,CAC9B,WAAA,EAAY,CACZ,QAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,YAAY,EAAE,CAAA;AAC3B;AAEO,SAAS,yBAAyB,OAAA,EAAyB;AAChE,EAAA,MAAM,aAAA,GAAgB;AAAA,IACfC,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,QAAQ,CAAA;AAAA,IAC1CA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,WAAW,CAAA;AAAA,IAC7CA,gBAAA,CAAA,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,IACrBA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,UAAA,EAAY,SAAS;AAAA,GAC1C;AAEA,EAAA,IAAI,MAAA,GAAS,CAAA;AAEb,EAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC/B,IAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,UAAaA,cAAA,CAAA,WAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAC3D,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,IAAI,CAAC,CAAA,CAAE,WAAA,EAAY,EAAG;AACtB,QAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,iCAAiC,CAAA;AAC5D,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,GAAA,GAAM,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACjC,UAAA,IAAI,CAAC,KAAA,CAAM,GAAG,CAAA,IAAK,MAAM,MAAA,EAAQ;AAC/B,YAAA,MAAA,GAAS,GAAA;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,GAAS,CAAA;AAClB;AAEO,SAAS,kBAAkB,OAAA,EAA4D;AAC5F,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,UAAA;AACvC,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,6BAAA;AACjC,EAAA,MAAM,OAAA,GAAyB,QAAQ,OAAA,IAAW,UAAA;AAClD,EAAA,MAAM,OAAA,GAAA,qBAAc,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AACrD,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAK;AAE/B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,eAAyB,EAAC;AAEhC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,QAAA,EAAU,EAAA;AAAA,MACV,WAAA,EAAa,EAAA;AAAA,MACb,OAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,MACX,cAAc,EAAC;AAAA,MACf,gBAAgB,EAAC;AAAA,MACjB,MAAA,EAAQ,CAAC,+CAA4C;AAAA,KACvD;AAAA,EACF;AAGA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,EAAA;AACnD,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAM,KAAA,GAAQ,eAAe,IAAA,EAAK;AAClC,IAAA,IAAA,GAAO,QAAQ,KAAK,CAAA;AACpB,IAAA,WAAA,GAAc,MAAM,WAAA,EAAY;AAChC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,iCAAiC,CAAA;AAC3D,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,GAAS,MAAM,CAAC,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,OAAA,GAAU,yBAAyB,OAAO,CAAA;AAChD,IAAA,MAAA,GAAS,MAAA,CAAO,OAAO,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,QAAQ,IAAI,CAAA;AAC7B,IAAA,MAAM,MAAA,GAAS,OAAA,KAAY,OAAA,GAAU,OAAA,GAAU,KAAA;AAC/C,IAAA,IAAA,GAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,IAAI,QAAQ,CAAA,CAAA;AACtC,IAAA,WAAA,GAAc,CAAA,EAAG,OAAO,WAAA,EAAa,IAAI,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,WAAA,EAAa,CAAA,CAAA;AAAA,EAC3E;AAGA,EAAA,MAAM,OAAA,GAAU,cAAc,SAAS,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,qBAAA,CAAsB,OAAA,EAAS,IAAI,CAAA;AAE7D,EAAA,IAAOA,cAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC5B,IAAA,MAAM,QAAA,GAAcA,2BAAY,SAAS,CAAA;AACzC,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,QAAA,EAAU,IAAA;AAAA,QACV,WAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA;AAAA,QACA,cAAc,EAAC;AAAA,QACf,gBAAgB,EAAC;AAAA,QACjB,MAAA,EAAQ,CAAC,CAAA,0BAAA,EAA6B,SAAS,CAAA,kCAAA,CAA8B;AAAA,OAC/E;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAGA,cAAA,CAAA,SAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAC7C;AAGA,EAAA,MAAM,UAAA,GAAa,YAAY,OAAO,CAAA;AACtC,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAGtB;AAEF,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAaA,cAAA,CAAA,YAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AAC7C,MAAA,MAAM,EAAE,WAAA,EAAY,GAAI,gBAAA,CAAiB,OAAO,CAAA;AAChD,MAAA,IAAI,WAAA,IAAe,YAAY,EAAA,EAAI;AACjC,QAAA,MAAM,EAAA,GAAK,MAAA,CAAO,WAAA,CAAY,EAAE,CAAA;AAChC,QAAA,MAAM,MAAA,GAAS,uBAAuB,OAAO,CAAA;AAC7C,QAAA,MAAM,QAAQ,OAAO,WAAA,CAAY,KAAA,KAAU,QAAA,GAAW,YAAY,KAAA,GAAQ,KAAA,CAAA;AAC1E,QAAA,WAAA,CAAY,GAAA,CAAI,IAAI,EAAE,EAAA,EAAI,MAAM,WAAA,EAAa,KAAA,EAAO,QAAQ,CAAA;AAAA,MAC9D;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,MAAM,UAAU,OAAA,CAAQ,IAAA;AACxB,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,QAAA,YAAA,CAAa,IAAA,CAAK,GAAG,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,MAC3E;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AACtC,IAAA,YAAA,CAAa,IAAA,CAAK,GAAG,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,EAC9E;AAEA,EAAA,IAAI,sBAAA;AACJ,EAAA,MAAM,iBAA0F,EAAC;AACjG,EAAA,MAAM,kBAA4B,EAAC;AACnC,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IAAA,KAAA,MAAW,MAAM,YAAA,EAAc;AAC7B,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AACnC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,cAAA,CAAe,IAAA,CAAK;AAAA,UAClB,IAAI,QAAA,CAAS,EAAA;AAAA,UACb,MAAA,EAAQ,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,UACjC,OAAO,QAAA,CAAS,KAAA;AAAA,UAChB,OAAA,EAAS,CAAA,eAAA,EAAe,QAAA,CAAS,WAAA,EAAa,IAAA,IAAQ,WAAW,CAAA,EAAA,EAAK,QAAA,CAAS,KAAA,IAAS,QAAA,CAAS,EAAE,CAAA,CAAA;AAAA,SACpG,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,MAAM,gBAAA,GACJ,cAAA,CAAe,MAAA,GAAS,CAAA,GACpB,CAAA;AAAA,EAAenB,sBAAAA,CACZ,IAAA;AAAA,MACC,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,OAAA,EAAS,CAAA,CAAE,SAAQ,CAAE,CAAA;AAAA,MAC9E,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAA,EAAW,EAAA;AAAG,KAC7B,CACC,IAAA,EAAK,CACL,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,CAAA,KAAM,KAAK,CAAC,CAAA,CAAE,CAAA,CACnB,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA,GACb,EAAA;AAEN,IAAA,MAAMoB,SAAAA,GAAgBF,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,SAAS,CAAA;AAC/C,IAAA,MAAMG,UAAAA,GAAY;AAAA,MAChB,EAAA,EAAI,QAAQ,WAAW,CAAA,CAAA;AAAA,MACvB,IAAA,EAAM,eAAA;AAAA,MACN,WAAA,EAAa,WAAA;AAAA,MACb,OAAA,EAAS,OAAA;AAAA,MACT,mBAAA,EAAqB,SAAA;AAAA,MACrB,iBAAiB,CAAC,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAAI,UAAU,YAAY;AAAA,KAC7D;AACA,IAAA,MAAMC,YAAAA,GAAc,CAAA;AAAA,SAAA,EACb,WAAW;AAAA;AAAA,WAAA,EAET,WAAW;AAAA;AAAA;AAAA;AAAA,MAAA,EAIhB,WAAW,CAAA;AAAA;AAAA;AAAA,EAGjB,gBAAgB,CAAA;AAAA;AAAA;AAAA;;AAAA,uCAAA,EAKuB,WAAW;;AAAA;AAAA,EAGlD,IAAI;;AAAA;;AAAA;AAAA,CAAA,EAKH,WAAW,CAAA;AAAA,eAAA,EACG,WAAW,MAAM,IAAI;AAAA;AAAA,wDAAA,EAEoB,IAAI,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAS1D,IAAGH,cAAA,CAAA,aAAA,CAAcC,SAAAA,EAAUE,YAAAA,EAAa,OAAO,CAAA;AAC/C,IAAA,YAAA,CAAa,KAAKF,SAAQ,CAAA;AAE1B,IAAA,MAAMG,kBAAAA,GAAoB,oBAAoBD,YAAW,CAAA;AACzD,IAAA,IAAIC,kBAAAA,CAAkB,WAAW,CAAA,EAAG;AAClC,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,CAAA,gIAAA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAMC,aAAAA,GAAe,OAAA,CAAQ,iBAAA,CAAkB,SAAS,CAAA;AACxD,IAAA,IAAI,CAACA,cAAa,KAAA,EAAO;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,GAAGA,aAAAA,CAAa,MAAM,CAAA;AAAA,IACpC;AAEA,IAAA,MAAMC,eAAAA,GAAiB,sBAAA,CAAuBJ,UAAAA,EAAkB,eAAA,EAAiB,OAAO,CAAA;AACxF,IAAA,IAAI,CAACI,gBAAe,KAAA,EAAO;AACzB,MAAA,MAAA,CAAO,IAAA,CAAK,GAAGA,eAAAA,CAAe,MAAM,CAAA;AAAA,IACtC;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,MAC3B,QAAA,EAAU,IAAA;AAAA,MACV,WAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAE7B,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,IAAI,CAAA,CAAE,WAAA,EAAY;AAChD,IAAA,MAAM,KAAA,GAAQ,CAAA,GAAA,EAAM,MAAM,CAAA,CAAA,EAAI,aAAa,CAAA,IAAA,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,CAAA,GAAA,EAAM,MAAM,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA;AAE1C,IAAA,MAAM,UAAA,GAAkBP,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,SAAS,CAAA;AACxD,IAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,MAAGA,cAAA,CAAA,SAAA,CAAU,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,WAAA,GAAmBD,gBAAA,CAAA,IAAA,CAAK,UAAA,EAAY,CAAA,EAAG,KAAK,CAAA,GAAA,CAAK,CAAA;AACvD,IAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,WAAW,CAAA,EAAG;AAC/B,MAAA,MAAM,UAAA,GAAa,CAAA;AAAA,IAAA,EACnB,KAAK;AAAA;AAAA,QAAA,EAED,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAMR,IAAI;AAAA;AAAA;AAAA;AAAA,MAAA,EAIF,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAAA,EAMT,KAAK,KAAK,IAAI;;AAAA;AAAA,uDAAA,EAGuC,IAAI,CAAA;;AAAA;;AAAA;;AAAA;AAAA,CAAA,EAO1D,KAAK,CAAA;AAAA,SAAA,EACG,IAAI;AAAA;AAAA,uCAAA,EAE0B,IAAI;AAAA;;AAAA;AAAA;AAAA,4BAAA,EAKf,IAAI,CAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA,cAAA,EAUlB,OAAO,CAAA,GAAA,EAAM,MAAM,CAAA,+CAAA,EAA+C,WAAW,MAAM,WAAW,CAAA;AAAA,CAAA;AAExG,MAAGA,cAAA,CAAA,aAAA,CAAc,WAAA,EAAa,UAAA,EAAY,OAAO,CAAA;AACjD,MAAA,sBAAA,GAAyB,WAAA;AACzB,MAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAE7B,MAAA,MAAM,MAAA,GAAS,uBAAuB,UAAU,CAAA;AAChD,MAAA,cAAA,CAAe,IAAA,CAAK;AAAA,QAClB,EAAA,EAAI,KAAA;AAAA,QACJ,MAAA,EAAQ,UAAU,MAAM,CAAA,CAAA;AAAA,QACxB,KAAA,EAAO,IAAA;AAAA,QACP,OAAA,EAAS,4DAAsD,WAAW,CAAA,CAAA;AAAA,OAC3E,CAAA;AACD,MAAA,eAAA,CAAgB,KAAK,KAAK,CAAA;AAC1B,MAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,IACvB;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,KAAA,MAAW,MAAM,YAAA,EAAc;AAC7B,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AACnC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,cAAA,CAAe,IAAA,CAAK;AAAA,UAClB,IAAI,QAAA,CAAS,EAAA;AAAA,UACb,MAAA,EAAQ,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,UACjC,OAAO,QAAA,CAAS,KAAA;AAAA,UAChB,OAAA,EAAS,CAAA,eAAA,EAAe,QAAA,CAAS,WAAA,CAAY,IAAA,IAAQ,WAAW,CAAA,EAAA,EAAK,QAAA,CAAS,KAAA,IAAS,QAAA,CAAS,EAAE,CAAA,CAAA;AAAA,SACnG,CAAA;AAED,QAAA,IAAI,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,IAAK,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,IAAK,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,EAAG;AACzE,UAAA,IAAI,CAAC,eAAA,CAAgB,QAAA,CAAS,EAAE,CAAA,EAAG,eAAA,CAAgB,KAAK,EAAE,CAAA;AAAA,QAC5D,CAAA,MAAA,IAAW,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,EAAG;AAC/B,UAAA,IAAI,CAAC,WAAA,CAAY,QAAA,CAAS,EAAE,CAAA,EAAG,WAAA,CAAY,KAAK,EAAE,CAAA;AAElD,UAAA,KAAA,MAAW,CAAC,OAAA,EAAS,QAAQ,CAAA,IAAK,WAAA,CAAY,SAAQ,EAAG;AACvD,YAAA,MAAM,OAAA,GAAU,QAAA,CAAS,WAAA,CAAY,cAAc,CAAA;AACnD,YAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,UAAU,OAAA,GAAU,CAAC,OAAO,CAAA,GAAI,EAAC;AAC7E,YAAA,IAAI,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA,EAAG;AAC3B,cAAA,IAAI,QAAQ,UAAA,CAAW,KAAK,KAAK,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AAC1D,gBAAA,IAAI,CAAC,eAAA,CAAgB,QAAA,CAAS,OAAO,CAAA,EAAG,eAAA,CAAgB,KAAK,OAAO,CAAA;AACpE,gBAAA,IAAI,CAAC,eAAe,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,OAAO,CAAA,EAAG;AACjD,kBAAA,cAAA,CAAe,IAAA,CAAK;AAAA,oBAClB,EAAA,EAAI,OAAA;AAAA,oBACJ,MAAA,EAAQ,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,oBACjC,OAAO,QAAA,CAAS,KAAA;AAAA,oBAChB,OAAA,EAAS,6BAA6B,EAAE,CAAA;AAAA,mBACzC,CAAA;AAAA,gBACH;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAA,MAAA,IAAW,GAAG,UAAA,CAAW,UAAU,KAAK,EAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AACjE,UAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA,EAAG,UAAA,CAAW,KAAK,EAAE,CAAA;AAAA,QAClD,CAAA,MAAA,IAAW,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,EAAG;AAC/B,UAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,EAAE,CAAA,EAAG,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,QAC9C;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,MAAM,UAAA,GAAkBD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,SAAS,CAAA;AACxD,QAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,UAAGA,cAAA,CAAA,SAAA,CAAU,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,QAC9C;AACA,QAAA,MAAM,WAAA,GAAmBD,gBAAA,CAAA,IAAA,CAAK,UAAA,EAAY,CAAA,EAAG,EAAE,CAAA,GAAA,CAAK,CAAA;AACpD,QAAA,MAAM,UAAA,GAAa,CAAA;AAAA,IAAA,EACrB,EAAE;AAAA,MAAA,EACA,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,GAAI,UAAA,GAAa,GAAG,UAAA,CAAW,UAAU,CAAA,GAAI,sBAAA,GAAyB,aAAa;AAAA,QAAA,EACpG,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,EAQN,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAAA,EAMN,EAAE,KAAK,IAAI;;AAAA;AAAA,qCAAA,EAGqB,WAAW,CAAA;;AAAA;;AAAA;AAAA,CAAA,EAK5C,EAAE,CAAA;AAAA,SAAA,EACM,IAAI;AAAA;AAAA,yCAAA,EAE4B,IAAI,CAAA;AAAA,qCAAA,EACR,EAAE,CAAA;AAAA;AAAA;AAAA,CAAA;AAIjC,QAAGC,cAAA,CAAA,aAAA,CAAc,WAAA,EAAa,UAAA,EAAY,OAAO,CAAA;AACjD,QAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAC7B,QAAA,sBAAA,GAAyB,WAAA;AAEzB,QAAA,MAAM,MAAA,GAAS,uBAAuB,UAAU,CAAA;AAChD,QAAA,cAAA,CAAe,IAAA,CAAK;AAAA,UAClB,EAAA;AAAA,UACA,MAAA,EAAQ,UAAU,MAAM,CAAA,CAAA;AAAA,UACxB,KAAA,EAAO,IAAA;AAAA,UACP,OAAA,EAAS,uBAAuB,WAAW,CAAA;AAAA,SAC5C,CAAA;AAED,QAAA,IAAI,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,EAAG;AACxB,UAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AAAA,QACrB,CAAA,MAAA,IAAW,EAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AACpC,UAAA,UAAA,CAAW,KAAK,EAAE,CAAA;AAAA,QACpB,CAAA,MAAO;AACL,UAAA,eAAA,CAAgB,KAAK,EAAE,CAAA;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,eAAA,CAAgB,WAAW,CAAA,EAAG;AAChC,IAAA,MAAM,aAAA,GAAgB,MAAM,MAAM,CAAA,CAAA,EAAI,QAAQ,IAAI,CAAA,CAAE,aAAa,CAAA,IAAA,CAAA;AACjE,IAAA,eAAA,CAAgB,KAAK,aAAa,CAAA;AAAA,EACpC;AAGA,EAAA,MAAM,qBAAqBnB,sBAAAA,CACxB,IAAA;AAAA,IACC,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACzB,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,SAAS,CAAA,CAAE;AAAA,KACb,CAAE,CAAA;AAAA,IACF,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAA,EAAW,EAAA;AAAG,GAC7B,CACC,IAAA,EAAK,CACL,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA,CACzB,KAAK,IAAI,CAAA;AAGZ,EAAA,MAAM,YAAA,GAAoBkB,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,aAAa,CAAA;AACvD,EAAA,MAAM,eAAA,GAAkB,CAAA;AAAA,IAAA,EACpB,WAAW;AAAA;AAAA,QAAA,EAEP,IAAI,CAAA;AAAA;AAAA,SAAA,EAEH,MAAM,CAAA;AAAA;AAAA,EAEf,kBAAkB;AAAA;;AAAA,uBAAA,EAGK,WAAW;;AAAA;AAAA,EAGlC,IAAI;;AAAA;AAAA;AAAA,CAAA;AAKJ,EAAGC,cAAA,CAAA,aAAA,CAAc,YAAA,EAAc,eAAA,EAAiB,OAAO,CAAA;AACvD,EAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAG9B,EAAA,MAAM,QAAA,GAAgBD,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,SAAS,CAAA;AAC/C,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,EAAA,EAAI,QAAQ,WAAW,CAAA,CAAA;AAAA,IACvB,IAAA,EAAM,eAAA;AAAA,IACN,WAAA,EAAa,WAAA;AAAA,IACb,OAAA;AAAA,IACA,mBAAA,EAAqB,SAAA;AAAA,IACrB,eAAA,EAAiB,CAAC,CAAA,CAAA,EAAI,WAAW,IAAI,YAAY;AAAA,GACnD;AACA,EAAA,MAAM,WAAA,GAAc,CAAA;AAAA,SAAA,EACX,WAAW;AAAA;AAAA,WAAA,EAET,WAAW;AAAA,SAAA,EACb,OAAO;AAAA;AAAA;AAAA,MAAA,EAGV,WAAW,CAAA;AAAA;AAAA;;AAAA,0BAAA,EAIS,WAAW;;AAAA;;AAAA;AAAA,CAAA,EAKpC,WAAW,CAAA;AAAA,SAAA,EACH,IAAI;AAAA;AAAA,sCAAA,EAEyB,IAAI;AAAA;;AAAA;AAAA;AAAA,4BAAA,EAKd,IAAI,CAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA,CAAA,EAS/B,WAAW,CAAA;AAAA,iCAAA,EACqB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAO5C,EAAGC,cAAA,CAAA,aAAA,CAAc,QAAA,EAAU,WAAA,EAAa,OAAO,CAAA;AAC/C,EAAA,YAAA,CAAa,KAAK,QAAQ,CAAA;AAE1B,EAAA,MAAM,iBAAA,GAAoB,oBAAoB,WAAW,CAAA;AACzD,EAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AAClC,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,CAAA,gIAAA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAkBD,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,WAAW,CAAA;AACnD,EAAA,MAAM,aAAA,GAAgB,CAAA;AAAA,QAAA,EACd,WAAW;AAAA;AAAA,WAAA,EAER,WAAW;AAAA,8BAAA,EACE,IAAI,CAAA;AAAA;AAAA;AAAA,cAAA,EAGd,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKzB,kBAAkB;AAAA;;AAAA,wBAAA,EAGA,WAAW;;AAAA;AAAA;;AAAA;AAAA,wEAAA,EAM2C,IAAI,CAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA,cAAA,EAY9D,OAAO,CAAA,GAAA,EAAM,MAAM,CAAA,yCAAA,EAAsC,WAAW,CAAA;AAAA,CAAA;AAElF,EAAGC,cAAA,CAAA,aAAA,CAAc,UAAA,EAAY,aAAA,EAAe,OAAO,CAAA;AACnD,EAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAG5B,EAAA,MAAM,SAAA,GAAiBD,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,EAAA,EAAI,YAAY,WAAW,CAAA,CAAA;AAAA,IAC3B,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,WAAA;AAAA,IACb,KAAA,EAAO,oCAAoC,IAAI,CAAA,CAAA;AAAA,IAC/C,OAAA,EAAS,OAAA;AAAA,IACT,gBAAA,EAAkB,KAAA;AAAA,IAClB,MAAA,EAAQ,OAAA;AAAA,IACR,oBAAA,EAAsB;AAAA,MACpB,wBAAA,EAA0B,CAAA;AAAA,MAC1B,yBAAA,EAA2B,CAAA;AAAA,MAC3B,iBAAA,EAAmB,CAAA;AAAA,MACnB,wBAAA,EAA0B;AAAA,KAC5B;AAAA,IACA,KAAA,EAAO;AAAA,MACL;AAAA,QACE,EAAA,EAAI,SAAA;AAAA,QACJ,KAAA,EAAO,yDAAA;AAAA,QACP,UAAA,EAAY,KAAA;AAAA,QACZ,YAAA,EAAc,KAAA;AAAA,QACd,eAAA,EAAiB,YAAA;AAAA,QACjB,YAAA,EAAc;AAAA,UACZ,MAAA,EAAQ,cAAA;AAAA,UACR,qBAAA,EAAuB;AAAA,SACzB;AAAA,QACA,aAAA,EAAe,iBAAA;AAAA,QACf,MAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,EAAA,EAAI,SAAA;AAAA,QACJ,KAAA,EAAO,wDAAA;AAAA,QACP,UAAA,EAAY,QAAA;AAAA,QACZ,YAAA,EAAc,QAAA;AAAA,QACd,eAAA,EAAiB,mBAAA;AAAA,QACjB,YAAA,EAAc;AAAA,UACZ,MAAA,EAAQ,qBAAA;AAAA,UACR,qBAAA,EAAuB;AAAA,SACzB;AAAA,QACA,aAAA,EAAe,iBAAA;AAAA,QACf,MAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,UAAA,EAAY,IAAA;AAAA,IACZ,eAAA,EAAiB;AAAA,GACnB;AAEA,EAAA,MAAM,YAAA,GAAe,CAAA;AAAA,EACrBlB,sBAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAA,EAAW,EAAA,EAAI,CAAA,CAAE,IAAA,EAAM;AAAA;;AAAA,mCAAA,EAGpB,WAAW;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,4DAAA,EAuBQ,IAAI,CAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA,cAAA,EAU5C,OAAO,CAAA,GAAA,EAAM,MAAM,CAAA,2DAAA,EAA2D,WAAW,CAAA;AAAA,CAAA;AAEvG,EAAGmB,cAAA,CAAA,aAAA,CAAc,SAAA,EAAW,YAAA,EAAc,OAAO,CAAA;AACjD,EAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAG3B,EAAA,MAAM,QAAA,GAKF;AAAA,IACF,YAAA,EAAc;AAAA,GAChB;AACA,EAAA,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,QAAA,GAAW,WAAA;AAChD,EAAA,IAAI,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,oBAAA,GAAuB,UAAA;AAC3D,EAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,aAAA,GAAgB,QAAA;AAElD,EAAA,MAAM,OAAA,GAA0B;AAAA,IAC9B,EAAA,EAAI,OAAO,WAAW,CAAA,CAAA;AAAA,IACtB,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,wCAAqC,IAAI,CAAA,CAAA;AAAA,IAChD,QAAA,EAAU,WAAA;AAAA,IACV,OAAA,EAAS,OAAA;AAAA,IACT,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAClC,QAAA;AAAA,IACA,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACpC,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,SAAS,CAAA,CAAE;AAAA,KACb,CAAE;AAAA,GACJ;AAGA,EAAA,MAAM,gBAAgB,4BAAA,CAA6B;AAAA,IACjD,OAAA;AAAA,IACA,QAAA,EAAU,IAAA;AAAA,IACV,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AAG/B,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,iBAAA,CAAkB,SAAS,CAAA;AACxD,EAAA,IAAI,CAAC,aAAa,KAAA,EAAO;AACvB,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,YAAA,CAAa,MAAM,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,cAAA,GAAiB,sBAAA,CAAuB,SAAA,EAAkB,eAAA,EAAiB,OAAO,CAAA;AACxF,EAAA,IAAI,CAAC,eAAe,KAAA,EAAO;AACzB,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,cAAA,CAAe,MAAM,CAAA;AAAA,EACtC;AAEA,EAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,OAAA,EAAgB,OAAA,EAAS,OAAO,CAAA;AAC/E,EAAA,IAAI,CAAC,gBAAgB,KAAA,EAAO;AAC1B,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,eAAA,CAAgB,MAAM,CAAA;AAAA,EACvC;AAEA,EAAA,MAAM,iBAAA,GAAoB,sBAAA,CAAuB,OAAA,EAAgB,SAAA,EAAW,OAAO,CAAA;AACnF,EAAA,IAAI,CAAC,kBAAkB,KAAA,EAAO;AAC5B,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,iBAAA,CAAkB,MAAM,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,QAAA,EAAU,IAAA;AAAA,IACV,WAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,sBAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;ACruBO,SAAS,oBAAA,CAAqB,GAAA,GAAyB,OAAA,CAAQ,GAAA,EAAoB;AACxF,EAAA,MAAM,cAAA,GAAiB,IAAI,gBAAA,EAAkB,IAAA,MAAU,GAAA,CAAI,SAAA,EAAW,MAAK,IAAK,MAAA;AAEhF,EAAA,IAAI,QAAA,GAAuB,SAAA;AAC3B,EAAA,IAAI,GAAA,CAAI,cAAc,MAAA,EAAQ;AAC5B,IAAA,QAAA,GAAW,QAAA;AAAA,EACb,CAAA,MAAA,IAAW,GAAA,CAAI,QAAA,KAAa,MAAA,EAAQ;AAClC,IAAA,QAAA,GAAW,OAAA;AAAA,EACb,WAAW,GAAA,CAAI,gBAAA,KAAqB,MAAA,IAAa,GAAA,CAAI,qBAAqB,MAAA,EAAW;AACnF,IAAA,QAAA,GAAW,WAAA;AAAA,EACb,CAAA,MAAA,IAAW,GAAA,CAAI,cAAA,KAAmB,MAAA,EAAQ;AACxC,IAAA,QAAA,GAAW,QAAA;AAAA,EACb;AAGA,EAAA,IAAI,OAAA,GAA8B,GAAA,CAAI,WAAA,EAAa,IAAA,EAAK,IAAK,MAAA;AAC7D,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,IAAI,aAAa,QAAA,EAAU;AACzB,MAAA,OAAA,GACE,GAAA,CAAI,mCAAA,EAAqC,IAAA,EAAK,IAC9C,GAAA,CAAI,kBAAA,EAAoB,IAAA,EAAK,IAC7B,GAAA,CAAI,gBAAA,EAAkB,IAAA,EAAK,IAC3B,MAAA;AAAA,IACJ,CAAA,MAAA,IAAW,aAAa,OAAA,EAAS;AAC/B,MAAA,MAAM,WAAA,GACJ,GAAA,CAAI,+BAAA,EAAiC,IAAA,EAAK,IAC1C,GAAA,CAAI,kBAAA,EAAoB,IAAA,EAAK,IAC7B,GAAA,CAAI,sBAAA,EAAwB,IAAA,EAAK;AACnC,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,OAAA,GAAU,WAAA,CAAY,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAA;AAAA,MACpD;AAAA,IACF,CAAA,MAAA,IAAW,aAAa,WAAA,EAAa;AACnC,MAAA,OAAA,GACE,IAAI,gBAAA,EAAkB,IAAA,MACtB,GAAA,CAAI,+BAAA,EAAiC,MAAK,IAC1C,MAAA;AAAA,IACJ,CAAA,MAAA,IAAW,aAAa,QAAA,EAAU;AAChC,MAAA,OAAA,GACE,IAAI,eAAA,EAAiB,IAAA,MACrB,GAAA,CAAI,eAAA,EAAiB,MAAK,IAC1B,MAAA;AAAA,IACJ;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GACJ,GAAA,CAAI,QAAA,EAAU,IAAA,EAAK,IACnB,GAAA,CAAI,sBAAA,EAAwB,IAAA,EAAK,IACjC,GAAA,CAAI,mCAAA,EAAqC,IAAA,EAAK,IAC9C,MAAA;AAGF,EAAA,MAAM,MAAA,GACJ,IAAI,OAAA,EAAS,IAAA,MACb,GAAA,CAAI,4BAAA,EAA8B,MAAK,IACvC,MAAA;AAGF,EAAA,MAAM,OACJ,GAAA,CAAI,SAAA,EAAW,IAAA,EAAK,IACpB,IAAI,oBAAA,EAAsB,IAAA,EAAK,IAC/B,GAAA,CAAI,kCAAkC,IAAA,EAAK,IAC3C,GAAA,CAAI,eAAA,EAAiB,MAAK,IAC1B,MAAA;AAGF,EAAA,IAAI,MAAA,GAAS,iCAAA;AACb,EAAA,IAAI,aAAa,QAAA,EAAU;AACzB,IAAA,MAAA,GAAS,+CAAA;AAAA,EACX,CAAA,MAAA,IAAW,aAAa,QAAA,EAAU;AAChC,IAAA,MAAA,GAAS,uCAAA;AAAA,EACX,CAAA,MAAA,IAAW,aAAa,OAAA,EAAS;AAC/B,IAAA,MAAA,GAAS,6CAAA;AAAA,EACX,CAAA,MAAA,IAAW,aAAa,WAAA,EAAa;AACnC,IAAA,MAAA,GAAS,iDAAA;AAAA,EACX;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,YAAA,CACd,GAAA,EACA,KAAA,EACA,GAAA,GAAyB,QAAQ,GAAA,EAC3B;AAEN,EAAA,MAAM,aAAa,GAAA,CAAI,aAAA;AACvB,EAAA,IAAI,UAAA,IAAiBO,cAAA,CAAA,UAAA,CAAW,UAAU,CAAA,EAAG;AAC3C,IAAGA,cAAA,CAAA,cAAA,CAAe,UAAA,EAAY,CAAA,EAAG,GAAG,IAAI,KAAK;AAAA,CAAA,EAAM,OAAO,CAAA;AAAA,EAC5D;AAGA,EAAA,IAAI,GAAA,CAAI,aAAa,MAAA,EAAQ;AAC3B,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gCAAA,EAAmC,GAAG,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAE,CAAA;AAAA,EAC7E;AAGA,EAAA,MAAM,aAAA,GACJ,GAAA,CAAI,cAAA,IACJ,GAAA,CAAI,UAAA,KACH,GAAA,CAAI,SAAA,KAAc,MAAA,IAAU,GAAA,CAAI,gBAAA,KAAqB,MAAA,GAClD,mBAAA,GACA,MAAA,CAAA;AAEN,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,YAAA,GAAe,IAAI,WAAA,EAAY;AACrC,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAC1C,IAAA,IAAOA,cAAA,CAAA,UAAA,CAAW,aAAa,CAAA,EAAG;AAChC,MAAA,MAAM,OAAA,GAAaA,cAAA,CAAA,YAAA,CAAa,aAAA,EAAe,OAAO,CAAA;AACtD,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,MAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,KAAQ;AACjC,QAAA,IAAI,IAAA,CAAK,UAAA,CAAW,CAAA,EAAG,YAAY,GAAG,CAAA,EAAG;AACvC,UAAA,KAAA,GAAQ,IAAA;AACR,UAAA,OAAO,SAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,QAAA,CAAS,KAAK,SAAS,CAAA;AAAA,MACzB;AACA,MAAGA,cAAA,CAAA,aAAA,CAAc,aAAA,EAAe,QAAA,CAAS,MAAA,CAAO,OAAK,CAAA,CAAE,IAAA,EAAK,KAAM,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAAI,MAAM,OAAO,CAAA;AAAA,IAClG,CAAA,MAAO;AACL,MAAGA,cAAA,CAAA,aAAA,CAAc,aAAA,EAAe,SAAA,GAAY,IAAA,EAAM,OAAO,CAAA;AAAA,IAC3D;AAAA,EACF;AACF;;;ACvIO,SAAS,cAAc,SAAA,EAAqC;AACjE,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,UAAA;AACH,MAAA,OAAO,IAAI,eAAA,EAAgB;AAAA,IAC7B,KAAK,SAAA;AACH,MAAA,OAAO,IAAI,cAAA,EAAe;AAAA,IAC5B;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,SAAS,CAAA,CAAE,CAAA;AAAA;AAEhE;AAEO,SAAS,6BAA6B,OAAA,EAAoC;AAC/E,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,OAAA,CAAQ,SAAS,CAAA;AAC/C,EAAA,OAAO,QAAQ,cAAA,CAAe;AAAA,IAC5B,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAAA,IACxC,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,SAAS,OAAA,CAAQ;AAAA,GAClB,CAAA;AACH;AAEO,SAAS,0BAA0B,SAAA,EAA0C;AAClF,EAAA,MAAM,QAAA,GAAW,IAAI,eAAA,EAAgB;AACrC,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,WAAA,CAAY,SAAS,CAAA;AAC1C,EAAA,IAAI,KAAK,OAAO,GAAA;AAEhB,EAAA,MAAM,OAAA,GAAU,IAAI,cAAA,EAAe;AACnC,EAAA,OAAO,OAAA,CAAQ,YAAY,SAAS,CAAA;AACtC;AAEO,SAAS,uBACd,OAAA,EAC6D;AAC7D,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAA4D;AAOpF,EAAA,MAAM,mBAAA,GAAsB;AAAA,IACrBC,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,QAAQ,CAAA;AAAA,IAC1CA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,WAAW,CAAA;AAAA,IAC7CA,gBAAA,CAAA,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,IACrBA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,UAAA,EAAY,SAAS;AAAA,GAC1C;AAEA,EAAA,KAAA,MAAW,aAAa,mBAAA,EAAqB;AAC3C,IAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC/B,IAAA,MAAM,UAAaA,cAAA,CAAA,WAAA,CAAY,SAAA,EAAW,EAAE,aAAA,EAAe,MAAM,CAAA;AACjE,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,CAAC,KAAA,CAAM,WAAA,EAAY,EAAG;AAE1B,MAAA,IAAI,KAAA,CAAM,SAAS,SAAA,IAAa,KAAA,CAAM,SAAS,QAAA,IAAY,KAAA,CAAM,SAAS,cAAA,EAAgB;AAE1F,MAAA,MAAM,SAAA,GAAiBD,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,KAAA,CAAM,IAAI,CAAA;AACjD,MAAA,IAAI,eAAA,CAAgB,WAAA,EAAa,SAAS,CAAA,EAAG;AAE7C,MAAA,MAAM,OAAA,GAAU,0BAA0B,SAAS,CAAA;AACnD,MAAA,IAAI,OAAA,IAAW,QAAQ,EAAA,EAAI;AACzB,QAAA,WAAA,CAAY,GAAA,CAAI,SAAA,EAAW,EAAE,OAAA,EAAS,WAAW,CAAA;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,WAAA;AACT;AAEA,SAAS,eAAA,CAAgB,KAAuB,GAAA,EAAsB;AACpE,EAAA,MAAM,IAAA,GAAYA,yBAAQ,GAAG,CAAA;AAC7B,EAAA,KAAA,MAAW,GAAA,IAAO,GAAA,CAAI,IAAA,EAAK,EAAG;AAC5B,IAAA,IAASA,gBAAA,CAAA,OAAA,CAAQ,GAAG,CAAA,KAAM,IAAA,EAAM,OAAO,IAAA;AAAA,EACzC;AACA,EAAA,OAAO,KAAA;AACT;;;ACrDO,SAAS,iBAAiB,OAAA,EAAqE;AACpG,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,6BAA6B,CAAA;AACzD,EAAA,IAAI,CAAC,OAAO,OAAO,EAAE,aAAa,EAAC,EAAG,MAAM,OAAA,EAAQ;AAEpD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS3B,sBAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACjC,IAAA,MAAM,cAAc,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,GAAY,SAAiC,EAAC;AAC9F,IAAA,OAAO,EAAE,aAAa,IAAA,EAAM,OAAA,CAAQ,UAAU,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,CAAA,EAAE;AAAA,EACjE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,WAAA,EAAa,EAAC,EAAG,IAAA,EAAM,OAAA,CAAQ,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,CAAA,EAAE;AAAA,EACrE;AACF;AAEO,SAAS,mBAAmB,cAAA,EAAkC;AACnE,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA;AACvC,EAAA,KAAA,MAAW,WAAW,KAAA,EAAO;AAC3B,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,EAAK;AAC1B,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,GAAG,CAAC,CAAA;AAClE,MAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,QAAA,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,IAAI,CAAC,CAAA;AACjC;AAEO,SAAS,kCAAA,CAAmC,MAAyB,MAAA,EAAwB;AAClG,EAAA,MAAM,OAAO,MAAA,KAAW,CAAA;AACxB,EAAA,MAAM,WAAA,GAAwB;AAAA,IAC5B,kDAAA;AAAA,IACA,EAAA;AAAA,IACA,CAAA,oBAAA,EAAA,iBAAuB,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA,CAAA,CAAA;AAAA,IAC/C,CAAA,iBAAA,EAAoB,IAAA,GAAO,yBAAA,GAA4B,CAAA,iBAAA,EAAoB,MAAM,CAAA,MAAA,CAAQ,CAAA,CAAA,CAAA;AAAA,IACzF,EAAA;AAAA,IACA,iFAAA;AAAA,IACA,EAAA;AAAA,IACA,kIAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,MAAM,MAAM,CAAA,CAAE,aAAA,KAAkB,WAAA,IAAe,CAAA,CAAE,kBAAkB,UAAA,MAChE,CAAA,CAAE,UAAA,KAAe,WAAA,IAAe,EAAE,UAAA,KAAe,UAAA,CAAA,KACjD,EAAE,UAAA,KAAe,WAAA,IAAe,EAAE,UAAA,KAAe,UAAA,CAAA;AACpD,IAAA,WAAA,CAAY,IAAA;AAAA,MACV,CAAA,MAAA,EAAS,EAAE,EAAE,CAAA,SAAA,EAAY,EAAE,KAAA,IAAS,KAAK,CAAA,KAAA,EAAQ,CAAA,CAAE,KAAK,CAAA,KAAA,EAAQ,EAAE,aAAa,CAAA,OAAA,EAAU,EAAE,UAAU,CAAA,OAAA,EAAU,EAAE,UAAU,CAAA,KAAA,EACzH,EAAA,GAAK,kBAAA,GAAgB,eACvB,CAAA,EAAA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AACnB,EAAA,WAAA,CAAY,KAAK,yCAAyC,CAAA;AAC1D,EAAA,WAAA,CAAY,IAAA;AAAA,IACV;AAAA,GACF;AACA,EAAA,WAAA,CAAY,IAAA;AAAA,IACV;AAAA,GACF;AACA,EAAA,WAAA,CAAY,IAAA;AAAA,IACV;AAAA,GACF;AAEA,EAAA,OAAO,WAAA,CAAY,KAAK,IAAI,CAAA;AAC9B;AAEA,IAAM,iBAAA,uBAAwB,GAAA,CAAI;AAAA,EAChC,cAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,cAAc,IAAA,EAAuB;AAC5C,EAAA,OAAO,kBAAkB,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA,CAAK,WAAW,OAAO,CAAA;AAC/D;AAEA,SAAS,eAAe,IAAA,EAAuB;AAC7C,EAAA,OACE,IAAA,CAAK,SAAS,UAAU,CAAA,IACxB,KAAK,QAAA,CAAS,UAAU,CAAA,IACxB,IAAA,CAAK,QAAA,CAAS,UAAU,KACxB,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,IACxB,IAAA,CAAK,SAAS,UAAU,CAAA,IACxB,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA;AAE5B;AAEA,SAAS,gBAAA,CACP,QAAA,EACA,OAAA,EACA,GAAA,EACM;AACN,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAa6B,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,mBAAmB,OAAO,CAAA;AACvC,IAAA,MAAM,aAAkBC,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AACtE,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,CAAI,GAAG,KAAK,EAAC;AAClC,MAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA,EAAG,QAAA,CAAS,KAAK,UAAU,CAAA;AAC5D,MAAA,GAAA,CAAI,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,IACvB;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,SAAS,gBAAA,CACP,GAAA,EACA,OAAA,EACA,GAAA,EACM;AACN,EAAA,IAAI,CAAID,cAAA,CAAA,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,EAAA,IAAI;AACF,IAAA,MAAM,UAAaA,cAAA,CAAA,WAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAC3D,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,MAAM,QAAA,GAAgBC,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AACtC,MAAA,IAAI,EAAE,WAAA,EAAY,IAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAC7C,QAAA,gBAAA,CAAiB,QAAA,EAAU,SAAS,GAAG,CAAA;AAAA,MACzC,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,EAAG;AACtC,QAAA,gBAAA,CAAiB,QAAA,EAAU,SAAS,GAAG,CAAA;AAAA,MACzC;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,SAAS,iBAAA,CACP,QAAA,EACA,OAAA,EACA,MAAA,EACA,GAAA,EACM;AACN,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAaD,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AACjD,IAAA,MAAM,UAAeC,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AACnE,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,QAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,CAAI,KAAK,KAAK,EAAC;AACpC,QAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG,QAAA,CAAS,KAAK,OAAO,CAAA;AACtD,QAAA,GAAA,CAAI,GAAA,CAAI,OAAO,QAAQ,CAAA;AAAA,MACzB;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,SAAS,iBAAA,CACP,GAAA,EACA,OAAA,EACA,MAAA,EACA,GAAA,EACM;AACN,EAAA,IAAI,CAAID,cAAA,CAAA,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,EAAA,IAAI;AACF,IAAA,MAAM,UAAaA,cAAA,CAAA,WAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAC3D,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,MAAM,QAAA,GAAgBC,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AACtC,MAAA,IAAI,EAAE,WAAA,EAAY,IAAK,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,EAAG;AAC7C,QAAA,iBAAA,CAAkB,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,GAAG,CAAA;AAAA,MAClD,CAAA,MAAA,IAAW,cAAA,CAAe,CAAA,CAAE,IAAI,CAAA,EAAG;AACjC,QAAA,iBAAA,CAAkB,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,GAAG,CAAA;AAAA,MAClD;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEO,SAAS,kBAAA,CAAmB,OAAA,GAA+B,EAAC,EAAuB;AACxF,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,MAAM,UAAA,GAAa,YAAY,OAAO,CAAA;AAGtC,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAA2B;AACnD,EAAA,MAAM,iBAAmC,EAAC;AAC1C,EAAA,MAAM,oBAAyD,EAAC;AAEhE,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAaD,cAAA,CAAA,YAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AAC7C,MAAA,MAAM,EAAE,WAAA,EAAa,IAAA,EAAK,GAAI,iBAAiB,OAAO,CAAA;AACtD,MAAA,MAAM,UAAeC,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAE/D,MAAA,IAAI,YAAY,EAAA,EAAI;AAClB,QAAA,WAAA,CAAY,GAAA,CAAI,YAAY,EAAA,EAAI;AAAA,UAC9B,IAAA,EAAM,OAAA;AAAA,UACN,MAAM,OAAO,WAAA,CAAY,IAAA,KAAS,QAAA,GAAW,YAAY,IAAA,GAAO,KAAA,CAAA;AAAA,UAChE,OAAO,OAAO,WAAA,CAAY,KAAA,KAAU,QAAA,GAAW,YAAY,KAAA,GAAQ,KAAA,CAAA;AAAA,UACnE,WAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAED,QAAA,IAAI,WAAA,CAAY,SAAS,WAAA,IAAe,MAAA,CAAO,YAAY,EAAE,CAAA,CAAE,UAAA,CAAW,MAAM,CAAA,EAAG;AACjF,UAAA,MAAM,YAAsB,EAAC;AAC7B,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAA,CAAY,wBAAwB,CAAC,CAAA,EAAG;AACxD,YAAA,SAAA,CAAU,IAAA,CAAK,GAAI,WAAA,CAAY,wBAAwB,CAAc,CAAA;AAAA,UACvE;AACA,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAA,CAAY,WAAW,CAAC,CAAA,EAAG;AAC3C,YAAA,SAAA,CAAU,IAAA,CAAK,GAAI,WAAA,CAAY,WAAW,CAAc,CAAA;AAAA,UAC1D;AACA,UAAA,cAAA,CAAe,IAAA,CAAK;AAAA,YAClB,EAAA,EAAI,MAAA,CAAO,WAAA,CAAY,EAAE,CAAA;AAAA,YACzB,OAAO,OAAO,WAAA,CAAY,KAAA,KAAU,QAAA,GAAW,YAAY,KAAA,GAAQ,KAAA,CAAA;AAAA,YACnE,eAAA,EACE,OAAO,WAAA,CAAY,kBAAkB,MAAM,QAAA,GACvC,WAAA,CAAY,kBAAkB,CAAA,GAC9B,KAAA,CAAA;AAAA,YACN,cAAA,EACE,OAAO,WAAA,CAAY,iBAAiB,MAAM,QAAA,GACtC,WAAA,CAAY,iBAAiB,CAAA,GAC7B,KAAA,CAAA;AAAA,YACN,kBAAA,EACE,OAAO,WAAA,CAAY,qBAAqB,MAAM,QAAA,GAC1C,WAAA,CAAY,qBAAqB,CAAA,GACjC,KAAA,CAAA;AAAA,YACN;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAGA,MAAA,IACE,OAAA,CAAQ,QAAA,CAAS,eAAe,CAAA,IAChC,QAAQ,QAAA,CAAS,iBAAiB,CAAA,IAClC,OAAA,CAAQ,SAAS,qBAAqB,CAAA,IACtC,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,EAC/B;AACA,QAAA,iBAAA,CAAkB,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,CAAA;AAAA,MACnD;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,uBAAuB,OAAO,CAAA;AAClD,EAAA,MAAM,WAAA,GAAgC,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA;AAG3F,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,CAAA,IAAK,WAAA,CAAY,SAAQ,EAAG;AAC/C,IAAA,IAAI,EAAA,CAAG,WAAW,MAAM,CAAA,IAAK,CAAC,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA,EAAG;AACjD,MAAA,MAAM,KAAK,KAAA,CAAM,WAAA;AACjB,MAAA,MAAM,QAAA,GAAY,GAAG,QAAA,IAAoB;AAAA,QACvC,YAAA,EAAc,MAAM,OAAA,CAAQ,EAAA,CAAG,YAAY,CAAA,GAAK,EAAA,CAAG,eAA4B;AAAC,OAClF;AACA,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,EAAA;AAAA,QACA,IAAA,EAAM,SAAA;AAAA,QACN,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,UAAU,MAAA,CAAO,EAAA,CAAG,WAAW,CAAA,IAAK,EAAA,CAAG,YAAY,EAAE,CAAA;AAAA,QACrD;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAA4B;AACxD,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,IAAI,IAAI,QAAA,IAAY,KAAA,CAAM,QAAQ,GAAA,CAAI,QAAA,CAAS,YAAY,CAAA,EAAG;AAC5D,MAAA,KAAA,MAAW,KAAA,IAAS,GAAA,CAAI,QAAA,CAAS,YAAA,EAAc;AAC7C,QAAA,eAAA,CAAgB,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,MAChC;AAAA,IACF;AACA,IAAA,IAAI,IAAI,QAAA,IAAY,KAAA,CAAM,QAAQ,GAAA,CAAI,QAAA,CAAS,oBAAoB,CAAA,EAAG;AACpE,MAAA,KAAA,MAAW,KAAA,IAAS,GAAA,CAAI,QAAA,CAAS,oBAAA,EAAsB;AACrD,QAAA,eAAA,CAAgB,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAsB;AAChD,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsB;AAE9C,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,CAAC,KAAK,CAAA,IAAK,WAAA,CAAY,SAAQ,EAAG;AAC3C,IAAA,IACE,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA,IACtB,MAAM,UAAA,CAAW,KAAK,CAAA,IACtB,KAAA,CAAM,WAAW,UAAU,CAAA,IAC3B,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA,EACvB;AACA,MAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,gBAAA,CAAiB,OAAA,EAAS,SAAS,aAAa,CAAA;AAChD,EAAA,iBAAA,CAAkB,OAAA,EAAS,OAAA,EAAS,YAAA,EAAc,WAAW,CAAA;AAG7D,EAAA,MAAM,eAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,IAAI,CAAA,IAAK,WAAA,CAAY,SAAQ,EAAG;AAC9C,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,YAAY,KAAK,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,YAAY,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,EAAG;AAC1G,MAAA;AAAA,IACF;AAEA,IAAA,IACE,IAAA,CAAK,SAAS,aAAA,IACd,IAAA,CAAK,SAAS,sBAAA,IACd,EAAA,CAAG,WAAW,KAAK,CAAA,IACnB,GAAG,UAAA,CAAW,KAAK,KACnB,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,IACpB,EAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EACxB;AACA,MAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,MAAM,aAAgC,EAAC;AACvC,EAAA,MAAM,UAA6B,EAAC;AAEpC,EAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,IAAA,MAAM,KAAK,GAAA,CAAI,WAAA;AACf,IAAA,MAAM,KAAA,GAAQ,GAAG,EAAA,IAAM,EAAA;AACvB,IAAA,MAAM,iBAAA,GAAoB,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAA;AAGnD,IAAA,MAAM,gBAA0B,EAAC;AAGjC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,cAAc,CAAC,CAAA,EAAG;AACrC,MAAA,aAAA,CAAc,IAAA,CAAK,GAAI,EAAA,CAAG,cAAc,CAAc,CAAA;AAAA,IACxD,CAAA,MAAA,IAAW,OAAO,EAAA,CAAG,cAAc,MAAM,QAAA,EAAU;AACjD,MAAA,aAAA,CAAc,IAAA,CAAK,EAAA,CAAG,cAAc,CAAC,CAAA;AAAA,IACvC;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,sBAAsB,CAAC,CAAA,EAAG;AAC7C,MAAA,aAAA,CAAc,IAAA,CAAK,GAAI,EAAA,CAAG,sBAAsB,CAAc,CAAA;AAAA,IAChE,CAAA,MAAA,IAAW,OAAO,EAAA,CAAG,sBAAsB,MAAM,QAAA,EAAU;AACzD,MAAA,aAAA,CAAc,IAAA,CAAK,EAAA,CAAG,sBAAsB,CAAC,CAAA;AAAA,IAC/C;AAGA,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,IAAI,iBAAA,CAAkB,UAAU,QAAA,EAAU;AACxC,QAAA,aAAA,CAAc,IAAA,CAAK,GAAG,iBAAA,CAAkB,QAAA,CAAS,QAAQ,CAAA;AAAA,MAC3D;AACA,MAAA,IAAI,iBAAA,CAAkB,UAAU,aAAA,EAAe;AAC7C,QAAA,aAAA,CAAc,IAAA,CAAK,GAAG,iBAAA,CAAkB,QAAA,CAAS,aAAa,CAAA;AAAA,MAChE;AACA,MAAA,IAAI,iBAAA,CAAkB,UAAU,UAAA,EAAY;AAC1C,QAAA,aAAA,CAAc,IAAA,CAAK,GAAG,iBAAA,CAAkB,QAAA,CAAS,UAAU,CAAA;AAAA,MAC7D;AAAA,IACF;AAGA,IAAA,MAAM,qBAAqB,KAAA,CAAM,IAAA;AAAA,MAC/B,IAAI,GAAA,CAAI,aAAA,CAAc,MAAA,CAAO,CAAC,OAAO,WAAA,CAAY,GAAA,CAAI,EAAE,CAAC,CAAC;AAAA,KAC3D;AAEA,IAAA,MAAM,iBAAA,GACJ,kBAAA,CAAmB,MAAA,GAAS,CAAA,IAAM,iBAAA,KAAsB,MAAA,KAAc,iBAAA,CAAkB,QAAA,EAAU,YAAA,EAAc,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,CAAA;AAErI,IAAA,MAAM,aAAA,GAAwC,oBAAoB,WAAA,GAAc,QAAA;AAChF,IAAA,IAAI,CAAC,iBAAA,EAAmB,UAAA,EAAA;AAGxB,IAAA,MAAM,aAAuB,EAAC;AAG9B,IAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,MAAA,IAAI,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAG;AACjC,QAAA,IAAI,CAAC,WAAW,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG,UAAA,CAAW,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACxD,QAAA,IAAI,IAAI,eAAA,IAAmB,CAAC,WAAW,QAAA,CAAS,GAAA,CAAI,eAAe,CAAA,EAAG;AACpE,UAAA,UAAA,CAAW,IAAA,CAAK,IAAI,eAAe,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,EAAA,CAAG,qBAAqB,CAAA,KAAM,QAAA,EAAU;AACjD,MAAA,UAAA,CAAW,IAAA,CAAK,EAAA,CAAG,qBAAqB,CAAC,CAAA;AAAA,IAC3C;AAGA,IAAA,KAAA,MAAW,QAAQ,iBAAA,EAAmB;AACpC,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAChC,QAAA,MAAM,QAAA,GAAgBA,gBAAA,CAAA,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACxC,QAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,QAAQ,CAAA,EAAG,UAAA,CAAW,KAAK,QAAQ,CAAA;AAAA,MAC9D;AAAA,IACF;AAEA,IAAA,MAAM,mBAAmB,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,UAAU,CAAC,CAAA;AACvD,IAAA,MAAM,UAAA,GAAqC,gBAAA,CAAiB,MAAA,GAAS,CAAA,GAAI,WAAA,GAAc,QAAA;AACvF,IAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG,UAAA,EAAA;AAGnC,IAAA,MAAM,aAAuB,EAAC;AAG9B,IAAA,MAAM,gBAAA,GAAmB,aAAA,CAAc,GAAA,CAAI,KAAK,KAAK,EAAC;AACtD,IAAA,UAAA,CAAW,IAAA,CAAK,GAAG,gBAAgB,CAAA;AAEnC,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,MAAM,kBAAkB,aAAA,CAAc,GAAA,CAAI,iBAAA,CAAkB,EAAE,KAAK,EAAC;AACpE,MAAA,UAAA,CAAW,IAAA,CAAK,GAAG,eAAe,CAAA;AAAA,IACpC;AAGA,IAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,GAAA,CAAI,KAAK,KAAK,EAAC;AACrD,IAAA,UAAA,CAAW,IAAA,CAAK,GAAG,iBAAiB,CAAA;AAEpC,IAAA,MAAM,mBAAmB,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,UAAU,CAAC,CAAA;AACvD,IAAA,MAAM,UAAA,GAAqC,gBAAA,CAAiB,MAAA,GAAS,CAAA,GAAI,WAAA,GAAc,QAAA;AACvF,IAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG,UAAA,EAAA;AAEnC,IAAA,MAAM,GAAA,GAAuB;AAAA,MAC3B,EAAA,EAAI,KAAA;AAAA,MACJ,KAAA,EAAQ,GAAG,KAAA,IAAoB,UAAA;AAAA,MAC/B,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,OAAO,iBAAA,EAAmB,EAAA;AAAA,MAC1B,eAAe,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA,KAAM,iBAAA,GAAoB,kBAAkB,EAAA,GAAK,MAAA,CAAA;AAAA,MAC5F,aAAA;AAAA,MACA,UAAA,EAAY,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA,IAAK,MAAA;AAAA,MAC3C,UAAA;AAAA,MACA,UAAA,EAAY,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA,IAAK,MAAA;AAAA,MAC3C,UAAA;AAAA,MACA,SAAS,GAAA,CAAI,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,MAAK,GAAI,MAAA;AAAA,MAC5C,UAAU,GAAA,CAAI;AAAA,KAChB;AAEA,IAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AACnB,IAAA,IAAI,aAAA,KAAkB,QAAA,IAAY,UAAA,KAAe,QAAA,IAAY,eAAe,QAAA,EAAU;AACpF,MAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAiB,kCAAA,CAAmC,UAAA,EAAY,UAAU,CAAA;AAEhF,EAAA,OAAO;AAAA,IACL,SAAS,UAAA,KAAe,CAAA;AAAA,IACxB,IAAA,EAAM,UAAA;AAAA,IACN,OAAA;AAAA,IACA,aAAa,OAAA,CAAQ,MAAA;AAAA,IACrB,mBAAmB,YAAA,CAAa,MAAA;AAAA,IAChC;AAAA,GACF;AACF;AC9cO,SAAS,cAAc,OAAA,EAAkE;AAC9F,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,6BAA6B,CAAA;AACzD,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,WAAA,EAAa,EAAE,KAAA,EAAO,EAAC,EAAE,EAAG,IAAA,EAAM,OAAA,EAAQ;AAE/D,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS9B,sBAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,aAAa,EAAE,KAAA,EAAO,EAAC,EAAE,EAAG,MAAM,OAAA,EAAQ;AAAA,EACrD;AAEA,EAAA,IAAI,CAAC,UAAU,OAAO,MAAA,KAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,IAAA,OAAO,EAAE,aAAa,EAAE,KAAA,EAAO,EAAC,EAAE,EAAG,MAAM,OAAA,EAAQ;AAAA,EACrD;AAEA,EAAA,MAAM,GAAA,GAAM,MAAA;AACZ,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAC,CAAA,GAAK,GAAA,CAAI,OAAO,CAAA,GAAkC,EAAC;AAE9F,EAAA,MAAM,KAAA,GAAoB,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM;AAC5C,IAAA,MAAM,eAAyC,EAAC;AAChD,IAAA,IAAI,EAAE,cAAc,CAAA,IAAK,OAAO,CAAA,CAAE,cAAc,MAAM,QAAA,EAAU;AAC9D,MAAA,MAAM,CAAA,GAAI,EAAE,cAAc,CAAA;AAC1B,MAAA,IAAI,OAAO,EAAE,QAAQ,CAAA,KAAM,UAAU,YAAA,CAAa,MAAA,GAAS,EAAE,QAAQ,CAAA;AACrE,MAAA,IAAI,OAAO,EAAE,qBAAqB,CAAA,KAAM,UAAU,YAAA,CAAa,QAAA,GAAW,EAAE,qBAAqB,CAAA;AAAA,IACnG;AACA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,OAAO,CAAA,CAAE,IAAI,CAAA,KAAM,QAAA,GAAW,CAAA,CAAE,IAAI,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,IAAI,KAAK,EAAE,CAAA;AAAA,MAChE,KAAA,EAAO,OAAO,CAAA,CAAE,OAAO,MAAM,QAAA,GAAW,CAAA,CAAE,OAAO,CAAA,GAAI,MAAA;AAAA,MACrD,UAAA,EAAY,OAAO,CAAA,CAAE,YAAY,MAAM,QAAA,GAAW,CAAA,CAAE,YAAY,CAAA,GAAI,MAAA;AAAA,MACpE,SAAA,EAAW,OAAO,CAAA,CAAE,YAAY,MAAM,QAAA,GAAW,CAAA,CAAE,YAAY,CAAA,GAAI,MAAA;AAAA,MACnE,YAAA,EAAc,OAAO,CAAA,CAAE,eAAe,MAAM,QAAA,GAAW,CAAA,CAAE,eAAe,CAAA,GAAI,MAAA;AAAA,MAC5E,UAAA,EAAY,OAAO,CAAA,CAAE,aAAa,MAAM,QAAA,GAAW,CAAA,CAAE,aAAa,CAAA,GAAI,MAAA;AAAA,MACtE,MAAA,EAAQ,OAAO,CAAA,CAAE,QAAQ,MAAM,QAAA,GAAW,CAAA,CAAE,QAAQ,CAAA,GAAI,MAAA;AAAA,MACxD,cAAA,EAAgB,OAAO,CAAA,CAAE,iBAAiB,MAAM,QAAA,GAAW,CAAA,CAAE,iBAAiB,CAAA,GAAI,MAAA;AAAA,MAClF;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,WAAA,GAAgC,EAAE,GAAG,GAAA,EAAK,KAAA,EAAM;AACtD,EAAA,OAAO,EAAE,aAAa,IAAA,EAAM,OAAA,CAAQ,UAAU,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,CAAA,EAAE;AACjE;AAEO,SAAS,aAAA,CACd,GAAA,EACA,QAAA,GAAqB,IACrB,WAAA,GAAwB;AAAA,EACtB,cAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EACU;AACV,EAAA,IAAI;AACF,IAAA,IAAI,CAAI+B,cAAA,CAAA,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,QAAA;AAChC,IAAA,MAAM,KAAA,GAAWA,2BAAY,GAAG,CAAA;AAChC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,QAAA,GAAgBC,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AACpC,MAAA,IAAI;AACF,QAAA,IAAOD,cAAA,CAAA,QAAA,CAAS,QAAQ,CAAA,CAAE,WAAA,EAAY,EAAG;AACvC,UAAA,IAAI,CAAC,WAAA,CAAY,QAAA,CAAS,IAAI,CAAA,EAAG;AAC/B,YAAA,aAAA,CAAc,QAAA,EAAU,UAAU,WAAW,CAAA;AAAA,UAC/C;AAAA,QACF,CAAA,MAAA,IAAA,CACG,IAAA,CAAK,WAAA,EAAY,KAAM,UAAA,IAAc,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,KAC/D,CAAC,IAAA,CAAK,QAAA,CAAS,YAAY,CAAA,EAC3B;AACA,UAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,QACxB;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,QAAA;AACT;AAGO,SAAS,gCAAA,CACd,SAAA,EACA,eAAA,EACA,UAAA,EACA,UAAA,EACQ;AACR,EAAA,MAAM,eAAA,GAAkB,UAAA,CAAW,YAAY,CAAA,IAAK,CAAA;AACpD,EAAA,MAAM,oBAAA,GAAuB,UAAA,CAAW,mBAAmB,CAAA,IAAK,CAAA;AAChE,EAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,WAAW,CAAA,IAAK,CAAA;AAClD,EAAA,MAAM,mBAAA,GAAsB,UAAA,CAAW,kBAAkB,CAAA,IAAK,CAAA;AAE9D,EAAA,MAAM,aAAA,GAA0B;AAAA,IAC9B,CAAA,oEAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,kBAAA,EAAA,iBAAqB,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA,CAAA;AAAA,IAC7C,0BACE,eAAA,KAAoB,CAAA,GAChB,qCAAA,GACA,CAAA,eAAA,EAAkB,eAAe,CAAA,qBAAA,CACvC,CAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,GAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,yCAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,6FAAA,CAAA;AAAA,IACA,CAAA,8CAAA,CAAA;AAAA,IACA,CAAA,qCAAA,EAAiC,eAAe,CAAA,KAAA,EAC9C,IAAA,CAAK,MAAO,eAAA,IAAmB,UAAA,IAAc,CAAA,CAAA,GAAM,GAAG,CACxD,CAAA,mEAAA,CAAA;AAAA,IACA,CAAA,4CAAA,EAAwC,oBAAoB,CAAA,KAAA,EAC1D,IAAA,CAAK,MAAO,oBAAA,IAAwB,UAAA,IAAc,CAAA,CAAA,GAAM,GAAG,CAC7D,CAAA,0EAAA,CAAA;AAAA,IACA,CAAA,oCAAA,EAAgC,cAAc,CAAA,KAAA,EAC5C,IAAA,CAAK,MAAO,cAAA,IAAkB,UAAA,IAAc,CAAA,CAAA,GAAM,GAAG,CACvD,CAAA,qFAAA,CAAA;AAAA,IACA,CAAA,2CAAA,EAAuC,mBAAmB,CAAA,KAAA,EACxD,IAAA,CAAK,MAAO,mBAAA,IAAuB,UAAA,IAAc,CAAA,CAAA,GAAM,GAAG,CAC5D,CAAA,gFAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,GAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,qDAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,4GAAA,CAAA;AAAA,IACA,CAAA,4DAAA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,IAAA,MAAM,YAAY,CAAC,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,mBAAmB,CAAA,CAAE,aAAA;AAC3D,IAAA,MAAM,IAAA,GAAO,YAAY,WAAA,GAAS,YAAA;AAClC,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,IAAA,CAAK,YAAA,EAAc,QAAA,IAAY,SAAA;AAClD,IAAA,aAAA,CAAc,IAAA;AAAA,MACZ,CAAA,MAAA,EAAS,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,SAAA,EAAY,CAAA,CAAE,IAAI,CAAA,KAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,KAAA,IAAS,UAAU,QACpE,CAAA,CAAE,IAAA,CAAK,SAAA,IAAa,QACtB,CAAA,OAAA,EAAU,CAAA,CAAE,IAAA,CAAK,YAAA,IAAgB,SAAS,CAAA,OAAA,EAAU,QAAQ,CAAA,OAAA,EAC1D,CAAA,CAAE,IAAA,CAAK,UAAA,IAAc,iBACvB,QAAQ,IAAI,CAAA,EAAA;AAAA,KACd;AAAA,EACF;AAEA,EAAA,aAAA,CAAc,KAAK,EAAE,CAAA;AACrB,EAAA,aAAA,CAAc,KAAK,KAAK,CAAA;AACxB,EAAA,aAAA,CAAc,KAAK,EAAE,CAAA;AACrB,EAAA,aAAA,CAAc,KAAK,6BAA6B,CAAA;AAChD,EAAA,aAAA,CAAc,IAAA;AAAA,IACZ;AAAA,GACF;AACA,EAAA,aAAA,CAAc,IAAA;AAAA,IACZ;AAAA,GACF;AACA,EAAA,aAAA,CAAc,IAAA;AAAA,IACZ;AAAA,GACF;AAEA,EAAA,OAAO,aAAA,CAAc,KAAK,IAAI,CAAA;AAChC;AAEO,SAAS,qBAAA,CAAsB,OAAA,GAA6B,EAAC,EAAqB;AACvF,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,MAAM,SAAA,GAAY,QAAQ,QAAA,IAAY,OAAA;AACtC,EAAA,MAAM,SAAA,GAAY,cAAc,SAAS,CAAA;AAEzC,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,MAAM,gBAA+B,EAAC;AACtC,EAAA,MAAM,iBAA2B,EAAC;AAElC,EAAA,MAAM,UAAA,GAAqC;AAAA,IACzC,UAAA,EAAY,CAAA;AAAA,IACZ,iBAAA,EAAmB,CAAA;AAAA,IACnB,SAAA,EAAW,CAAA;AAAA,IACX,gBAAA,EAAkB;AAAA,GACpB;AACA,EAAA,MAAM,UAAA,GAAqC;AAAA,IACzC,GAAA,EAAK,CAAA;AAAA,IACL,MAAA,EAAQ,CAAA;AAAA,IACR,IAAA,EAAM,CAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,IAAA,IAAI,CAAIA,cAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG;AAC1B,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAaA,cAAA,CAAA,YAAA,CAAa,MAAM,OAAO,CAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAE,WAAA,EAAY,GAAI,aAAA,CAAc,OAAO,CAAA;AAE7C,IAAA,IAAI,CAAC,WAAA,CAAY,KAAA,IAAS,WAAA,CAAY,KAAA,CAAM,WAAW,CAAA,EAAG;AACxD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAeC,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAE/D,IAAA,KAAA,MAAW,CAAA,IAAK,YAAY,KAAA,EAAO;AACjC,MAAA,UAAA,EAAA;AAEA,MAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,QAAA,CAAS,CAAA,CAAE,YAA4B,CAAA;AAChF,MAAA,MAAM,eAAA,GAAkB,OAAA;AAAA,QACtB,CAAA,CAAE,gBAAgB,CAAA,CAAE,YAAA,CAAa,YAAY,CAAA,CAAE,YAAA,CAAa,SAAS,MAAA,GAAS;AAAA,OAChF;AAEA,MAAA,IAAI,eAAA,GAAiC,IAAA;AACrC,MAAA,IACE,CAAA,CAAE,YAAA,KAAiB,kBAAA,IACnB,CAAA,CAAE,UAAA,IACF,CAAA,CAAE,UAAA,CAAW,UAAA,CAAW,QAAQ,CAAA,IAChC,CAAA,CAAE,UAAA,KAAe,kBAAA,EACjB;AACA,QAAA,eAAA,GAAkB,CAAA,CAAA,EAAI,EAAE,EAAE,CAAA,uEAAA,CAAA;AAAA,MAC5B;AACA,MAAA,IAAI,CAAA,CAAE,YAAA,KAAiB,WAAA,IAAe,CAAA,CAAE,WAAW,aAAA,EAAe;AAChE,QAAA,eAAA,GAAkB,CAAA,CAAA,EAAI,EAAE,EAAE,CAAA,4DAAA,CAAA;AAAA,MAC5B;AACA,MAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,QAAA,eAAA,GAAkB,CAAA,CAAA,EAAI,EAAE,EAAE,CAAA,qDAAA,CAAA;AAC1B,QAAA,eAAA,EAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,eAAA,GAAkB,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,0BAAA,EAA6B,EAAE,YAAY,CAAA,EAAA,CAAA;AAAA,MACvE;AAEA,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,cAAA,CAAe,KAAK,eAAe,CAAA;AAAA,MACrC;AAEA,MAAA,IAAI,EAAE,YAAA,IAAgB,UAAA,CAAW,CAAA,CAAE,YAAY,MAAM,MAAA,EAAW;AAC9D,QAAA,UAAA,CAAW,EAAE,YAAY,CAAA,EAAA;AAAA,MAC3B;AACA,MAAA,MAAM,IAAA,GAAA,CAAQ,CAAA,CAAE,SAAA,IAAa,QAAA,EAAU,WAAA,EAAY;AACnD,MAAA,IAAI,UAAA,CAAW,IAAI,CAAA,KAAM,MAAA,EAAW;AAClC,QAAA,UAAA,CAAW,IAAI,CAAA,EAAA;AAAA,MACjB;AAEA,MAAA,aAAA,CAAc,IAAA,CAAK;AAAA,QACjB,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,CAAA;AAAA,QACN,eAAA;AAAA,QACA,aAAA,EAAe,WAAA;AAAA,QACf,WAAA,EAAa,QAAQ,eAAe;AAAA,OACrC,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAiB,gCAAA;AAAA,IACrB,aAAA;AAAA,IACA,cAAA,CAAe,MAAA;AAAA,IACf,UAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,eAAe,MAAA,KAAW,CAAA;AAAA,IACnC,UAAA;AAAA,IACA,eAAe,UAAA,GAAa,eAAA;AAAA,IAC5B,eAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA,EAAO,aAAA;AAAA,IACP,UAAA,EAAY,cAAA;AAAA,IACZ;AAAA,GACF;AACF;AC9PO,SAAS,gBAAgB,OAAA,EAAoE;AAClG,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,6BAA6B,CAAA;AACzD,EAAA,IAAI,CAAC,OAAO,OAAO,EAAE,aAAa,EAAC,EAAG,MAAM,OAAA,EAAQ;AAEpD,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAShC,sBAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,WAAA,EAAa,EAAC,EAAG,MAAM,OAAA,EAAQ;AAAA,EAC1C;AAEA,EAAA,IAAI,CAAC,UAAU,OAAO,MAAA,KAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,IAAA,OAAO,EAAE,WAAA,EAAa,EAAC,EAAG,MAAM,OAAA,EAAQ;AAAA,EAC1C;AAEA,EAAA,MAAM,GAAA,GAAM,MAAA;AAEZ,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAC,CAAA,GAAK,GAAA,CAAI,OAAO,CAAA,GAAkC,EAAC;AAC9F,EAAA,MAAM,KAAA,GAA0B,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM;AAClD,IAAA,MAAM,eAA+C,EAAC;AACtD,IAAA,IAAI,EAAE,cAAc,CAAA,IAAK,OAAO,CAAA,CAAE,cAAc,MAAM,QAAA,EAAU;AAC9D,MAAA,MAAM,CAAA,GAAI,EAAE,cAAc,CAAA;AAC1B,MAAA,IAAI,OAAO,EAAE,QAAQ,CAAA,KAAM,UAAU,YAAA,CAAa,MAAA,GAAS,EAAE,QAAQ,CAAA;AACrE,MAAA,IAAI,OAAO,EAAE,qBAAqB,CAAA,KAAM,UAAU,YAAA,CAAa,QAAA,GAAW,EAAE,qBAAqB,CAAA;AAAA,IACnG;AACA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,OAAO,CAAA,CAAE,IAAI,CAAA,KAAM,QAAA,GAAW,CAAA,CAAE,IAAI,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,IAAI,KAAK,EAAE,CAAA;AAAA,MAChE,KAAA,EAAO,OAAO,CAAA,CAAE,OAAO,MAAM,QAAA,GAAW,CAAA,CAAE,OAAO,CAAA,GAAI,MAAA;AAAA,MACrD;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,IAAI,mBAAmB,CAAA;AAC1C,EAAA,MAAM,WAAA,GAAkC;AAAA,IACtC,GAAG,GAAA;AAAA,IACH,KAAA;AAAA,IACA,mBAAA,EAAqB,KAAA,CAAM,OAAA,CAAQ,UAAU,IACxC,UAAA,CAAyB,GAAA,CAAI,MAAM,CAAA,GACpC,OAAO,UAAA,KAAe,QAAA,GACpB,CAAC,UAAU,CAAA,GACX;AAAA,GACR;AAEA,EAAA,OAAO,EAAE,aAAa,IAAA,EAAM,OAAA,CAAQ,UAAU,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,CAAA,EAAE;AACjE;AAIO,SAAS,qCAAA,CACd,QAAA,EACA,SAAA,EACA,SAAA,EACA,UAAA,EACQ;AACR,EAAA,MAAM,cAAc,SAAA,GAAY,UAAA;AAChC,EAAA,MAAM,WAAA,GAAwB;AAAA,IAC5B,CAAA,wEAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,kBAAA,EAAA,iBAAqB,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA,CAAA;AAAA,IAC7C,CAAA,uBAAA,EACE,WAAA,KAAgB,CAAA,GACZ,mCAAA,GACA,CAAA,kBAAA,EAAqB,WAAW,CAAA,sBAAA,EAAyB,SAAS,CAAA,eAAA,EAAkB,UAAU,CAAA,OAAA,CACpG,CAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,GAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,yDAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,uFAAA,CAAA;AAAA,IACA,CAAA,6CAAA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,KAAW,uBAAA,GAA0B,iBAAA,GAAe,iBAAA;AACnE,IAAA,WAAA,CAAY,IAAA;AAAA,MACV,SAAS,CAAA,CAAE,EAAE,CAAA,OAAA,EAAU,CAAA,CAAE,KAAK,CAAA,KAAA,EAAQ,CAAA,CAAE,IAAI,CAAA,OAAA,EAAU,EAAE,MAAM,CAAA,OAAA,EAAU,CAAA,CAAE,QAAQ,QAAQ,IAAI,CAAA,EAAA;AAAA,KAChG;AAAA,EACF;AAEA,EAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AACnB,EAAA,WAAA,CAAY,KAAK,KAAK,CAAA;AACtB,EAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AACnB,EAAA,WAAA,CAAY,KAAK,8CAA8C,CAAA;AAC/D,EAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AACnB,EAAA,WAAA,CAAY,IAAA;AAAA,IACV;AAAA,GACF;AACA,EAAA,WAAA,CAAY,KAAK,+CAA+C,CAAA;AAEhE,EAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,KAAW,uBAAA,GAA0B,iBAAA,GAAe,iBAAA;AACnE,IAAA,WAAA,CAAY,IAAA;AAAA,MACV,SAAS,CAAA,CAAE,EAAE,CAAA,OAAA,EAAU,CAAA,CAAE,KAAK,CAAA,KAAA,EAAQ,CAAA,CAAE,IAAI,CAAA,OAAA,EAAU,EAAE,MAAM,CAAA,OAAA,EAAU,CAAA,CAAE,iBAAiB,QAAQ,IAAI,CAAA,EAAA;AAAA,KACzG;AAAA,EACF;AAEA,EAAA,OAAO,WAAA,CAAY,KAAK,IAAI,CAAA;AAC9B;AAEO,SAAS,qBAAqB,OAAA,EAAwC;AAC3E,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAsB;AAEhD,EAAA,SAAS,KAAK,GAAA,EAAa;AACzB,IAAA,IAAI,CAAIiC,cAAA,CAAA,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,IAAA,MAAM,UAAaA,cAAA,CAAA,WAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAC3D,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,MAAM,QAAA,GAAgBC,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AACtC,MAAA,IAAI,CAAA,CAAE,aAAY,EAAG;AACnB,QAAA,IAAI,CAAC,CAAC,cAAA,EAAgB,MAAA,EAAQ,QAAQ,YAAA,EAAc,SAAA,EAAW,UAAA,EAAY,WAAA,EAAa,UAAU,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,IAAI,CAAA,EAAG;AACpH,UAAA,IAAA,CAAK,QAAQ,CAAA;AAAA,QACf;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,SAAA,GAAY,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA;AAC5C,QAAA,MAAM,UAAA,GACJ,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,IAC1B,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,IAC1B,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,IAC1B,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,IAC1B,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,IAC1B,CAAA,CAAE,IAAA,CAAK,SAAS,UAAU,CAAA;AAE5B,QAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,UAAA,IAAI;AACF,YAAA,MAAM,OAAA,GAAaD,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AACjD,YAAA,MAAM,UAAeC,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAEnE,YAAA,IAAI,SAAA,EAAW;AACb,cAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,cAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,gBAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,gBAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,kBAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,GAAG,CAAC,CAAA;AACjE,kBAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,oBAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,SAAA,CAAU,CAAC,CAAA;AAC3B,oBAAA,MAAM,QAAA,GAAW,aAAA,CAAc,GAAA,CAAI,KAAK,KAAK,EAAC;AAC9C,oBAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG,QAAA,CAAS,KAAK,OAAO,CAAA;AACtD,oBAAA,aAAA,CAAc,GAAA,CAAI,OAAO,QAAQ,CAAA;AAAA,kBACnC;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAEA,YAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,iDAAiD,CAAA;AACjF,YAAA,IAAI,SAAA,EAAW;AACb,cAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,gBAAA,MAAM,QAAA,GAAW,aAAA,CAAc,GAAA,CAAI,KAAK,KAAK,EAAC;AAC9C,gBAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG,QAAA,CAAS,KAAK,OAAO,CAAA;AACtD,gBAAA,aAAA,CAAc,GAAA,CAAI,OAAO,QAAQ,CAAA;AAAA,cACnC;AAAA,YACF;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,OAAO,CAAA;AACZ,EAAA,OAAO,aAAA;AACT;AAEO,SAAS,qBAAA,CAAsB,OAAA,GAAkC,EAAC,EAA0B;AACjG,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,MAAM,UAAA,GAAa,YAAY,OAAO,CAAA;AACtC,EAAA,MAAM,aAAA,GAAgB,qBAAqB,OAAO,CAAA;AAElD,EAAA,MAAM,WAAmC,EAAC;AAC1C,EAAA,MAAM,YAA6B,EAAC;AAEpC,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAaD,cAAA,CAAA,YAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AAC7C,MAAA,MAAM,EAAE,WAAA,EAAY,GAAI,eAAA,CAAgB,OAAO,CAAA;AAC/C,MAAA,MAAM,UAAeC,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC/D,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA;AAEhD,MAAA,MAAM,EAAA,GAAK,YAAY,EAAA,IAAM,EAAA;AAC7B,MAAA,MAAM,aAAA,GACJ,YAAY,IAAA,KAAS,aAAA,IACrB,YAAY,IAAA,KAAS,sBAAA,IACrB,GAAG,UAAA,CAAW,KAAK,KACnB,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,IACnB,EAAA,CAAG,WAAW,MAAM,CAAA,IACpB,EAAA,CAAG,UAAA,CAAW,UAAU,CAAA;AAE1B,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,GAAA,CAAI,EAAE,KAAK,EAAC;AAChD,QAAA,MAAM,UAAA,GAAa,UAAA,IAAc,aAAA,CAAc,MAAA,GAAS,CAAA;AAExD,QAAA,IAAI,CAAC,UAAA,EAAY,SAAA,EAAA;AAEjB,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAI,EAAA,IAAM,QAAA;AAAA,UACV,KAAA,EAAO,YAAY,KAAA,IAAS,eAAA;AAAA,UAC5B,IAAA,EAAM,OAAA;AAAA,UACN,UAAA;AAAA,UACA,MAAA,EACG,WAAA,CAAY,eAAe,CAAA,KAC3B,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,UAAU,CAAC,IAAI,cAAA,GAAiB,gBAAA,CAAA;AAAA,UACxE,QAAA,EAAU,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,IAAK,mBAAA;AAAA,UACtC,eAAe,aAAA,CAAc,MAAA;AAAA,UAC7B,MAAA,EAAQ,aAAa,uBAAA,GAA0B;AAAA,SAChD,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,KAAA,CAAM,QAAQ,WAAA,CAAY,KAAK,KAAK,WAAA,CAAY,KAAA,CAAM,SAAS,CAAA,EAAG;AACpE,QAAA,KAAA,MAAW,CAAA,IAAK,YAAY,KAAA,EAAO;AACjC,UAAA,MAAM,IAAA,GAAO,CAAA,CAAE,YAAA,EAAc,QAAA,IAAY,EAAA;AACzC,UAAA,MAAM,IAAA,GAAO,CAAA,CAAE,YAAA,EAAc,MAAA,IAAU,gBAAA;AACvC,UAAA,MAAM,QAAA,GAAW,UAAA,IAAe,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAK,CAAC,IAAA,CAAK,SAAS,KAAK,CAAA;AAEjG,UAAA,IAAI,CAAC,QAAA,EAAU,UAAA,EAAA;AAEf,UAAA,SAAA,CAAU,IAAA,CAAK;AAAA,YACb,IAAI,CAAA,CAAE,EAAA;AAAA,YACN,KAAA,EAAO,EAAE,KAAA,IAAS,eAAA;AAAA,YAClB,IAAA,EAAM,OAAA;AAAA,YACN,MAAA,EAAQ,IAAA;AAAA,YACR,mBAAmB,IAAA,IAAQ,SAAA;AAAA,YAC3B,MAAA,EAAQ,WAAW,uBAAA,GAA0B;AAAA,WAC9C,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAiB,qCAAA,CAAsC,QAAA,EAAU,SAAA,EAAW,WAAW,UAAU,CAAA;AAEvG,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,SAAA,KAAc,CAAA,IAAK,UAAA,KAAe,CAAA;AAAA,IAC3C,mBAAmB,QAAA,CAAS,MAAA;AAAA,IAC5B,kBAAA,EAAoB,SAAS,MAAA,GAAS,SAAA;AAAA,IACtC,kBAAA,EAAoB,SAAA;AAAA,IACpB,YAAY,SAAA,CAAU,MAAA;AAAA,IACtB,WAAA,EAAa,UAAU,MAAA,GAAS,UAAA;AAAA,IAChC,WAAA,EAAa,UAAA;AAAA,IACb,YAAA,EAAc,QAAA;AAAA,IACd,KAAA,EAAO,SAAA;AAAA,IACP;AAAA,GACF;AACF;AC3QO,SAAS,gBAAgB,QAAA,EAA2B;AACzD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,OAAA,GAAU,OAAA;AACrD,IAAcC,wBAAA,CAAA,YAAA,CAAa,KAAK,CAAC,QAAQ,GAAG,EAAE,KAAA,EAAO,UAAU,CAAA;AAC/D,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEO,SAAS,qBAAqB,GAAA,EAAkB;AACrD,EAAA,IAAI,CAAC,KAAK,OAAO,SAAA;AACjB,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,IAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,SAAA;AAAA,EACxC;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,KAAS,oBAAA,CAAqB,IAAI,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,EAAA,KAAO,OAAO,SAAS,CAAA;AAC3F,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,SAAA;AAC/B,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,MAAM,CAAC,CAAA;AACtC,IAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI,GAAA,CAAI,QAAQ,OAAO,GAAA,CAAI,SAAS,QAAA,EAAU,OAAO,GAAA,CAAI,IAAA,CAAK,IAAA,EAAK;AACnE,IAAA,IAAI,GAAA,CAAI,QAAQ,OAAO,GAAA,CAAI,SAAS,QAAA,EAAU,OAAO,GAAA,CAAI,IAAA,CAAK,IAAA,EAAK;AACnE,IAAA,IAAI,GAAA,CAAI,WAAW,OAAO,GAAA,CAAI,YAAY,QAAA,EAAU,OAAO,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAK;AAAA,EAC9E;AACA,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,gBAAgB,MAAA,EAAoC;AAClE,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,SAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAM,IAAA,GAAYC,gBAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAA;AAChC,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG;AACvB,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,uBAAuB,eAAA,EAA8C;AACnF,EAAA,IAAI,CAAC,eAAA,IAAmB,CAAIA,cAAA,CAAA,UAAA,CAAW,eAAe,GAAG,OAAO,MAAA;AAChE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAUA,cAAA,CAAA,YAAA,CAAa,eAAA,EAAiB,OAAO,CAAA;AACrD,IAAA,IAAI,KAAK,QAAA,CAAS,gBAAgB,KAAK,IAAA,CAAK,QAAA,CAAS,aAAa,CAAA,EAAG;AACnE,MAAA,OAAO,YAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAK,QAAA,CAAS,aAAa,KAAK,IAAA,CAAK,QAAA,CAAS,8CAA8C,CAAA,EAAG;AACjG,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,8BAA8B,CAAA,EAAG;AACjD,MAAA,OAAO,eAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAK,QAAA,CAAS,oCAAoC,KAAK,IAAA,CAAK,QAAA,CAAS,uBAAuB,CAAA,EAAG;AACjG,MAAA,OAAO,YAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAK,QAAA,CAAS,mDAAmD,KAAK,IAAA,CAAK,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC3G,MAAA,OAAO,cAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,aAAa,CAAA,EAAG;AAChC,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAK,QAAA,CAAS,0BAA0B,KAAK,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AACvE,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAK,QAAA,CAAS,8BAA8B,KAAK,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAC3E,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,gBAAgB,QAAA,EAA8B;AAC5D,EAAA,IAAI,CAAIA,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG,OAAO,IAAA;AACrC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,KAAA,CAASA,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,EACtD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,qBAAA,CAAsB,SAAiB,cAAA,EAAuC;AAC5F,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,MAAM,OAAA,GAAeD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,cAAc,CAAA;AACjD,EAAA,MAAM,GAAA,GAAM,gBAAgB,OAAO,CAAA;AACnC,EAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AAEjB,EAAA,IAAI,GAAA,CAAI,YAAA,IAAgB,OAAO,GAAA,CAAI,iBAAiB,QAAA,EAAU;AAC5D,IAAA,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,YAAY,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,EAC3D;AACA,EAAA,IAAI,CAAC,cAAA,IAAkB,GAAA,CAAI,mBAAmB,OAAO,GAAA,CAAI,oBAAoB,QAAA,EAAU;AACrF,IAAA,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,eAAe,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,iBAAA,CAAkB,MAAA,EAAgB,WAAA,EAA0B,IAAA,EAA4C;AACtH,EAAA,MAAM,WAAA,GAAmBA,gBAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,cAAc,CAAA;AACpD,EAAA,MAAM,GAAA,GAAM,gBAAgB,WAAW,CAAA;AACvC,EAAA,IAAI,CAAC,GAAA,IAAO,CAAC,IAAI,IAAA,IAAQ,CAAC,IAAI,OAAA,EAAS;AAEvC,EAAA,MAAM,MAAM,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,IAAI,OAAO,CAAA,CAAA;AACtC,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAEnB,EAAA,MAAM,OAAA,GAAU,gBAAgB,MAAM,CAAA;AACtC,EAAA,IAAI,IAAA,GAAO,oBAAA,CAAqB,GAAA,CAAI,OAAA,IAAW,IAAI,QAAQ,CAAA;AAE3D,EAAA,IAAI,SAAS,SAAA,IAAa,IAAA,CAAK,aAAY,CAAE,QAAA,CAAS,aAAa,CAAA,EAAG;AACpE,IAAA,MAAM,QAAA,GAAW,uBAAuB,OAAO,CAAA;AAC/C,IAAA,IAAI,UAAU,IAAA,GAAO,QAAA;AAAA,EACvB;AAEA,EAAA,MAAM,OAAA,GAAU,OAAO,GAAA,CAAI,UAAA,KAAe,WAAW,GAAA,CAAI,UAAA,GAAa,IAAI,UAAA,EAAY,GAAA;AACtF,EAAA,MAAM,SAAA,GAAY,OAAO,GAAA,CAAI,MAAA,KAAW,WAAW,GAAA,CAAI,MAAA,GAAS,IAAI,MAAA,EAAQ,IAAA;AAE5E,EAAA,IAAA,CAAK,IAAI,GAAA,EAAK;AAAA,IACZ,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,WAAA,EAAa,IAAA;AAAA,IACb,MAAM,CAAA,QAAA,EAAW,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,IAAI,OAAO,CAAA,CAAA;AAAA,IACxC,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,OAAA;AAAA,IACb,UAAA,EAAY,OAAA;AAAA,IACZ,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,IAAI;AAAA,GACnC,CAAA;AACH;AAEO,SAAS,kBAAA,CAAmB,OAAA,EAAiB,WAAA,EAA0B,IAAA,EAA4C;AACxH,EAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,OAAO,CAAA,EAAG;AAC7B,EAAA,MAAM,UAAaA,cAAA,CAAA,WAAA,CAAY,OAAA,EAAS,EAAE,aAAA,EAAe,MAAM,CAAA;AAC/D,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,EAAY,EAAG;AAC1B,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAC9B,MAAA,MAAM,QAAA,GAAgBD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,KAAA,CAAM,IAAI,CAAA;AAC9C,MAAA,MAAM,gBAAmBC,cAAA,CAAA,WAAA,CAAY,QAAA,EAAU,EAAE,aAAA,EAAe,MAAM,CAAA;AACtE,MAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,QAAA,IAAI,MAAA,CAAO,aAAY,EAAG;AACxB,UAAA,iBAAA,CAAuBD,sBAAK,QAAA,EAAU,MAAA,CAAO,IAAI,CAAA,EAAG,aAAa,IAAI,CAAA;AAAA,QACvE;AAAA,MACF;AAAA,IACF,WAAW,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1D,MAAA,iBAAA,CAAuBA,sBAAK,OAAA,EAAS,KAAA,CAAM,IAAI,CAAA,EAAG,aAAa,IAAI,CAAA;AAAA,IACrE;AAAA,EACF;AACF;AAEO,SAAS,aAAA,CAAc,OAAA,EAAiB,WAAA,EAA0B,IAAA,EAA4C;AACnH,EAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,OAAO,CAAA,EAAG;AAC7B,EAAA,MAAM,UAAaA,cAAA,CAAA,WAAA,CAAY,OAAA,EAAS,EAAE,aAAA,EAAe,MAAM,CAAA;AAC/D,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,EAAY,EAAG;AAC1B,IAAA,MAAM,gBAAA,GAAwBD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,KAAA,CAAM,MAAM,cAAc,CAAA;AACtE,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,gBAAgB,CAAA,EAAG;AACnC,MAAA,kBAAA,CAAmB,gBAAA,EAAkB,aAAa,IAAI,CAAA;AAAA,IACxD;AAAA,EACF;AACF;AAEO,SAAS,gBAAA,CAAiB,OAAA,EAAiB,OAAA,GAAuB,EAAC,EAAwB;AAChG,EAAA,MAAM,WAAA,GAAc,qBAAA,CAAsB,OAAA,EAAS,OAAA,CAAQ,cAAc,CAAA;AACzE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAA+B;AAChD,EAAA,MAAM,KAAA,GAAaD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,cAAc,CAAA;AAE/C,EAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,KAAK,CAAA,EAAG;AACxB,IAAA,kBAAA,CAAmB,KAAA,EAAO,aAAa,IAAI,CAAA;AAC3C,IAAA,IAAI,OAAA,CAAQ,UAAU,QAAA,EAAU;AAC9B,MAAA,aAAA,CAAmBD,gBAAA,CAAA,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA,EAAG,aAAa,IAAI,CAAA;AAAA,IAC5D;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AACxC,EAAA,IAAI,OAAA,CAAQ,UAAU,QAAA,EAAU;AAC9B,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AAC5D;AAEO,SAAS,cAAc,OAAA,EAA2E;AACvG,EAAA,IAAI,CAAC,eAAA,CAAgB,OAAO,CAAA,EAAG;AAC7B,IAAA,OAAO,EAAE,YAAA,EAAc,EAAC,EAAG,UAAU,KAAA,EAAM;AAAA,EAC7C;AACA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAoBD,wBAAA,CAAA,SAAA;AAAA,MACxB,OAAA;AAAA,MACA,CAAC,IAAA,EAAM,UAAA,EAAY,MAAA,EAAQ,mBAAA,EAAqB,WAAW,OAAO,CAAA;AAAA,MAClE,EAAE,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS,GAAA;AAAM,KACtC;AACA,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,IAAK,CAAC,IAAI,MAAA,EAAQ;AACnC,MAAA,OAAO,EAAE,YAAA,EAAc,EAAC,EAAG,UAAU,KAAA,EAAM;AAAA,IAC7C;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAClC,IAAA,MAAM,OAA4B,EAAC;AACnC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AAC/B,MAAA,KAAA,MAAW,CAAA,IAAK,KAAK,OAAA,EAAS;AAC5B,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAA,EAAG;AAC7B,UAAA,KAAA,MAAW,CAAA,IAAK,EAAE,QAAA,EAAU;AAC1B,YAAA,IAAA,CAAK,IAAA,CAAK;AAAA,cACR,MAAM,CAAA,CAAE,IAAA;AAAA,cACR,OAAA,EAAS,EAAE,OAAA,IAAW,SAAA;AAAA,cACtB,aAAa,oBAAA,CAAqB,CAAA,CAAE,QAAA,GAAW,CAAC,KAAK,SAAS,CAAA;AAAA,cAC9D,IAAA,EAAM,CAAA,CAAE,UAAA,EAAY,IAAA,IAAQ,CAAA,QAAA,EAAW,EAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,IAAW,SAAS,CAAA;AAAA,aACxE,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,EAAE,YAAA,EAAc,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK;AAAA,EAC9C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,YAAA,EAAc,EAAC,EAAG,UAAU,KAAA,EAAM;AAAA,EAC7C;AACF;AAEO,SAAS,aAAa,OAAA,EAA2E;AACtG,EAAA,IAAI,CAAC,eAAA,CAAgB,MAAM,CAAA,EAAG;AAC5B,IAAA,OAAO,EAAE,YAAA,EAAc,EAAC,EAAG,UAAU,KAAA,EAAM;AAAA,EAC7C;AACA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAoBA,mCAAU,MAAA,EAAQ,CAAC,OAAO,OAAO,CAAA,CAAA,EAAI,IAAA,EAAM,MAAM,CAAA,EAAG;AAAA,MAC5E,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS;AAAA,KACV,CAAA;AACD,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,IAAK,CAAC,IAAI,MAAA,EAAQ;AACnC,MAAA,OAAO,EAAE,YAAA,EAAc,EAAC,EAAG,UAAU,KAAA,EAAM;AAAA,IAC7C;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAClC,IAAA,MAAM,OAA4B,EAAC;AACnC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AACjC,MAAA,KAAA,MAAW,CAAA,IAAK,KAAK,SAAA,EAAW;AAC9B,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,QAAA,GAAW,CAAC,GAAG,KAAA,IAAS,SAAA;AACtC,QAAA,IAAA,CAAK,IAAA,CAAK;AAAA,UACR,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,OAAA,EAAS,EAAE,OAAA,IAAW,SAAA;AAAA,UACtB,WAAA,EAAa,qBAAqB,GAAG,CAAA;AAAA,UACrC,IAAA,EAAM,EAAE,IAAA,IAAQ,CAAA,QAAA,EAAW,EAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,IAAW,SAAS,CAAA,CAAA;AAAA,UAC3D,MAAA,EAAQ,EAAE,QAAA,EAAU;AAAA,SACrB,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,OAAO,EAAE,YAAA,EAAc,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK;AAAA,EAC9C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,YAAA,EAAc,EAAC,EAAG,UAAU,KAAA,EAAM;AAAA,EAC7C;AACF;AAEO,SAAS,qBAAA,CAAsB,OAAA,EAAiB,OAAA,GAAuB,EAAC,EAAwB;AACrG,EAAA,MAAM,YAAA,GAAe,QAAQ,IAAA,IAAQ,QAAA;AAErC,EAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,IAAA,MAAM,WAAA,GAAc,cAAc,OAAO,CAAA;AACzC,IAAA,IAAI,WAAA,CAAY,QAAA,IAAY,WAAA,CAAY,YAAA,CAAa,SAAS,CAAA,EAAG;AAC/D,MAAA,OAAO,WAAA,CAAY,YAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,IAAI,iBAAiB,MAAA,EAAQ;AAC3B,IAAA,MAAM,UAAA,GAAa,aAAa,OAAO,CAAA;AACvC,IAAA,IAAI,UAAA,CAAW,QAAA,IAAY,UAAA,CAAW,YAAA,CAAa,SAAS,CAAA,EAAG;AAC7D,MAAA,OAAO,UAAA,CAAW,YAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,OAAO,iBAAiB,OAAA,EAAS;AAAA,IAC/B,KAAA,EAAO,QAAQ,KAAA,IAAS,YAAA;AAAA,IACxB,gBAAgB,OAAA,CAAQ;AAAA,GACzB,CAAA;AACH;ACxRO,SAAS,wBAAwB,GAAA,EAA4C;AAClF,EAAA,MAAM,IAAA,GAA2B;AAAA,IAC/B,IAAA,EAAM,SAAA;AAAA,IACN,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,IAAA,EAAM,IAAI,IAAA,IAAQ,CAAA,QAAA,EAAW,IAAI,IAAI,CAAA,CAAA,EAAI,IAAI,OAAO,CAAA,CAAA;AAAA,IACpD,QAAQ,GAAA,CAAI;AAAA,GACd;AAEA,EAAA,IAAI,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,WAAA,KAAgB,SAAA,EAAW;AACpD,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACd;AAAA,QACE,OAAA,EAAS;AAAA,UACP,IAAI,GAAA,CAAI;AAAA;AACV;AACF,KACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACd;AAAA,QACE,OAAA,EAAS;AAAA,UACP,IAAA,EAAM;AAAA;AACR;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,qBAAA,CACd,YAAA,EACA,OAAA,GAA+B,EAAC,EAClB;AACd,EAAA,IAAI,IAAA,GAAO,QAAQ,WAAA,IAAe,iBAAA;AAClC,EAAA,IAAI,OAAA,GAAU,QAAQ,cAAA,IAAkB,OAAA;AAExC,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAM,OAAA,GAAeG,gBAAA,CAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,cAAc,CAAA;AACzD,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,OAAO,CAAA,EAAG;AAC1B,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAASA,cAAA,CAAA,YAAA,CAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AACxD,QAAA,IAAI,GAAA,CAAI,IAAA,EAAM,IAAA,GAAO,GAAA,CAAI,IAAA;AACzB,QAAA,IAAI,GAAA,CAAI,OAAA,EAAS,OAAA,GAAU,GAAA,CAAI,OAAA;AAAA,MACjC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,GAAA,CAAI,uBAAuB,CAAA;AAE3D,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,WAAA;AAAA,IACX,WAAA,EAAa,KAAA;AAAA,IACb,OAAA,EAAS,CAAA;AAAA,IACT,YAAA,EAAc,CAAA,SAAA,EAAmBC,iBAAA,CAAA,UAAA,EAAY,CAAA,CAAA;AAAA,IAC7C,QAAA,EAAU;AAAA,MACR,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,KAAA,EAAO;AAAA,QACL;AAAA,UACE,MAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAM,cAAA;AAAA,UACN,OAAA,EAAS;AAAA;AACX,OACF;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,aAAA;AAAA,QACN,IAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,iBAAA,CAAkB,UAAkB,OAAA,EAAuB;AAClE,EAAA,MAAM,GAAA,GAAWF,yBAAQ,QAAQ,CAAA;AACjC,EAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,GAAG,CAAA,EAAG;AACvB,IAAGA,cAAA,CAAA,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACvC;AACA,EAAA,IAAI,QAAA,GAAW,EAAA;AACf,EAAA,OAAO,WAAW,CAAA,EAAG;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAC,CAAC,CAAA,IAAA,CAAA;AACtF,MAAGA,cAAA,CAAA,aAAA,CAAc,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAC3C,MAAA,IAAI;AACF,QAAA,IAAOA,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,UAAGA,cAAA,CAAA,MAAA,CAAO,QAAA,EAAU,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,QACrC;AACA,QAAGA,cAAA,CAAA,UAAA,CAAW,UAAU,QAAQ,CAAA;AAAA,MAClC,CAAA,CAAA,MAAQ;AACN,QAAA,IAAI;AACF,UAAGA,cAAA,CAAA,YAAA,CAAa,UAAU,QAAQ,CAAA;AAClC,UAAGA,0BAAW,QAAQ,CAAA;AAAA,QACxB,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACA,MAAA;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,EAAA;AACA,MAAA,IAAI,aAAa,CAAA,EAAG;AAClB,QAAA,IAAI;AACF,UAAGA,cAAA,CAAA,aAAA,CAAc,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,QAC7C,CAAA,CAAA,MAAQ;AAAA,QAER;AACA,QAAA;AAAA,MACF;AAKA,IACF;AAAA,EACF;AACF;AAEO,SAAS,kBAAA,CAAmB,MAAoB,UAAA,EAA0B;AAC/E,EAAA,iBAAA,CAAkB,YAAY,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAC7D;AAEO,SAAS,yBAAA,CACd,YAAA,EACA,WAAA,GAAc,SAAA,EACN;AACR,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,CAAA,wDAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,mBAAmB,WAAW,CAAA,CAAA;AAAA,IAC9B,CAAA,aAAA,EAAA,iBAAgB,IAAI,IAAA,EAAK,EAAE,WAAA,GAAc,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA;AAAA,IACtD,CAAA,yBAAA,EAA4B,aAAa,MAAM,CAAA,CAAA;AAAA,IAC/C,CAAA,CAAA;AAAA,IACA,CAAA,+IAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,GAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,mCAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,wCAAA,CAAA;AAAA,IACA,CAAA,uBAAA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,GAAA,CAAI,IAAI,CAAA,SAAA,EAAY,IAAI,OAAO,CAAA,OAAA,EAAU,GAAA,CAAI,WAAW,CAAA,IAAA,CAAM,CAAA;AAAA,EACpF;AAEA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,sCAAsC,CAAA;AACjD,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,IAAA,KAAA,CAAM,KAAK,CAAA,IAAA,EAAO,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAC3C,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,GAAA,CAAI,WAAW,CAAA,EAAA,CAAI,CAAA;AACnD,IAAA,IAAI,IAAI,MAAA,EAAQ,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AACvD,IAAA,IAAI,IAAI,UAAA,EAAY,KAAA,CAAM,KAAK,CAAA,mBAAA,EAAsB,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAErE,IAAA,IAAI,GAAA,CAAI,WAAA,IAAkBA,cAAA,CAAA,UAAA,CAAW,GAAA,CAAI,WAAW,CAAA,EAAG;AACrD,MAAA,IAAI;AACF,QAAA,MAAM,OAAUA,cAAA,CAAA,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,OAAO,EAAE,IAAA,EAAK;AAC5D,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,QAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAI,KAAK,IAAA,CAAK,MAAA,GAAS,GAAA,GAAO,wBAAA,GAA2B,EAAA,CAAG,CAAA;AACrF,QAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,MAClB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,SAAS,sBAAA,CAAuB,SAAiB,UAAA,EAA0B;AAChF,EAAA,iBAAA,CAAkB,YAAY,OAAO,CAAA;AACvC;;;ACxIA,IAAM,iBAAA,GAAoB;AAAA,EACxB,KAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,kBAAA,GAAqB;AAAA,EACzB,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,4BAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,eAAA,GAAkB;AAAA,EACtB,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA;AAEO,SAAS,mBAAmB,OAAA,EAAmE;AACpG,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMvC,sBAAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAC7B,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,qBAA6C,EAAC;AAEpD,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,KAAA,MAAW,GAAG,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,EAAG;AACpD,QAAA,IAAI,GAAA,CAAI,WAAW,OAAA,EAAS;AAC1B,UAAA,SAAA,CAAU,IAAA,CAAK,GAAI,GAAA,CAAI,gBAAA,IAAoB,EAAG,CAAA;AAAA,QAChD,WAAW,GAAA,CAAI,MAAA,KAAW,iBAAA,IAAqB,GAAA,CAAI,WAAW,8BAAA,EAAgC;AAC5F,UAAA,UAAA,CAAW,IAAA,CAAK,GAAI,GAAA,CAAI,gBAAA,IAAoB,EAAG,CAAA;AAAA,QACjD,CAAA,MAAA,IAAW,GAAA,CAAI,MAAA,KAAW,MAAA,EAAQ;AAChC,UAAA,OAAA,CAAQ,IAAA,CAAK,GAAI,GAAA,CAAI,gBAAA,IAAoB,EAAG,CAAA;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,EAAK,YAAY,4BAAA,EAA8B;AACjD,MAAA,KAAA,MAAW,GAAA,IAAO,GAAA,CAAI,UAAA,CAAW,4BAAA,EAA8B;AAC7D,QAAA,kBAAA,CAAmB,GAAA,CAAI,OAAO,CAAA,GAAI,GAAA,CAAI,MAAA,IAAU,UAAA;AAAA,MAClD;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAK,OAAA,IAAW,KAAA;AAAA,MACzB,SAAA,EAAW,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,iBAAA;AAAA,MAC9C,UAAA,EAAY,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,kBAAA;AAAA,MACjD,OAAA,EAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,eAAA;AAAA,MACxC,kBAAA;AAAA,MACA,SAAA,EAAW;AAAA,KACb;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,SAAA,EAAW,iBAAA;AAAA,MACX,UAAA,EAAY,kBAAA;AAAA,MACZ,OAAA,EAAS,eAAA;AAAA,MACT,oBAAoB;AAAC,KACvB;AAAA,EACF;AACF;AAEO,SAAS,uBAAA,CACd,KACA,MAAA,EACqE;AACrE,EAAA,MAAM,WAAW,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,EAAE,EAAE,IAAA,EAAK;AAE/C,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAC7B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AACxD,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,CAAC,MAAM,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,CAAC,CAAC,CAAA;AACnE,IAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,CAAC,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAC,CAAA;AAChE,IAAA,OAAO,EAAE,aAAa,YAAA,EAAc,SAAA,EAAW,cAAc,CAAC,YAAA,EAAc,cAAc,KAAA,EAAM;AAAA,EAClG;AAEA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG;AAC9B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AACzD,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,CAAC,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAC,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,MAAM,KAAA,CAAM,CAAC,MAAM,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,CAAC,CAAC,CAAA;AACpE,IAAA,OAAO,EAAE,WAAA,EAAa,YAAA,EAAc,SAAA,EAAW,UAAA,EAAY,cAAc,KAAA,EAAM;AAAA,EACjF;AAEA,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA;AAAA,IAC/C,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA;AAAA,IAC3C,YAAA,EAAc,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,QAAQ;AAAA,GACnD;AACF;AAEO,SAAS,wBAAA,CAAyB,KAAwB,MAAA,EAAgD;AAC/G,EAAA,MAAM,MAAM,GAAA,CAAI,WAAA;AAChB,EAAA,IAAI,GAAA,KAAQ,SAAA,IAAa,CAAC,GAAA,EAAK;AAC7B,IAAA,OAAO;AAAA,MACL,aAAa,GAAA,CAAI,IAAA;AAAA,MACjB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,OAAA,EAAS,SAAA;AAAA,MACT,QAAA,EAAU,cAAA;AAAA,MACV,MAAA,EAAQ,CAAA,qCAAA,EAAwC,GAAA,CAAI,IAAI,CAAA,sCAAA;AAAA,KAC1D;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,GAAA,EAAK,MAAM,CAAA;AAEtD,EAAA,IAAI,WAAW,SAAA,EAAW;AACxB,IAAA,OAAO;AAAA,MACL,aAAa,GAAA,CAAI,IAAA;AAAA,MACjB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,OAAA,EAAS,GAAA;AAAA,MACT,QAAA,EAAU,SAAA;AAAA,MACV,MAAA,EAAQ,YAAY,GAAG,CAAA,kFAAA;AAAA,KACzB;AAAA,EACF;AAEA,EAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,IAAA,IAAI,MAAA,CAAO,kBAAA,GAAqB,GAAA,CAAI,IAAI,CAAA,EAAG;AACzC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO;AAAA,MACL,aAAa,GAAA,CAAI,IAAA;AAAA,MACjB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,OAAA,EAAS,GAAA;AAAA,MACT,QAAA,EAAU,YAAA;AAAA,MACV,MAAA,EAAQ,YAAY,GAAG,CAAA,+EAAA;AAAA,KACzB;AAAA,EACF;AAEA,EAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,aAAa,GAAA,CAAI,IAAA;AAAA,IACjB,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,OAAA,EAAS,GAAA;AAAA,IACT,QAAA,EAAU,cAAA;AAAA,IACV,MAAA,EAAQ,YAAY,GAAG,CAAA,uEAAA;AAAA,GACzB;AACF;AAEO,SAAS,6BAAA,CACd,YAAA,EACA,UAAA,EACA,MAAA,EACA,QAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,WAAW,MAAA,KAAW,CAAA;AACnC,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,CAAA,8DAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,yBAAA,EAAA,iBAA4B,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA,CAAA;AAAA,IACpD,iBAAiB,IAAA,GAAO,yDAAA,GAAuD,CAAA,sBAAA,EAAoB,UAAA,CAAW,MAAM,CAAA,qBAAA,CAAuB,CAAA,CAAA;AAAA,IAC3I,CAAA,kCAAA,EAAqC,aAAa,MAAM,CAAA,CAAA;AAAA,IACxD,QAAA,GAAW,CAAA,kCAAA,EAAqC,QAAQ,CAAA,EAAA,CAAA,GAAO,EAAA;AAAA,IAC/D,CAAA,CAAA;AAAA,IACA,CAAA,GAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,oCAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,6DAAA,CAAA;AAAA,IACA,CAAA,uCAAA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,IAAA,MAAM,SAAA,GAAY,WAAW,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,WAAA,KAAgB,IAAI,IAAI,CAAA;AACnE,IAAA,MAAM,OAAA,GAAU,SAAA,GAAY,CAAA,OAAA,EAAK,SAAA,CAAU,QAAQ,CAAA,CAAA,GAAK,kBAAA;AACxD,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,QAAA,GAAW,QAAA,GAAW,YAAA;AAC1C,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,GAAA,CAAI,IAAI,YAAY,GAAA,CAAI,OAAO,CAAA,OAAA,EAAU,GAAA,CAAI,WAAW,CAAA,KAAA,EAAQ,OAAO,CAAA,GAAA,EAAM,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,EAC9G;AAEA,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,uCAAuC,EAAE,CAAA;AACnE,IAAA,KAAA,CAAM,KAAK,sDAAsD,CAAA;AACjE,IAAA,KAAA,CAAM,KAAK,iCAAiC,CAAA;AAC5C,IAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,CAAA,CAAE,WAAW,CAAA,SAAA,EAAY,CAAA,CAAE,OAAO,CAAA,OAAA,EAAU,CAAA,CAAE,QAAQ,CAAA,KAAA,EAAQ,CAAA,CAAE,MAAM,CAAA,EAAA,CAAI,CAAA;AAAA,IAChG;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,4BAA4B,CAAA;AACtD,EAAA,KAAA,CAAM,IAAA,CAAK,mBAAmB,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,OAAA,EAAU,MAAA,CAAO,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,EAAE,IAAA,CAAK,MAAM,CAAC,CAAA,EAAG,MAAA,CAAO,UAAU,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,EAAE,CAAA,EAAA,CAAI,CAAA;AACvJ,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,OAAA,EAAU,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,MAAM,CAAC,CAAA,EAAA,CAAI,CAAA;AAClG,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,OAAA,EAAU,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA,EAAA,CAAI,CAAA;AAE/F,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AACxC;AAEA,SAAS,oBAAA,CACP,cACA,MAAA,EAC+F;AAC/F,EAAA,MAAM,UAA+B,EAAC;AACtC,EAAA,MAAM,aAAiC,EAAC;AACxC,EAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,EAAA,IAAOyC,cAAA,CAAA,UAAA,CAAW,YAAY,CAAA,EAAG;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,MAAMzC,sBAAAA,CAAK,IAAA,CAAQyC,cAAA,CAAA,YAAA,CAAa,YAAA,EAAc,OAAO,CAAC,CAAA;AAC5D,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,sBAAsB,CAAA,EAAG;AAC9C,QAAA,KAAA,MAAW,GAAA,IAAO,IAAI,sBAAA,EAAwB;AAC5C,UAAA,MAAM,IAAA,GAA0B;AAAA,YAC9B,MAAM,GAAA,CAAI,OAAA;AAAA,YACV,OAAA,EAAS,IAAI,OAAA,IAAW,SAAA;AAAA,YACxB,aAAa,GAAA,CAAI,YAAA;AAAA,YACjB,QAAA,EAAU;AAAA,WACZ;AACA,UAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAEjB,UAAA,IAAI,GAAA,CAAI,WAAW,UAAA,EAAY;AAC7B,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,CAAA,GAAI,wBAAA,CAAyB,IAAA,EAAM,MAAM,CAAA;AAC/C,UAAA,IAAI,CAAA,EAAG;AACL,YAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,UACnB,CAAA,MAAO;AACL,YAAA,cAAA,EAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,YAAA,EAAc,OAAA,EAAS,UAAA,EAAY,cAAA,EAAe;AAC7D;AAEO,SAAS,cAAA,CAAe,OAAA,GAAsC,EAAC,EAA8B;AAClG,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAmBC,gBAAA,CAAA,IAAA,CAAK,SAAS,qBAAqB,CAAA;AAEjF,EAAA,IAAI,aAAA,GAAmBD,cAAA,CAAA,UAAA,CAAW,UAAU,CAAA,GACxC,kBAAA,CAAsBA,cAAA,CAAA,YAAA,CAAa,UAAA,EAAY,OAAO,CAAC,CAAA,GACvD,kBAAA,CAAmB,EAAE,CAAA;AAEzB,EAAA,MAAM,MAAA,GAAwB;AAAA,IAC5B,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,WAAW,aAAA,CAAc,SAAA;AAAA,IACzB,YAAY,aAAA,CAAc,UAAA;AAAA,IAC1B,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,oBAAoB,aAAA,CAAc;AAAA,GACpC;AAEA,EAAA,MAAM,qBAAqB,OAAA,CAAQ,OAAA,CAAQ,YAAA,IAAgB,OAAA,CAAQ,YAAY,KAAK,CAAA;AAEpF,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,IAAI,eAAe,OAAA,CAAQ,YAAA;AAC3B,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,cAAA,GAAiB;AAAA,QAChBC,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,YAAA,EAAc,uBAAuB,CAAA;AAAA,QACnDA,gBAAA,CAAA,IAAA,CAAK,SAAS,uBAAuB;AAAA,OAC5C;AACA,MAAA,YAAA,GAAe,cAAA,CAAe,KAAK,CAAC,CAAA,KAASD,0BAAW,CAAC,CAAC,CAAA,IAAK,cAAA,CAAe,CAAC,CAAA;AAAA,IACjF;AAEA,IAAA,MAAM,EAAE,YAAA,EAAAE,aAAAA,EAAc,UAAA,EAAAC,WAAAA,EAAY,gBAAAC,eAAAA,EAAe,GAAI,oBAAA,CAAqB,YAAA,EAAc,MAAM,CAAA;AAC9F,IAAA,MAAMC,eAAAA,GAAiB,6BAAA,CAA8BH,aAAAA,EAAcC,WAAAA,EAAY,MAAM,CAAA;AAErF,IAAA,OAAO;AAAA,MACL,OAAA,EAASA,YAAW,MAAA,KAAW,CAAA;AAAA,MAC/B,gBAAgBD,aAAAA,CAAa,MAAA;AAAA,MAC7B,cAAA,EAAAE,eAAAA;AAAA,MACA,UAAA,EAAAD,WAAAA;AAAA,MACA,cAAA,EAAAE,eAAAA;AAAA,MACA,mBAAA,EAAqBH;AAAA,KACvB;AAAA,EACF;AAGA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,KAAU,aAAA,CAAc,SAAA,EAAW,UAAU,aAAA,EAAe,WAAA,EAAY,KAAM,QAAA,GAAW,QAAA,GAAW,YAAA,CAAA;AAC1H,EAAA,MAAM,YAAA,GAAe,sBAAsB,OAAA,EAAS;AAAA,IAClD,IAAA,EAAM,QAAQ,IAAA,IAAQ,QAAA;AAAA,IACtB,KAAA;AAAA,IACA,gBAAgB,OAAA,CAAQ;AAAA,GACzB,CAAA;AAED,EAAA,MAAM,aAAiC,EAAC;AACxC,EAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,EAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,IAAA,MAAM,SAAA,GAAY,wBAAA,CAAyB,GAAA,EAAK,MAAM,CAAA;AACtD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,cAAA,EAAA;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,QAAA;AACJ,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,YAAA,KAAiB,KAAA,KAAU,QAAQ,YAAA,KAAiB,IAAA,IAAQ,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,IAAK,aAAA,CAAc,SAAA,EAAW,UAAU,aAAA,KAAkB,IAAA,CAAA;AAC5K,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAiBD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,WAAW,eAAe,CAAA;AAC5E,IAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,YAAA,EAAc,EAAE,SAAS,CAAA;AAC5D,IAAA,kBAAA,CAAmB,MAAM,QAAQ,CAAA;AAAA,EACnC;AAGA,EAAA,IAAI,WAAA;AACJ,EAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,eAAA,KAAoB,IAAA,IAAQ,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA,IAAK,OAAA,CAAQ,aAAA,CAAc,SAAA,EAAW,QAAA,EAAU,mBAAmB,CAAA;AAC3J,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,MAAM,eAAA,GAAkB,aAAA,CAAc,SAAA,EAAW,QAAA,EAAU,mBAAA,IAAuB,wBAAA;AAClF,IAAA,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAoBA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,eAAe,CAAA;AACvE,IAAA,MAAM,cAAA,GAAiB,0BAA0B,YAAY,CAAA;AAC7D,IAAA,sBAAA,CAAuB,gBAAgB,WAAW,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,cAAA,GAAiB,6BAAA,CAA8B,YAAA,EAAc,UAAA,EAAY,QAAQ,QAAQ,CAAA;AAE/F,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,WAAW,MAAA,KAAW,CAAA;AAAA,IAC/B,gBAAgB,YAAA,CAAa,MAAA;AAAA,IAC7B,cAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,mBAAA,EAAqB;AAAA,GACvB;AACF;AC1YO,IAAM,yBAAA,GAAsC;AAAA,EACjD,gBAAA;AAAA,EACA,8BAAA;AAAA,EACA,2BAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,yBAAA;AAAA,EACA,yBAAA;AAAA,EACA,2BAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF;AAEO,SAAS,wBAAwB,SAAA,EAAkC;AACxE,EAAA,IAAI,CAAIK,cAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG,OAAO,UAAA;AAEtC,EAAA,MAAM,QAAA,GAAgBC,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,SAAS,CAAA;AAC/C,EAAA,IAAOD,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,UAAaA,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA,CAAE,OAAA,CAAQ,WAAW,EAAE,CAAA;AACxE,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,6BAA6B,CAAA;AACzD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,QAAA,GAAW/C,sBAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACnC,QAAA,IACE,QAAA,IACA,QAAA,CAAS,OAAA,IACT,CAAC,OAAA,EAAS,UAAA,EAAY,UAAU,CAAA,CAAE,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAC3D;AACA,UAAA,OAAO,QAAA,CAAS,OAAA;AAAA,QAClB;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AAEO,SAAS,yBAAyB,QAAA,EAA2B;AAClE,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAC9C,EAAA,OAAO,0BAA0B,IAAA,CAAK,CAAC,YAAY,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAC,CAAA;AAC7E;AAEO,SAAS,yBAAA,CACd,OAAA,GAAsC,EAAC,EACZ;AAC3B,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,IAAI,YAAY,OAAA,CAAQ,SAAA;AAExB,EAAA,IAAI,CAAC,SAAA,IAAa,OAAA,CAAQ,QAAA,EAAU;AAClC,IAAA,MAAM,UAAA,GAAa;AAAA,MACZgD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,OAAA,CAAQ,QAAQ,CAAA;AAAA,MACvCA,sBAAK,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,QAAQ,QAAQ,CAAA;AAAA,MAC5DA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,UAAA,EAAY,OAAA,EAAS,QAAQ,QAAQ,CAAA;AAAA,MACnDA,sBAAK,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,WAAA,EAAa,QAAQ,QAAQ;AAAA,KACtE;AACA,IAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,MAAA,IAAOD,cAAA,CAAA,UAAA,CAAW,CAAC,CAAA,EAAG;AACpB,QAAA,SAAA,GAAY,CAAA;AACZ,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,iBAAiB,EAAC;AAErE,EAAA,MAAM,OAAA,GAAyB,SAAA,GAC3B,uBAAA,CAAwB,SAAS,CAAA,GACjC,UAAA;AAEJ,EAAA,MAAM,aAAuB,EAAC;AAE9B,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IAAA,KAAA,MAAW,WAAW,aAAA,EAAe;AACnC,MAAA,MAAM,UAAeC,gBAAA,CAAA,UAAA,CAAW,OAAO,IAC9BA,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA,GAC9B,OAAA;AAEJ,MAAA,IAAI,wBAAA,CAAyB,OAAO,CAAA,EAAG;AACrC,QAAA,UAAA,CAAW,IAAA;AAAA,UACT,6BAA6B,OAAO,CAAA,0NAAA;AAAA,SACtC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,WAAW,MAAA,GAAS,CAAA;AACrC,EAAA,MAAM,UAAU,CAAC,QAAA;AAEjB,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,CAAA,0EAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,YAAA,EAAA,iBAAe,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA,CAAA;AAAA,IACvC,CAAA,2BAAA,EAA8B,OAAA,CAAQ,WAAA,EAAa,CAAA,EAAA,CAAA;AAAA,IACnD,CAAA,eAAA,EAAkB,OAAA,GAAU,kBAAA,GAAgB,gBAAW,CAAA,CAAA;AAAA,IACvD,CAAA,CAAA;AAAA,IACA,CAAA,GAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,oCAAA,EAAuC,cAAc,MAAM,CAAA,OAAA,CAAA;AAAA,IAC3D,CAAA;AAAA,GACF;AAEA,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,cAAA,CAAe,KAAK,CAAA,0DAAA,CAAuD,CAAA;AAAA,EAC7E,CAAA,MAAO;AACL,IAAA,cAAA,CAAe,KAAK,CAAA,wBAAA,CAA0B,CAAA;AAC9C,IAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,MAAA,cAAA,CAAe,IAAA,CAAK,CAAA,SAAA,EAAO,CAAC,CAAA,CAAE,CAAA;AAAA,IAChC;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA,EAAe,UAAA;AAAA,IACf,cAAA,EAAgB,aAAA;AAAA,IAChB,QAAQ,EAAC;AAAA,IACT,cAAA,EAAgB,cAAA,CAAe,IAAA,CAAK,IAAI;AAAA,GAC1C;AACF;AC9GA,IAAM,UAAA,uBAAiB,GAAA,CAAI;AAAA;AAAA,EAEzB,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1E,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,KAAA;AAAA;AAAA,EAElE,KAAA;AAAA,EAAO,GAAA;AAAA,EAAK,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,IAAA;AAAA,EACtE,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ;AACrC,CAAC,CAAA;AAED,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EAC/B,WAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAC,CAAA;AAgBM,SAAS,cAAc,OAAA,EAAyB;AACrD,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AAChD,EAAA,OAAcC,iBAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,YAAY,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAC7E;AAEO,SAAS,cAAc,KAAA,EAA4B;AACxD,EAAA,MAAM,KAAA,GAAQ,KAAA,CACX,WAAA,EAAY,CACZ,SAAA,CAAU,KAAK,CAAA,CACf,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA,CAC9B,OAAA,CAAQ,cAAA,EAAgB,GAAG,CAAA,CAC3B,KAAA,CAAM,KAAK,CAAA,CACX,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,CAAC,UAAA,CAAW,GAAA,CAAI,CAAC,CAAC,CAAA;AACnD,EAAA,OAAO,IAAI,IAAI,KAAK,CAAA;AACtB;AAEO,SAAS,0BAAA,CAA2B,MAAmB,IAAA,EAA2B;AACvF,EAAA,IAAI,KAAK,IAAA,KAAS,CAAA,IAAK,IAAA,CAAK,IAAA,KAAS,GAAG,OAAO,CAAA;AAC/C,EAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AAClB,MAAA,gBAAA,EAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,gBAAA;AAC1C,EAAA,OAAO,SAAA,KAAc,CAAA,GAAI,CAAA,GAAI,gBAAA,GAAmB,SAAA;AAClD;AAEO,SAAS,qBAAqB,IAAA,EAAsB;AACzD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,0DAA0D,CAAA;AACtF,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AAAA,EAC7D;AACA,EAAA,MAAM,aAAa,IAAA,CAChB,KAAA,CAAM,YAAY,CAAA,CAClB,OAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,WAAW,GAAG,CAAA,IAAK,EAAE,IAAA,EAAK,CAAE,SAAS,CAAC,CAAA;AAC1D,EAAA,OAAA,CAAQ,UAAA,CAAW,CAAC,CAAA,IAAK,EAAA,EAAI,IAAA,GAAO,WAAA,EAAY,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AACvE;AAEO,SAAS,sBAAsB,WAAA,EAA2C;AAC/E,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,WAAA,CAAY,EAAA,IAAM,EAAE,CAAA;AACtC,EAAA,MAAM,OAAO,MAAA,CAAO,WAAA,CAAY,IAAA,IAAQ,EAAE,EAAE,WAAA,EAAY;AACxD,EAAA,MAAM,WAAW,MAAA,CAAQ,WAAA,CAAwC,QAAA,IAAY,EAAE,EAAE,WAAA,EAAY;AAE7F,EAAA,OACE,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,IACnB,GAAG,UAAA,CAAW,KAAK,CAAA,IACnB,EAAA,CAAG,WAAW,MAAM,CAAA,IACpB,EAAA,CAAG,UAAA,CAAW,UAAU,CAAA,IACxB,EAAA,CAAG,UAAA,CAAW,UAAU,CAAA,IACxB,IAAA,KAAS,aAAA,IACT,IAAA,KAAS,0BACT,IAAA,KAAS,oBAAA,IACT,QAAA,KAAa,YAAA,IACb,aAAa,SAAA,IACb,QAAA,KAAa,YAAA,IACb,QAAA,KAAa,cACb,QAAA,KAAa,QAAA;AAEjB;AAEO,SAAS,oBAAA,CAAqB,UAAkB,OAAA,EAA4C;AACjG,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAaC,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,6BAA6B,CAAA;AACzD,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,IAAA,MAAM,MAAA,GAASlD,sBAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACjC,IAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,UAAU,OAAO,IAAA;AAElD,IAAA,MAAM,WAAA,GAAc,MAAA;AACpB,IAAA,IAAI,CAAC,WAAA,CAAY,EAAA,IAAM,CAAC,qBAAA,CAAsB,WAAW,CAAA,EAAG;AAC1D,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAO,OAAA,CAAQ,SAAA,CAAU,KAAA,CAAM,CAAC,EAAE,MAAM,CAAA;AAC9C,IAAA,MAAM,UAAemD,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAEnE,IAAA,MAAM,UAAA,GAAa,YAAY,cAAc,CAAA;AAC7C,IAAA,MAAM,WAAA,GAAwB,KAAA,CAAM,OAAA,CAAQ,UAAU,IAClD,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA,GACrB,aACE,CAAC,MAAA,CAAO,UAAU,CAAC,IACnB,EAAC;AAEP,IAAA,MAAM,OAAA,GAAU,YAAY,eAAe,CAAA;AAC3C,IAAA,MAAM,YAAA,GAAyB,MAAM,OAAA,CAAQ,OAAO,IAChD,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA,CAAE,aAAY,CAAE,IAAA,EAAM,CAAA,GACnE,EAAC;AAEL,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,MAAA,CAAO,WAAA,CAAY,EAAE,EAAE,IAAA,EAAK;AAAA,MAChC,IAAA,EAAM,QAAA;AAAA,MACN,OAAA;AAAA,MACA,OAAO,MAAA,CAAO,WAAA,CAAY,KAAA,IAAS,EAAE,EAAE,IAAA,EAAK;AAAA,MAC5C,SAAS,MAAA,CAAO,WAAA,CAAY,OAAA,IAAW,OAAO,EAAE,IAAA,EAAK;AAAA,MACrD,MAAM,WAAA,CAAY,IAAA,GAAO,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,MACpD,UAAU,WAAA,CAAY,QAAA,GAAW,MAAA,CAAO,WAAA,CAAY,QAAQ,CAAA,GAAI,KAAA,CAAA;AAAA,MAChE,WAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA,EAAe,cAAc,OAAO,CAAA;AAAA,MACpC,uBAAA,EAAyB,qBAAqB,IAAI;AAAA,KACpD;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,wBAAA,CACd,OAAA,GAAoC,EAAC,EACZ;AACzB,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,MAAM,SAAA,GAAY,QAAQ,wBAAA,IAA4B,IAAA;AAEtD,EAAA,MAAM,UAAA,GAAa,YAAY,OAAO,CAAA;AACtC,EAAA,MAAM,eAAqC,EAAC;AAE5C,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,MAAM,UAAeA,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAG/D,IAAA,IACE,OAAA,CAAQ,QAAA,CAAS,eAAe,CAAA,IAChC,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,IACxB,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA,IAC7B,OAAA,CAAQ,UAAA,CAAW,YAAY,CAAA,IAC/B,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,IAC7B,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,IAC7B,OAAA,CAAQ,UAAA,CAAW,aAAa,CAAA,EAChC;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,oBAAA,CAAqB,IAAA,EAAM,OAAO,CAAA;AAC9C,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,MAAM,SAA2B,EAAC;AAGlC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAgC;AAClD,EAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AACjC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,QAAA,CAAS,OAAA,KAAY,GAAA,CAAI,OAAA,EAAS;AACpC,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,cAAA;AAAA,UACN,QAAA,EAAU,OAAA;AAAA,UACV,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,MAAM,GAAA,CAAI,OAAA;AAAA,UACV,eAAe,QAAA,CAAS,EAAA;AAAA,UACxB,iBAAiB,QAAA,CAAS,OAAA;AAAA,UAC1B,OAAA,EAAS,4BAA4B,GAAA,CAAI,EAAE,0CAA0C,GAAA,CAAI,OAAO,CAAA,KAAA,EAAQ,QAAA,CAAS,OAAO,CAAA,EAAA;AAAA,SACzH,CAAA;AAAA,MACH;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,GAAG,CAAA;AAAA,IACvB;AAAA,EACF;AAGA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,CAAA,GAAI,aAAa,CAAC,CAAA;AACxB,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,CAAA,CAAE,KAAK,CAAA;AAErC,IAAA,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAChD,MAAA,MAAM,CAAA,GAAI,aAAa,CAAC,CAAA;AAGxB,MAAA,IAAI,CAAA,CAAE,EAAA,KAAO,CAAA,CAAE,EAAA,EAAI;AAGnB,MAAA,IACG,CAAA,CAAE,aAAA,KAAkB,CAAA,CAAE,aAAA,IAAiB,EAAE,aAAA,CAAc,MAAA,GAAS,CAAA,IAChE,CAAA,CAAE,wBAAwB,MAAA,GAAS,EAAA,IAClC,CAAA,CAAE,uBAAA,KAA4B,EAAE,uBAAA,EAClC;AACA,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,eAAA;AAAA,UACN,QAAA,EAAU,OAAA;AAAA,UACV,IAAI,CAAA,CAAE,EAAA;AAAA,UACN,MAAM,CAAA,CAAE,OAAA;AAAA,UACR,eAAe,CAAA,CAAE,EAAA;AAAA,UACjB,iBAAiB,CAAA,CAAE,OAAA;AAAA,UACnB,OAAA,EAAS,CAAA,2DAAA,EAA2D,CAAA,CAAE,EAAE,CAAA,GAAA,EAAM,CAAA,CAAE,OAAO,CAAA,KAAA,EAAQ,CAAA,CAAE,EAAE,CAAA,GAAA,EAAM,CAAA,CAAE,OAAO,CAAA,EAAA;AAAA,SACnH,CAAA;AACD,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,OAAA,GAAU,aAAA,CAAc,CAAA,CAAE,KAAK,CAAA;AACrC,MAAA,MAAM,UAAA,GAAa,0BAAA,CAA2B,OAAA,EAAS,OAAO,CAAA;AAE9D,MAAA,IAAI,cAAc,SAAA,IAAa,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,OAAO,CAAA,EAAG;AACnE,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,kBAAA;AAAA,UACN,QAAA,EAAU,OAAA;AAAA,UACV,IAAI,CAAA,CAAE,EAAA;AAAA,UACN,MAAM,CAAA,CAAE,OAAA;AAAA,UACR,eAAe,CAAA,CAAE,EAAA;AAAA,UACjB,iBAAiB,CAAA,CAAE,OAAA;AAAA,UACnB,eAAA,EAAiB,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,GAAG,CAAA,GAAI,GAAA;AAAA,UAChD,SAAS,CAAA,qCAAA,EAAwC,IAAA,CAAK,MAAM,UAAA,GAAa,GAAG,CAAC,CAAA,uBAAA,EAA0B,CAAA,CAAE,EAAE,CAAA,IAAA,EAAO,EAAE,KAAK,CAAA,QAAA,EAAW,EAAE,EAAE,CAAA,IAAA,EAAO,EAAE,KAAK,CAAA,GAAA;AAAA,SACvJ,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,gBAAgB,IAAI,GAAA;AAAA,QACxB,CAAA,CAAE,YAAA,CAAa,MAAA,CAAO,CAAC,MAAM,CAAC,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,KAAM,CAAA,CAAE,EAAA,CAAG,aAAa;AAAA,OACnF;AACA,MAAA,MAAM,gBAAgB,IAAI,GAAA;AAAA,QACxB,CAAA,CAAE,YAAA,CAAa,MAAA,CAAO,CAAC,MAAM,CAAC,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,KAAM,CAAA,CAAE,EAAA,CAAG,aAAa;AAAA,OACnF;AAEA,MAAA,IAAI,aAAA,CAAc,OAAO,CAAA,IAAK,aAAA,CAAc,OAAO,CAAA,IAAK,aAAA,CAAc,IAAA,KAAS,aAAA,CAAc,IAAA,EAAM;AACjG,QAAA,IAAI,QAAA,GAAW,IAAA;AACf,QAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC/B,UAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3B,YAAA,QAAA,GAAW,KAAA;AACX,YAAA;AAAA,UACF;AAAA,QACF;AACA,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,IAAA,EAAM,mBAAA;AAAA,YACN,QAAA,EAAU,OAAA;AAAA,YACV,IAAI,CAAA,CAAE,EAAA;AAAA,YACN,MAAM,CAAA,CAAE,OAAA;AAAA,YACR,eAAe,CAAA,CAAE,EAAA;AAAA,YACjB,iBAAiB,CAAA,CAAE,OAAA;AAAA,YACnB,OAAA,EAAS,CAAA,yBAAA,EAA4B,CAAA,CAAE,EAAE,UAAU,CAAA,CAAE,EAAE,CAAA,iCAAA,EAAoC,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,WAChI,CAAA;AAAA,QACH;AAAA,MACF;AAGA,MAAA,MAAM,GAAA,GAAM,EAAE,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,KAAK,CAAC,CAAA;AAC3D,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,CAAE,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,KAAK,CAAC,CAAC,CAAA;AACpE,MAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,QAAA,IAAI,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,EAAG;AACf,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,IAAA,EAAM,sBAAA;AAAA,YACN,QAAA,EAAU,SAAA;AAAA,YACV,IAAI,CAAA,CAAE,EAAA;AAAA,YACN,MAAM,CAAA,CAAE,OAAA;AAAA,YACR,eAAe,CAAA,CAAE,EAAA;AAAA,YACjB,iBAAiB,CAAA,CAAE,OAAA;AAAA,YACnB,OAAA,EAAS,kCAAkC,CAAA,CAAE,EAAE,UAAU,CAAA,CAAE,EAAE,2CAA2C,EAAE,CAAA,EAAA;AAAA,WAC3G,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,OAAO,CAAA,CAAE,MAAA;AAChE,EAAA,MAAM,YAAA,GAAe,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,SAAS,CAAA,CAAE,MAAA;AAEpE,EAAA,MAAM,MAAA,GAAkC;AAAA,IACtC,SAAS,UAAA,KAAe,CAAA;AAAA,IACxB,mBAAmB,YAAA,CAAa,MAAA;AAAA,IAChC,UAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,cAAA,GAAiB,iCAAiC,MAAM,CAAA;AAC/D,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,iCAAiC,MAAA,EAAyC;AACxF,EAAA,MAAM,OAAO,MAAA,CAAO,OAAA;AACpB,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,CAAA,qFAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,uBAAA,EAAA,iBAA0B,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA,CAAA;AAAA,IAClD,kBAAkB,IAAA,GAAO,2CAAA,GAAyC,CAAA,gBAAA,EAAc,MAAA,CAAO,UAAU,CAAA,2BAAA,CAA6B,CAAA,CAAA;AAAA,IAC9H,CAAA,4BAAA,EAA+B,OAAO,iBAAiB,CAAA,eAAA,EAAkB,OAAO,UAAU,CAAA,iBAAA,EAAoB,OAAO,YAAY,CAAA,CAAA;AAAA,IACjI,CAAA,CAAA;AAAA,IACA,CAAA,GAAA;AAAA,GACF;AAEA,EAAA,IAAI,MAAA,CAAO,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC9B,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,CAAA;AAAA,MACA,CAAA,qBAAA,CAAA;AAAA,MACA,CAAA,CAAA;AAAA,MACA,CAAA,yJAAA,CAAA;AAAA,MACA,CAAA,8EAAA;AAAA,KACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,CAAA;AAAA,MACA,CAAA,iCAAA,CAAA;AAAA,MACA,CAAA,CAAA;AAAA,MACA,CAAA,uEAAA,CAAA;AAAA,MACA,CAAA,qCAAA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,KAAa,OAAA,GAAU,iBAAA,GAAa,sBAAA;AACxD,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,CAAA,IAAA,EAAO,KAAK,CAAA,OAAA,EAAU,KAAA,CAAM,IAAI,YAAY,KAAA,CAAM,EAAE,CAAA,QAAA,EAAW,KAAA,CAAM,IAAI,CAAA,MAAA,EACvE,MAAM,aAAA,GAAgB,CAAA,EAAA,EAAK,KAAA,CAAM,aAAa,CAAA,MAAA,EAAS,KAAA,CAAM,eAAe,CAAA,GAAA,CAAA,GAAQ,KACtF,CAAA,GAAA,EAAM,KAAA,CAAM,OAAO,CAAA,EAAA;AAAA,OACrB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;ACtVO,IAAM,YAAA,GAAsC;AAAA,EACjD;AAAA,IACE,EAAA,EAAI,qBAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EAAa,oEAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,EAAA,EAAI,wBAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,WAAA,EAAa,gDAAA;AAAA,IACb,KAAA,EAAO,yBAAA;AAAA,IACP,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,EAAA,EAAI,wBAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,WAAA,EAAa,mDAAA;AAAA,IACb,KAAA,EAAO,6FAAA;AAAA,IACP,YAAA,EAAc,CAAA;AAAA,IACd,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,EAAA,EAAI,sBAAA;AAAA,IACJ,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,EAAa,2FAAA;AAAA,IACb,KAAA,EAAO,mEAAA;AAAA,IACP,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,EAAA,EAAI,qBAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EAAa,kDAAA;AAAA,IACb,KAAA,EAAO,0DAAA;AAAA,IACP,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,EAAA,EAAI,wBAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,WAAA,EAAa,iDAAA;AAAA,IACb,KAAA,EAAO,iCAAA;AAAA,IACP,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,EAAA,EAAI,wBAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,WAAA,EAAa,gDAAA;AAAA,IACb,KAAA,EAAO,8CAAA;AAAA,IACP,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,EAAA,EAAI,wBAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,WAAA,EAAa,4DAAA;AAAA,IACb,KAAA,EAAO,mDAAA;AAAA,IACP,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,EAAA,EAAI,mBAAA;AAAA,IACJ,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,sEAAA;AAAA,IACb,KAAA,EAAO,yEAAA;AAAA,IACP,YAAA,EAAc,CAAA;AAAA,IACd,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,EAAA,EAAI,wBAAA;AAAA,IACJ,IAAA,EAAM,6BAAA;AAAA,IACN,WAAA,EAAa,yFAAA;AAAA,IACb,KAAA,EAAO,kHAAA;AAAA,IACP,YAAA,EAAc,CAAA;AAAA,IACd,UAAA,EAAY;AAAA;AAEhB;AAEO,IAAM,yBAAA,GAA4B;AAAA,EACvC,eAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,gBAAA;AAAA,EACA,mBAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF;AAEA,IAAM,oBAAA,uBAA2B,GAAA,CAAI;AAAA,EACnC,aAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAKM,SAAS,wBAAwB,GAAA,EAAqB;AAC3D,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,MAAA,KAAW,GAAG,OAAO,CAAA;AAErC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,IAAA,GAAO,IAAI,CAAC,CAAA;AAClB,IAAA,OAAA,CAAQ,IAAI,IAAA,EAAA,CAAO,OAAA,CAAQ,IAAI,IAAI,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,MAAM,MAAM,GAAA,CAAI,MAAA;AAChB,EAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,MAAA,EAAO,EAAG;AACpC,IAAA,MAAM,IAAI,KAAA,GAAQ,GAAA;AAClB,IAAA,OAAA,IAAW,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,GAAG,CAAA,GAAI,GAAA;AACrC;AAKO,SAAS,WAAW,MAAA,EAAwB;AACjD,EAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AACtB,IAAA,OAAO,kBAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS,CAAC,CAAC,CAAA;AAC3D,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS,CAAC,CAAC,CAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAC,SAAS,CAAA;AACtC,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,IAAA,EAAO,MAAM,CAAA,CAAA;AAC/B;AAEO,SAAS,sBAAA,CAAuB,QAAgB,IAAA,EAAuB;AAC5E,EAAA,MAAM,WAAA,GAAc,OAAO,WAAA,EAAY;AACvC,EAAA,KAAA,MAAW,eAAe,oBAAA,EAAsB;AAC9C,IAAA,IAAI,WAAA,CAAY,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,IAAA;AAAA,EAChD;AAGA,EAAA,IACE,IAAA,CAAK,QAAA,CAAS,sBAAsB,CAAA,IACpC,IAAA,CAAK,QAAA,CAAS,gBAAgB,CAAA,IAC9B,IAAA,CAAK,QAAA,CAAS,0BAA0B,CAAA,EACxC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAQO,SAAS,eAAA,CAAgB,SAAiB,UAAA,EAAqC;AACpF,EAAA,MAAM,QAAwB,EAAC;AAC/B,EAAA,IAAI;AACF,IAAA,MAAM,aAAa,UAAA,IAAc,aAAA;AACjC,IAAA,IAAI,UAAA,GAAa,EAAA;AAGjB,IAAA,IAAI;AACF,MAAA,UAAA,GAAaC,0BAAAA,CAAa,OAAO,CAAC,MAAA,EAAQ,OAAO,CAAA,EAAG,UAAU,SAAS,CAAA,EAAG;AAAA,QACxE,GAAA,EAAK,OAAA;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ;AAAA,OACjC,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAEN,MAAA,IAAI;AACF,QAAA,UAAA,GAAaA,2BAAa,KAAA,EAAO,CAAC,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA,EAAG;AAAA,UACxD,GAAA,EAAK,OAAA;AAAA,UACL,QAAA,EAAU,OAAA;AAAA,UACV,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ;AAAA,SACjC,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AACN,QAAA,UAAA,GAAa,EAAA;AAAA,MACf;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,UAAA,EAAY;AAEf,MAAA,UAAA,GAAaA,0BAAAA,CAAa,KAAA,EAAO,CAAC,MAAA,EAAQ,KAAK,CAAA,EAAG;AAAA,QAChD,GAAA,EAAK,OAAA;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ;AAAA,OACjC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,WAAA,GAAc,EAAA;AAClB,IAAA,IAAI,WAAA,GAAc,CAAA;AAElB,IAAA,KAAA,MAAW,OAAA,IAAW,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA,EAAG;AAC5C,MAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA,EAAG;AAChC,QAAA,WAAA,GAAc,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,MAC1C,CAAA,MAAA,IAAW,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AAEpC,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,sCAAsC,CAAA;AAClE,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,WAAA,GAAc,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,QACrC;AAAA,MACF,CAAA,MAAA,IAAW,QAAQ,UAAA,CAAW,GAAG,KAAK,CAAC,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AAChE,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA;AACnC,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,KAAA,CAAM,IAAA,CAAK;AAAA,YACT,IAAA,EAAM,WAAA;AAAA,YACN,UAAA,EAAY,WAAA;AAAA,YACZ;AAAA,WACD,CAAA;AAAA,QACH;AACA,QAAA,WAAA,EAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,gBAAA,CACd,GAAA,EACA,OAAA,EACA,gBAAA,GAA6B,yBAAA,EACnB;AACV,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,IAAI;AACF,IAAA,MAAM,UAAaC,cAAA,CAAA,WAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAE3D,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,QAAA,GAAgBC,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AAC1C,MAAA,MAAM,UAAeA,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAEnE,MAAA,IAAI,UAAA,GAAa,KAAA;AACjB,MAAA,KAAA,MAAW,OAAO,gBAAA,EAAkB;AAClC,QAAA,IAAI,QAAQ,QAAA,CAAS,GAAG,KAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACpD,UAAA,UAAA,GAAa,IAAA;AACb,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,UAAA,EAAY;AAEhB,MAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,QAAA,OAAA,CAAQ,KAAK,GAAG,gBAAA,CAAiB,QAAA,EAAU,OAAA,EAAS,gBAAgB,CAAC,CAAA;AAAA,MACvE,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,EAAO,EAAG;AACzB,QAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,mBAAA,GAA+B;AAC7C,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,OAAA,GAAU,OAAA;AACrD,IAAAF,0BAAAA,CAAa,GAAA,EAAK,CAAC,UAAU,CAAA,EAAG,EAAE,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ,CAAA,EAAG,CAAA;AACrE,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEO,SAAS,eAAe,OAAA,EAAoC;AACjE,EAAA,MAAM,aAAgC,EAAC;AACvC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAASA,0BAAAA;AAAA,MACb,UAAA;AAAA,MACA,CAAC,QAAA,EAAU,UAAA,EAAY,iBAAA,EAAmB,MAAA,EAAQ,iBAAiB,QAAQ,CAAA;AAAA,MAC3E;AAAA,QACE,GAAA,EAAK,OAAA;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ;AAAA;AAClC,KACF;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAChC,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,QAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,UAAA,MAAM,WAAgBE,gBAAA,CAAA,OAAA,CAAQ,OAAA,EAAS,IAAA,CAAK,IAAA,IAAQ,KAAK,IAAI,CAAA;AAC7D,UAAA,MAAM,UAAeA,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AACnE,UAAA,UAAA,CAAW,IAAA,CAAK;AAAA,YACd,QAAA;AAAA,YACA,OAAA;AAAA,YACA,UAAA,EAAY,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,IAAA,IAAQ,CAAA;AAAA,YAC3C,IAAA,EAAM,kBAAA;AAAA,YACN,MAAA,EAAQ,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,IAAU,gBAAA;AAAA,YACtC,WAAA,EAAa,WAAW,IAAA,CAAK,MAAA,IAAU,KAAK,MAAA,IAAU,IAAA,CAAK,SAAS,EAAE,CAAA;AAAA,YACtE,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,OAAA;AAAA,YAC9B,OAAA,EAAS,mCAAgC,IAAA,CAAK,MAAA,IAAU,QAAQ,CAAA,GAAA,EAAM,IAAA,CAAK,eAAe,EAAE,CAAA;AAAA,WAC7F,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,UAAA;AACT;AAEO,SAAS,qBAAA,CACd,OAAA,EACA,QAAA,EACA,OAAA,EACA,mBAAmB,GAAA,EACA;AACnB,EAAA,MAAM,aAAgC,EAAC;AACvC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AACnC,EAAA,MAAM,UAAeA,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAEnE,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AAEvC,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,IAAA,CAAK,MAAM,SAAA,GAAY,CAAA;AACvB,MAAA,IAAI,KAAA;AAEJ,MAAA,OAAA,CAAQ,QAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,OAAO,IAAA,EAAM;AAC/C,QAAA,MAAM,QAAA,GAAW,KAAK,YAAA,GAAe,KAAA,CAAM,KAAK,YAAY,CAAA,GAAI,MAAM,CAAC,CAAA;AACvE,QAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAEtC,QAAA,IAAI,sBAAA,CAAuB,QAAA,EAAU,IAAI,CAAA,EAAG;AAE5C,QAAA,MAAM,OAAA,GAAU,wBAAwB,QAAQ,CAAA;AAChD,QAAA,IAAI,IAAA,CAAK,UAAA,IAAc,OAAA,IAAW,gBAAA,IAAoB,KAAK,UAAA,CAAA,EAAa;AACtE,UAAA;AAAA,QACF;AAEA,QAAA,UAAA,CAAW,IAAA,CAAK;AAAA,UACd,QAAA;AAAA,UACA,OAAA;AAAA,UACA,YAAY,CAAA,GAAI,CAAA;AAAA,UAChB,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,WAAA,EAAa,WAAW,QAAQ,CAAA;AAAA,UAChC,OAAA;AAAA,UACA,OAAA,EAAS,CAAA,EAAG,IAAA,CAAK,WAAW,kBAAe,OAAO,CAAA,CAAA;AAAA,SACnD,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AAEO,SAAS,aAAA,CAAc,OAAA,GAAiC,EAAC,EAAyB;AACvF,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,MAAM,gBAAA,GAAmB,QAAQ,gBAAA,IAAoB,GAAA;AACrD,EAAA,MAAM,eAAA,GAAkB,QAAQ,eAAA,IAAmB,yBAAA;AAEnD,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,EAAA,IAAI,mBAAA,GAAsB,KAAA;AAG1B,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,OAAA,EAAS,OAAA,CAAQ,UAAU,CAAA;AAC7D,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAA4B;AAEnD,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,MAAM,OAAO,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,IAAI,KAAK,EAAC;AAC3C,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,MAAA,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,IAChC;AAEA,IAAA,iBAAA,GAAoB,UAAA,CAAW,IAAA;AAE/B,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,CAAA,IAAK,UAAA,EAAY;AACzC,MAAA,IAAI,UAAA,GAAa,KAAA;AACjB,MAAA,KAAA,MAAW,OAAO,eAAA,EAAiB;AACjC,QAAA,IAAI,QAAQ,QAAA,CAAS,GAAG,KAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACpD,UAAA,UAAA,GAAa,IAAA;AACb,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,UAAA,EAAY;AAEhB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,OAAO,IAAA,CAAK,OAAA;AAClB,QAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,UAAA,IAAA,CAAK,MAAM,SAAA,GAAY,CAAA;AACvB,UAAA,IAAI,KAAA;AAEJ,UAAA,OAAA,CAAQ,QAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,OAAO,IAAA,EAAM;AAC/C,YAAA,MAAM,QAAA,GAAW,KAAK,YAAA,GAAe,KAAA,CAAM,KAAK,YAAY,CAAA,GAAI,MAAM,CAAC,CAAA;AACvE,YAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAEtC,YAAA,IAAI,sBAAA,CAAuB,QAAA,EAAU,IAAI,CAAA,EAAG;AAE5C,YAAA,MAAM,OAAA,GAAU,wBAAwB,QAAQ,CAAA;AAChD,YAAA,IAAI,IAAA,CAAK,UAAA,IAAc,OAAA,IAAW,gBAAA,IAAoB,KAAK,UAAA,CAAA,EAAa;AACtE,cAAA;AAAA,YACF;AAEA,YAAA,QAAA,CAAS,IAAA,CAAK;AAAA,cACZ,QAAA,EAAeA,gBAAA,CAAA,OAAA,CAAQ,OAAA,EAAS,IAAA,CAAK,IAAI,CAAA;AAAA,cACzC,SAAS,IAAA,CAAK,IAAA;AAAA,cACd,YAAY,IAAA,CAAK,UAAA;AAAA,cACjB,MAAM,IAAA,CAAK,IAAA;AAAA,cACX,QAAQ,IAAA,CAAK,EAAA;AAAA,cACb,WAAA,EAAa,WAAW,QAAQ,CAAA;AAAA,cAChC,OAAA;AAAA,cACA,OAAA,EAAS,CAAA,OAAA,EAAU,IAAA,CAAK,WAAW,kBAAe,OAAO,CAAA,CAAA;AAAA,aAC1D,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,OAAA,EAAS,OAAA,EAAS,eAAe,CAAA;AACnE,IAAA,iBAAA,GAAoB,QAAA,CAAS,MAAA;AAE7B,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAaD,cAAA,CAAA,YAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AAC7C,QAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,OAAA,EAAS,IAAA,EAAM,SAAS,gBAAgB,CAAA;AACrF,QAAA,QAAA,CAAS,IAAA,CAAK,GAAG,cAAc,CAAA;AAAA,MACjC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,QAAA,IAAa,OAAA,CAAQ,QAAA,KAAa,MAAA,IAAa,qBAAoB,EAAI;AACjF,IAAA,IAAI;AACF,MAAA,MAAM,gBAAA,GAAmB,eAAe,OAAO,CAAA;AAC/C,MAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,QAAA,mBAAA,GAAsB,IAAA;AAEtB,QAAA,KAAA,MAAW,MAAM,gBAAA,EAAkB;AACjC,UAAA,MAAM,SAAS,QAAA,CAAS,IAAA;AAAA,YACtB,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,EAAA,CAAG,OAAA,IAAW,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,UAAA,GAAa,EAAA,CAAG,UAAU,CAAA,IAAK;AAAA,WAC/E;AACA,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAA+B;AAAA,IACnC,OAAA,EAAS,SAAS,MAAA,KAAW,CAAA;AAAA,IAC7B,iBAAA;AAAA,IACA,eAAe,QAAA,CAAS,MAAA;AAAA,IACxB,QAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,cAAA,GAAiB,8BAA8B,MAAM,CAAA;AAC5D,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,8BAA8B,MAAA,EAAsC;AAClF,EAAA,MAAM,OAAO,MAAA,CAAO,OAAA;AACpB,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,CAAA,uEAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,uBAAA,EAAA,iBAA0B,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA,CAAA;AAAA,IAClD,kBAAkB,IAAA,GAAO,sDAAA,GAAoD,CAAA,gBAAA,EAAc,MAAA,CAAO,aAAa,CAAA,8BAAA,CAAgC,CAAA,CAAA;AAAA,IAC/I,CAAA,qBAAA,EAAwB,MAAA,CAAO,iBAAiB,CAAA,4BAAA,EAA+B,OAAO,aAAa,CAAA,CAAA;AAAA,IACnG,CAAA,8BAAA,EAAiC,MAAA,CAAO,mBAAA,GAAsB,+BAAA,GAA2B,oDAA+C,CAAA,CAAA;AAAA,IACxI,CAAA,CAAA;AAAA,IACA,CAAA,GAAA;AAAA,GACF;AAEA,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAChC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,CAAA;AAAA,MACA,CAAA,qBAAA,CAAA;AAAA,MACA,CAAA,CAAA;AAAA,MACA,CAAA,iLAAA,CAAA;AAAA,MACA,CAAA,uDAAA;AAAA,KACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,CAAA;AAAA,MACA,CAAA,+BAAA,CAAA;AAAA,MACA,CAAA,CAAA;AAAA,MACA,CAAA,iEAAA,CAAA;AAAA,MACA,CAAA,4CAAA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,CAAA,IAAK,OAAO,QAAA,EAAU;AAC/B,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,gCAAyB,CAAA,CAAE,MAAM,CAAA,OAAA,EAAU,CAAA,CAAE,IAAI,CAAA,OAAA,EAAU,CAAA,CAAE,OAAO,CAAA,CAAA,EAAI,EAAE,UAAU,CAAA,OAAA,EAAU,EAAE,WAAW,CAAA,KAAA,EAAQ,EAAE,OAAO,CAAA,EAAA;AAAA,OAC9H;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,CAAA;AAAA,MACA,CAAA,yDAAA,CAAA;AAAA,MACA,CAAA,CAAA;AAAA,MACA,CAAA,sJAAA,CAAA;AAAA,MACA,CAAA,qKAAA,CAAA;AAAA,MACA,CAAA,gIAAA,CAAA;AAAA,MACA,CAAA,wKAAA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AC5gBO,IAAM,yBAAA,GAA+C;AAAA,EAC1D,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF;AAWO,IAAM,UAAA,GAAkC;AAAA,EAC7C;AAAA,IACE,EAAA,EAAI,wBAAA;AAAA,IACJ,IAAA,EAAM,eAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,WAAA,EAAa,sFAAA;AAAA,IACb,OAAA,EAAS,oLAAA;AAAA,IACT,cAAA,EAAgB,CAAC,KAAA,EAAO,KAAA,EAAO,QAAQ,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,QAAQ,IAAI;AAAA,GACjH;AAAA,EACA;AAAA,IACE,EAAA,EAAI,4BAAA;AAAA,IACJ,IAAA,EAAM,mBAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,WAAA,EAAa,qFAAA;AAAA,IACb,OAAA,EAAS,wIAAA;AAAA,IACT,cAAA,EAAgB,CAAC,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,KAAK;AAAA,GAC5F;AAAA,EACA;AAAA,IACE,EAAA,EAAI,sBAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,WAAA,EAAa,6EAAA;AAAA,IACb,OAAA,EAAS,6CAAA;AAAA,IACT,gBAAgB,CAAC,KAAA,EAAO,OAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAK;AAAA,GAC5D;AAAA,EACA;AAAA,IACE,EAAA,EAAI,iCAAA;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,MAAA;AAAA,IACV,WAAA,EAAa,6FAAA;AAAA,IACb,OAAA,EAAS,gJAAA;AAAA,IACT,cAAA,EAAgB,CAAC,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,KAAK;AAAA,GAC5E;AAAA,EACA;AAAA,IACE,EAAA,EAAI,yBAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,QAAA,EAAU,MAAA;AAAA,IACV,WAAA,EAAa,oGAAA;AAAA,IACb,OAAA,EAAS,iJAAA;AAAA,IACT,gBAAgB,CAAC,KAAA,EAAO,OAAO,KAAA,EAAO,KAAA,EAAO,SAAS,KAAK;AAAA,GAC7D;AAAA,EACA;AAAA,IACE,EAAA,EAAI,kCAAA;AAAA,IACJ,IAAA,EAAM,uBAAA;AAAA,IACN,QAAA,EAAU,MAAA;AAAA,IACV,WAAA,EAAa,0JAAA;AAAA,IACb,OAAA,EAAS,6rBAAA;AAAA,IACT,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA;AAAA,IACE,EAAA,EAAI,qCAAA;AAAA,IACJ,IAAA,EAAM,uBAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,WAAA,EACE,+HAAA;AAAA;AAAA,IACF,OAAA,EAAS,6cAAA;AAAA,IACT,cAAA,EAAgB;AAAA;AAEpB;AAEO,IAAM,qBAAA,GAAwB;AAAA,EACnC,eAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF;AAEO,SAAS,kBAAA,GAA8B;AAC5C,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,OAAA,GAAU,OAAA;AACrD,IAAAD,0BAAAA,CAAa,GAAA,EAAK,CAAC,SAAS,CAAA,EAAG,EAAE,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ,CAAA,EAAG,CAAA;AACpE,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEO,SAAS,cAAc,OAAA,EAAkC;AAC9D,EAAA,MAAM,aAA8B,EAAC;AACrC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAASA,0BAAAA;AAAA,MACb,SAAA;AAAA,MACA,CAAC,MAAA,EAAQ,UAAA,EAAY,MAAA,EAAQ,UAAU,SAAS,CAAA;AAAA,MAChD;AAAA,QACE,GAAA,EAAK,OAAA;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ;AAAA;AAClC,KACF;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAChC,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,EAAG;AACjC,QAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,OAAA,EAAS;AACjC,UAAA,MAAM,QAAA,GAAgBG,gBAAA,CAAA,OAAA,CAAQ,OAAA,EAAS,IAAA,CAAK,IAAI,CAAA;AAChD,UAAA,MAAM,UAAeA,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AACnE,UAAA,UAAA,CAAW,IAAA,CAAK;AAAA,YACd,QAAA;AAAA,YACA,OAAA;AAAA,YACA,UAAA,EAAY,IAAA,CAAK,KAAA,EAAO,IAAA,IAAQ,CAAA;AAAA,YAChC,MAAA,EAAQ,KAAK,QAAA,IAAY,cAAA;AAAA,YACzB,IAAA,EAAM,iBAAA;AAAA,YACN,QAAA,EAAW,IAAA,CAAK,KAAA,EAAO,QAAA,EAAU,aAAY,IAAK,MAAA;AAAA,YAClD,OAAA,EAAA,CAAU,IAAA,CAAK,KAAA,EAAO,KAAA,IAAS,IAAI,IAAA,EAAK;AAAA,YACxC,OAAA,EAAS,YAAY,IAAA,CAAK,QAAQ,MAAM,IAAA,CAAK,KAAA,EAAO,WAAW,EAAE,CAAA;AAAA,WAClE,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,UAAA;AACT;AAEO,SAAS,eAAA,CACd,GAAA,EACA,OAAA,EACA,QAAA,GAAqB,qBAAA,EACX;AACV,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI;AACF,IAAA,MAAM,UAAaC,cAAA,CAAA,WAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAE3D,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,QAAA,GAAgBD,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AAC1C,MAAA,MAAM,UAAeA,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAEnE,MAAA,IAAI,UAAA,GAAa,KAAA;AACjB,MAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,QAAA,IAAI,QAAQ,QAAA,CAAS,GAAG,KAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACpD,UAAA,UAAA,GAAa,IAAA;AACb,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,UAAA,EAAY;AAEhB,MAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,QAAA,KAAA,CAAM,KAAK,GAAG,eAAA,CAAgB,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAC,CAAA;AAAA,MAC5D,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,EAAO,EAAG;AACzB,QAAA,MAAM,GAAA,GAAWA,gBAAA,CAAA,OAAA,CAAQ,KAAA,CAAM,IAAI,EAAE,WAAA,EAAY;AACjD,QAAA,IAAI,yBAAA,CAA0B,QAAA,CAAS,GAAG,CAAA,EAAG;AAC3C,UAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,eAAA,CACd,QAAA,EACA,OAAA,EACA,WAAA,GAA4B,MAAA,EACX;AACjB,EAAA,MAAM,aAA8B,EAAC;AACrC,EAAA,MAAM,GAAA,GAAWA,gBAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,WAAA,EAAY;AAE/C,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAaC,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AACnC,IAAA,MAAM,UAAeD,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAEnE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,MAAA,IACE,IAAA,CAAK,QAAA,CAAS,oBAAoB,CAAA,IAClC,IAAA,CAAK,SAAS,gCAAgC,CAAA,IAC9C,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AAErB,QAAA;AAEF,MAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,QAAA,IAAI,KAAK,cAAA,IAAkB,CAAC,KAAK,cAAA,CAAe,QAAA,CAAS,GAAG,CAAA,EAAG;AAE/D,QAAA,IAAI,WAAA,KAAgB,UAAA,IAAc,IAAA,CAAK,QAAA,KAAa,UAAA,EAAY;AAEhE,QAAA,IAAA,CAAK,QAAQ,SAAA,GAAY,CAAA;AACzB,QAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AAC3B,UAAA,UAAA,CAAW,IAAA,CAAK;AAAA,YACd,QAAA;AAAA,YACA,OAAA;AAAA,YACA,YAAY,CAAA,GAAI,CAAA;AAAA,YAChB,QAAQ,IAAA,CAAK,EAAA;AAAA,YACb,MAAM,IAAA,CAAK,IAAA;AAAA,YACX,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,OAAA,EAAS,KAAK,IAAA,EAAK;AAAA,YACnB,SAAS,IAAA,CAAK;AAAA,WACf,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,UAAA;AACT;AAEO,SAAS,UAAA,CAAW,OAAA,GAA+B,EAAC,EAAuB;AAChF,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,MAAA;AAC3C,EAAA,MAAM,aAAa,OAAA,CAAQ,iBAAA,IAAqB,CAAC,KAAA,EAAO,YAAY,SAAS,CAAA;AAE7E,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,MAAM,OAAA,GAAeA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AACvC,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,OAAO,CAAA,EAAG;AAC1B,MAAA,WAAA,CAAY,IAAA,CAAK,GAAG,eAAA,CAAgB,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,MAAM,aAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,UAAA,CAAW,KAAK,GAAG,eAAA,CAAgB,IAAA,EAAM,OAAA,EAAS,WAAW,CAAC,CAAA;AAAA,EAChE;AAGA,EAAA,IAAI,QAAQ,OAAA,IAAY,OAAA,CAAQ,OAAA,KAAY,MAAA,IAAa,oBAAmB,EAAI;AAC9E,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,GAAkB,cAAc,OAAO,CAAA;AAC7C,MAAA,UAAA,CAAW,IAAA,CAAK,GAAG,eAAe,CAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAA6B;AAAA,IACjC,OAAA,EAAS,WAAW,MAAA,KAAW,CAAA;AAAA,IAC/B,mBAAmB,WAAA,CAAY,MAAA;AAAA,IAC/B,iBAAiB,UAAA,CAAW,MAAA;AAAA,IAC5B;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,cAAA,GAAiB,2BAA2B,MAAM,CAAA;AACzD,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,2BAA2B,MAAA,EAAoC;AAC7E,EAAA,MAAM,OAAO,MAAA,CAAO,OAAA;AACpB,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,CAAA,6EAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,uBAAA,EAAA,iBAA0B,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA,CAAA;AAAA,IAClD,kBAAkB,IAAA,GAAO,oDAAA,GAAkD,CAAA,gBAAA,EAAc,MAAA,CAAO,eAAe,CAAA,0BAAA,CAA4B,CAAA,CAAA;AAAA,IAC3I,CAAA,0BAAA,EAA6B,MAAA,CAAO,iBAAiB,CAAA,wBAAA,EAA2B,OAAO,eAAe,CAAA,CAAA;AAAA,IACtG,CAAA,CAAA;AAAA,IACA,CAAA,GAAA;AAAA,GACF;AAEA,EAAA,IAAI,MAAA,CAAO,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAClC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,CAAA;AAAA,MACA,CAAA,qBAAA,CAAA;AAAA,MACA,CAAA,CAAA;AAAA,MACA,CAAA,sKAAA,CAAA;AAAA,MACA,CAAA,iHAAA;AAAA,KACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,CAAA;AAAA,MACA,CAAA,oCAAA,CAAA;AAAA,MACA,CAAA,CAAA;AAAA,MACA,CAAA,0DAAA,CAAA;AAAA,MACA,CAAA,4CAAA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,CAAA,IAAK,OAAO,UAAA,EAAY;AACjC,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,QAAA,KAAa,UAAA,GAAa,oBAAA,GAAgB,mBAAA;AAC1D,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,CAAA,IAAA,EAAO,KAAK,CAAA,OAAA,EAAU,CAAA,CAAE,MAAM,CAAA,OAAA,EAAU,CAAA,CAAE,IAAI,CAAA,OAAA,EAAU,CAAA,CAAE,OAAO,IAAI,CAAA,CAAE,UAAU,CAAA,OAAA,EAAU,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAQ,OAAO,KAAK,CAAC,CAAA,KAAA,EAAQ,CAAA,CAAE,OAAO,CAAA,EAAA;AAAA,OAC7I;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,IAAM,2BAAA,GAKP;AAAA,EACJ;AAAA,IACE,MAAA,EAAQ,sBAAA;AAAA,IACR,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO,wHAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,0BAAA;AAAA,IACR,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO,0JAAA;AAAA,IACP,OAAA,EAAS;AAAA;AAAA,GACX;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,iBAAA;AAAA,IACR,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO,iHAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,6BAAA;AAAA,IACR,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO,uIAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,0BAAA;AAAA,IACR,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO,+EAAA;AAAA,IACP,OAAA,EAAS;AAAA;AAEb;AAEO,SAAS,sBAAsB,OAAA,EAA2C;AAC/E,EAAA,MAAM,WAAqC,EAAC;AAC5C,EAAA,IAAI,CAAC,SAAS,OAAO,QAAA;AAErB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AACnC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,KAAK,QAAA,CAAS,gCAAgC,KAAK,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAE/E,IAAA,KAAA,MAAW,OAAO,2BAAA,EAA6B;AAC7C,MAAA,GAAA,CAAI,MAAM,SAAA,GAAY,CAAA;AACtB,MAAA,IAAI,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG;AACxB,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,UAAU,GAAA,CAAI,QAAA;AAAA,UACd,OAAA,EAAS,IAAI,KAAA,CAAM,MAAA;AAAA,UACnB,OAAA,EAAS,KAAK,IAAA,EAAK;AAAA,UACnB,YAAY,CAAA,GAAI,CAAA;AAAA,UAChB,SAAS,GAAA,CAAI;AAAA,SACd,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,OAAO,2BAAA,EAA6B;AAC7C,IAAA,IAAI,GAAA,CAAI,WAAW,0BAAA,EAA4B;AAC7C,MAAA,GAAA,CAAI,MAAM,SAAA,GAAY,CAAA;AACtB,MAAA,IAAI,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,EAAG;AAC3B,QAAA,MAAM,YAAA,GAAe,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,IAAI,MAAM,CAAA;AACjE,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACZ,QAAQ,GAAA,CAAI,MAAA;AAAA,YACZ,UAAU,GAAA,CAAI,QAAA;AAAA,YACd,OAAA,EAAS,IAAI,KAAA,CAAM,MAAA;AAAA,YACnB,SAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AAAA,YACpC,SAAS,GAAA,CAAI;AAAA,WACd,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AC5ZO,SAAS,eAAA,CAAgB,IAAY,EAAA,EAAyC;AACnF,EAAA,IAAI,EAAA,IAAM,EAAA,IAAM,EAAA,IAAM,CAAA,EAAG,OAAO,GAAA;AAChC,EAAA,IAAI,EAAA,IAAM,EAAA,IAAM,EAAA,IAAM,EAAA,EAAI,OAAO,GAAA;AACjC,EAAA,IAAI,EAAA,IAAM,EAAA,IAAM,EAAA,IAAM,EAAA,EAAI,OAAO,GAAA;AACjC,EAAA,IAAI,EAAA,IAAM,EAAA,IAAM,EAAA,IAAM,EAAA,EAAI,OAAO,GAAA;AACjC,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,eAAe,QAAA,EAA0B;AACvD,EAAA,MAAM,GAAA,GAAWC,gBAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,WAAA,EAAY;AAC/C,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,KAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,IAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,IAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,MAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT;AACE,MAAA,OAAO,SAAA;AAAA;AAEb;AAEA,SAAS,oBAAA,CAAqB,UAAkB,SAAA,EAA+C;AAC7F,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAASC,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAC,CAAA;AACzD,IAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,IAAA;AAChD,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AACxC,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,QAAA,EAAU,GAAG,CAAA;AAC9C,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,KAAA,CAAM,SAAA,EAAW,GAAG,CAAA;AAChD,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA,EAAG,OAAO,IAAA;AAC9F,IAAA,MAAM,aAAA,GAAgB,MAAM,UAAA,EAAY,GAAA,KAAQ,SAAY,MAAA,CAAO,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA,CAAA;AAC3F,IAAA,OAAO,EAAE,QAAA,EAAU,WAAA,EAAa,YAAA,EAAc,aAAA,EAAe,QAAQ,SAAA,EAAU;AAAA,EACjF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,aAAA,CAAc,UAAkB,SAAA,EAA+C;AACtF,EAAA,IAAI;AACF,IAAA,MAAM,QAAWA,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA,CAAE,MAAM,OAAO,CAAA;AAC9D,IAAA,IAAI,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,GAAA,GAAM,GAAG,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,CAAA;AACrD,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,EAAG,EAAA,IAAM,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,CAAA;AAAA,WAAA,IACxD,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,EAAG,EAAA,IAAM,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,CAAA;AAAA,WAAA,IAC7D,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG,GAAA,IAAO,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,CAAA;AAAA,WAAA,IAC/D,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG,GAAA,IAAO,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,CAAA;AAAA,WAAA,IAC/D,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG,GAAA,IAAO,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,CAAA;AAAA,WAAA,IAC/D,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG,GAAA,IAAO,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,OAAO,CAAA,IAAK,GAAA,KAAQ,CAAA,IAAK,GAAA,KAAQ,GAAG,OAAO,IAAA;AAC/C,IAAA,MAAM,GAAA,GAAM,CAAC,GAAA,EAAa,KAAA,KACxB,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,KAAA,CAAO,GAAA,GAAM,KAAA,GAAS,GAAI,CAAA,GAAI,EAAA,GAAK,GAAA;AACtD,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAAA,MACpB,WAAA,EAAa,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AAAA,MACzB,YAAA,EAAc,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AAAA,MAC1B,MAAA,EAAQ;AAAA,KACV;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,uBAAA,CAAwB,OAAA,GAAkB,OAAA,CAAQ,GAAA,EAAI,EAA+B;AACnG,EAAA,MAAM,cAAA,GAAiB,CAAC,gCAAA,EAAkC,+BAA+B,CAAA;AACzF,EAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,IAAA,MAAM,IAAA,GAAYD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,GAAG,CAAA;AACnC,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG;AACvB,MAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,IAAA,EAAM,GAAG,CAAA;AAC7C,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,MAAM,cAAA,GAAiB,CAAC,oBAAA,EAAsB,WAAA,EAAa,mBAAmB,CAAA;AAC9E,EAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,IAAA,MAAM,IAAA,GAAYD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,GAAG,CAAA;AACnC,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG;AACvB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,EAAM,GAAG,CAAA;AACtC,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,KAAA,EAAe,QAAA,EAA8B,YAAA,EAA8B;AACpG,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,OAAO,CAAA,IAAA,EAAO,KAAK,CAAA,yCAAA,EAA4C,YAAY,CAAA,kCAAA,CAAA;AAAA,EAC7E;AACA,EAAA,MAAM,MAAA,GAAS,QAAA,IAAY,YAAA,GAAe,kBAAA,GAAgB,8BAAA;AAC1D,EAAA,OAAO,OAAO,KAAK,CAAA,OAAA,EAAU,QAAQ,CAAA,YAAA,EAAe,YAAY,UAAU,MAAM,CAAA,EAAA,CAAA;AAClF;AAEA,SAAS,iBAAA,CAAkB,UAAsC,MAAA,EAAiC;AAChG,EAAA,OAAO;AAAA,IACL,iBAAA,CAAkB,eAAA,EAAiB,QAAA,EAAU,QAAA,EAAU,OAAO,iBAAiB,CAAA;AAAA,IAC/E,iBAAA,CAAkB,iBAAA,EAAmB,QAAA,EAAU,WAAA,EAAa,OAAO,mBAAmB,CAAA;AAAA,IACtF,iBAAA,CAAkB,mBAAA,EAAqB,QAAA,EAAU,YAAA,EAAc,OAAO,qBAAqB;AAAA,GAC7F;AACF;AAEO,SAAS,qBAAA,CAAsB,OAAA,GAAgC,EAAC,EAAwB;AAC7F,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAC/C,EAAA,MAAM,aAAa,iBAAA,CAAkB;AAAA,IACnC,OAAA;AAAA,IACA,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,YAAY,OAAA,CAAQ;AAAA,GACrB,CAAA;AACD,EAAA,MAAM,QAAA,GAAW,wBAAwB,OAAO,CAAA;AAEhD,EAAA,MAAM,aAAa,UAAA,CAAW,UAAA;AAC9B,EAAA,MAAM,iBAAiB,UAAA,CAAW,cAAA;AAElC,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,IAAI,QAAA,GAAW,CAAA;AAEf,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAwE;AAC5F,EAAA,MAAM,iBAA2B,EAAC;AAElC,EAAA,KAAA,MAAW,EAAA,IAAM,WAAW,OAAA,EAAS;AACnC,IAAA,OAAA,IAAW,EAAA,CAAG,eAAA;AACd,IAAA,OAAA,IAAW,EAAA,CAAG,UAAA;AACd,IAAA,cAAA,IAAkB,EAAA,CAAG,SAAA;AACrB,IAAA,QAAA,IAAY,EAAA,CAAG,GAAA;AAEf,IAAA,MAAM,IAAA,GAAO,cAAA,CAAe,EAAA,CAAG,QAAQ,CAAA;AACvC,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,IAAK,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,EAAE;AAC3E,IAAA,QAAA,CAAS,GAAA,EAAA;AACT,IAAA,QAAA,CAAS,OAAO,EAAA,CAAG,GAAA;AACnB,IAAA,QAAA,CAAS,SAAS,EAAA,CAAG,eAAA;AACrB,IAAA,QAAA,CAAS,SAAS,EAAA,CAAG,UAAA;AACrB,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,QAAQ,CAAA;AAE1B,IAAA,IAAI,EAAA,CAAG,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAC5B,MAAA,cAAA,CAAe,IAAA,CAAK,CAAA,MAAA,EAAS,EAAA,CAAG,OAAO,CAAA,QAAA,EAAW,EAAA,CAAG,YAAY,CAAA,KAAA,EAAQ,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACrG;AAAA,EACF;AAEA,EAAA,MAAM,kBAAA,GAAqB,iBAAiB,CAAA,GAAI,IAAA,CAAK,MAAO,OAAA,GAAU,cAAA,GAAkB,EAAE,CAAA,GAAI,EAAA,GAAK,GAAA;AACnG,EAAA,MAAM,aAAA,GAAgB,iBAAiB,CAAA,GAAI,IAAA,CAAK,MAAO,OAAA,GAAU,cAAA,GAAkB,EAAE,CAAA,GAAI,EAAA,GAAK,CAAA;AAC9F,EAAA,MAAM,YAAA,GAAe,iBAAiB,CAAA,GAAI,IAAA,CAAK,MAAO,cAAA,GAAiB,cAAA,GAAkB,EAAE,CAAA,GAAI,EAAA,GAAK,CAAA;AACpG,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,kBAAA,EAAoB,aAAa,CAAA;AACtE,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,OAAA,GAAU,MAAA,GAAS,MAAA;AAE9C,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,CAAA,4DAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,uBAAA,EAAA,iBAA0B,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA,CAAA;AAAA,IAClD,CAAA,4BAAA,EAA+B,OAAA,KAAY,MAAA,GAAS,oCAAA,GAAgC,yCAAkC,CAAA,CAAA;AAAA,IACtH,CAAA,yBAAA,EAA4B,YAAY,CAAA,gBAAA,EAAmB,kBAAkB,qBAAqB,aAAa,CAAA,CAAA,CAAA;AAAA,IAC/G,CAAA,CAAA;AAAA,IACA,CAAA,GAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,8BAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,+DAAA,CAAA;AAAA,IACA,CAAA,gCAAA,CAAA;AAAA,IACA,4BAA4B,UAAU,CAAA,yBAAA,CAAA;AAAA,IACtC,iCAAiC,cAAc,CAAA,yBAAA,CAAA;AAAA,IAC/C,iCAAiC,QAAQ,CAAA,yBAAA,CAAA;AAAA,IACzC,CAAA,0CAAA,EAA6C,aAAa,CAAA,WAAA,EAAc,UAAA,CAAW,MAAA,CAAO,cAAc,CAAA,IAAA,EAAO,aAAA,IAAiB,UAAA,CAAW,MAAA,CAAO,cAAA,GAAiB,kBAAA,GAAgB,iBAAY,CAAA,EAAA,CAAA;AAAA,IAC/L,CAAA,yCAAA,EAA4C,YAAY,CAAA,WAAA,EAAc,UAAA,CAAW,MAAA,CAAO,aAAa,CAAA,IAAA,EAAO,YAAA,IAAgB,UAAA,CAAW,MAAA,CAAO,aAAA,GAAgB,kBAAA,GAAgB,iBAAY,CAAA,EAAA,CAAA;AAAA,IAC1L,CAAA,yCAAA,EAA4C,kBAAkB,CAAA,iBAAA,EAAoB,UAAA,CAAW,MAAA,CAAO,mBAAmB,CAAA,IAAA,EAAO,kBAAA,IAAsB,UAAA,CAAW,MAAA,CAAO,mBAAA,GAAsB,kBAAA,GAAgB,qBAAgB,CAAA,EAAA,CAAA;AAAA,IAC5N,GAAG,iBAAA,CAAkB,QAAA,EAAU,UAAA,CAAW,MAAM,CAAA;AAAA,IAChD,CAAA,iCAAA,EAAoC,UAAA,CAAW,SAAS,CAAA,eAAA,EAAkB,UAAA,CAAW,MAAA,CAAO,YAAY,CAAA,IAAA,EAAO,UAAA,CAAW,SAAA,KAAc,CAAA,GAAI,qBAAA,GAAmB,gBAAW,CAAA,EAAA,CAAA;AAAA,IAC1K,CAAA,CAAA;AAAA,IACA,CAAA,GAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,8CAAA,CAAA;AAAA,IACA,CAAA,CAAA;AAAA,IACA,CAAA,uEAAA,CAAA;AAAA,IACA,CAAA,gDAAA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,OAAA,CAAQ,SAAQ,EAAG;AAC7C,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAO,KAAA,CAAM,QAAQ,KAAA,CAAM,GAAA,GAAO,EAAE,CAAA,GAAI,EAAA;AAC5D,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAO,KAAA,CAAM,QAAQ,KAAA,CAAM,GAAA,GAAO,EAAE,CAAA,GAAI,EAAA;AAC5D,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,MAAA,EAAQ,MAAM,CAAA;AAC7C,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,IAAA,EAAO,IAAI,CAAA,OAAA,EAAU,KAAA,CAAM,GAAG,CAAA,OAAA,EAAU,KAAA,CAAM,GAAG,CAAA,OAAA,EAAU,MAAM,CAAA,OAAA,EAAU,MAAM,UAAU,MAAM,CAAA,IAAA;AAAA,KACnG;AAAA,EACF;AAEA,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,mCAAmC,CAAA;AAC9C,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,cAAc,CAAA;AAAA,EAC9B;AAEA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,yCAAyC,CAAA;AACpD,EAAA,KAAA,CAAM,KAAK,gFAAgF,CAAA;AAC3F,EAAA,KAAA,CAAM,KAAK,4GAA4G,CAAA;AACvH,EAAA,KAAA,CAAM,KAAK,sHAAsH,CAAA;AACjI,EAAA,KAAA,CAAM,KAAK,+IAAgJ,CAAA;AAE3J,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAGhC,EAAA,MAAM,UAAA,GAAkBD,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,SAAS,CAAA;AAC/C,EAAGC,cAAA,CAAA,SAAA,CAAU,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5C,EAAGA,6BAAmBD,gBAAA,CAAA,IAAA,CAAK,UAAA,EAAY,mBAAmB,CAAA,EAAG,UAAU,OAAO,CAAA;AAE9E,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA;AAAA,IACA,kBAAA;AAAA,IACA,aAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC1OO,IAAM,eAAA,GAAkB;AAAA,EAC7B,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,sDAAA;AAAA,EACT,OAAA,EAAS,8EAAA;AAAA,EACT,GAAA,EAAK,yEAAA;AAAA,EACL,KAAA,EAAO,uEAAA;AAAA,EACP,IAAA,EAAM;AACR;AAEO,SAAS,eAAe,UAAA,EAAgD;AAC7E,EAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA,EAAG;AACzC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA,MACN,QAAA,EAAU,sBAAA;AAAA,MACV,iBAAA,EAAmB,wBAAA;AAAA,MACnB,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAEA,EAAA,IAAI,eAAA,CAAgB,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,EAAG;AAC5C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA,MACN,QAAA,EAAU,sBAAA;AAAA,MACV,iBAAA,EAAmB,4BAAA;AAAA,MACnB,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,KAAA,CAAM,eAAA,CAAgB,OAAO,CAAA;AAC1D,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA,MACN,QAAA,EAAU,yBAAA;AAAA,MACV,EAAA,EAAI,UAAU,CAAC,CAAA;AAAA,MACf,iBAAA,EAAmB,sDAAA;AAAA,MACnB,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,KAAA,CAAM,eAAA,CAAgB,GAAG,CAAA;AACrD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA,MACN,QAAA,EAAU,eAAA;AAAA,MACV,EAAA,EAAI,SAAS,CAAC,CAAA;AAAA,MACd,iBAAA,EAAmB,sDAAA;AAAA,MACnB,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,eAAA,CAAgB,KAAK,CAAA;AACzD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA,MACN,QAAA,EAAU,0BAAA;AAAA,MACV,EAAA,EAAI,WAAW,CAAC,CAAA;AAAA,MAChB,iBAAA,EAAmB,iFAAA;AAAA,MACnB,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,KAAA,CAAM,eAAA,CAAgB,IAAI,CAAA;AACvD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA,MACN,QAAA,EAAU,yBAAA;AAAA,MACV,QAAA,EAAU,UAAU,CAAC,CAAA;AAAA,MACrB,MAAA,EAAQ,UAAU,CAAC,CAAA;AAAA,MACnB,iBAAA,EAAmB,CAAA,4DAAA,EAA+D,SAAA,CAAU,CAAC,CAAC,CAAA,MAAA,EAAS,SAAA,CAAU,CAAC,CAAC,CAAA,SAAA,EAAY,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA;AAAA,MAC3I,WAAA,EAAa,CAAA,KAAA,EAAQ,SAAA,CAAU,CAAC,CAAC,CAAA,MAAA,EAAS,SAAA,CAAU,CAAC,CAAC,CAAA,SAAA,EAAY,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,KAChF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAA;AAAA,IACP,IAAA,EAAM,CAAA;AAAA,IACN,QAAA,EAAU,aAAA;AAAA,IACV,KAAA,EAAO,cAAc,UAAU,CAAA,wDAAA;AAAA,GACjC;AACF;AAEO,SAAS,2BAAA,CACd,OAAA,EACA,OAAA,EACA,KAAA,EACqB;AACrB,EAAA,MAAM,OAAA,GAAU,WAAW,OAAO,CAAA,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAO,CAAA,CAAA;AAE/B,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,kEAAA;AAAA,IACA,gDAAA;AAAA,IACA,oEAAA;AAAA,IACA,CAAA,yCAAA,CAAA;AAAA,IACA,4CAAyC,OAAO,CAAA,oBAAA,CAAA;AAAA,IAChD,CAAA,sCAAA,EAAyC,OAAO,CAAA,eAAA,EAAkB,OAAO,CAAA;AAAA,CAAA;AAAA,IACzE,0DAAuD,OAAO,CAAA,EAAA;AAAA,GAChE;AAEA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC1D,IAAA,MAAM,aAAa,CAAA,KAAA,EAAQ,UAAU,CAAA,CAAA,EAAI,CAAA,CAAE,aAAa,CAAA,CAAA;AACxD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,sBAAA,EAAU,UAAU,CAAA,CAAE,CAAA;AACjC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,wCAAA,EAAsC,OAAO,CAAA,oBAAA,EAAuB,UAAU,CAAA,CAAE,CAAA;AAAA,EAC7F;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK;AAAA,iCAAA,CAAkC,CAAA;AAC7C,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kCAAA,EAA2B,OAAO,CAAA,2CAAA,EAAoC,OAAO,CAAA;AAAA,CAA0B,CAAA;AAElH,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,IAAI;AAAA,GAC3B;AACF;ACxFO,SAAS,yBAAA,CACd,MAAA,EACA,OAAA,GAAkB,OAAA,CAAQ,KAAI,EACZ;AAClB,EAAA,MAAM,WAAA,GAAA,CAAe,MAAA,IAAU,EAAA,EAAI,IAAA,EAAK;AACxC,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,MAAM,gBAAA,GAAwBE,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,WAAW,QAAQ,CAAA;AACxE,EAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,gBAAgB,CAAA,EAAG;AACpC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,0DAAuD,gBAAgB,CAAA,EAAA;AAAA,KAChF;AAAA,EACF;AAEA,EAAA,MAAM,iBAAyE,EAAC;AAChF,EAAA,MAAM,gBAAmBA,cAAA,CAAA,WAAA,CAAY,gBAAA,EAAkB,EAAE,aAAA,EAAe,MAAM,CAAA;AAE9E,EAAA,IAAI,WAAA;AAEJ,EAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,EAAY,EAAG;AAC1B,IAAA,MAAM,SAAA,GAAiBD,gBAAA,CAAA,IAAA,CAAK,gBAAA,EAAkB,KAAA,CAAM,IAAI,CAAA;AACxD,IAAA,MAAM,SAAA,GAAiBA,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AAEjD,IAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAE/B,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAaA,cAAA,CAAA,YAAA,CAAa,SAAA,EAAW,OAAO,CAAA;AAClD,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,6BAA6B,CAAA;AAC3D,MAAA,IAAI,CAAC,OAAA,EAAS;AAEd,MAAA,MAAM,EAAA,GAAK5D,sBAAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAC/B,MAAA,IAAI,CAAC,EAAA,IAAM,CAAC,MAAM,OAAA,CAAQ,EAAA,CAAG,KAAK,CAAA,EAAG;AAErC,MAAA,MAAM,WAAA,GACJ,EAAA,CAAG,WAAW,CAAA,IACd,EAAA,CAAG,QAAA,IACH,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,MAAM,CAAA,CAAE,WAAA,EAAY;AAGzD,MAAA,IAAI,UAAA,GAAa,OAAA;AACjB,MAAA,IAAI,GAAG,OAAA,EAAS;AACd,QAAA,UAAA,GAAa,MAAA,CAAO,GAAG,OAAO,CAAA;AAAA,MAChC,CAAA,MAAA,IAAW,EAAA,CAAG,gBAAgB,CAAA,IAAK,GAAG,OAAA,EAAS;AAC7C,QAAA,UAAA,GAAa,MAAA,CAAO,EAAA,CAAG,gBAAgB,CAAA,IAAK,GAAG,OAAO,CAAA;AAAA,MACxD,CAAA,MAAO;AACL,QAAA,MAAM,YAAA,GAAoB2D,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,aAAa,CAAA;AACvD,QAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,YAAY,CAAA,EAAG;AAC/B,UAAA,MAAM,WAAA,GAAiBA,cAAA,CAAA,YAAA,CAAa,YAAA,EAAc,OAAO,CAAA;AACzD,UAAA,MAAM,MAAA,GAAS,WAAA,CAAY,KAAA,CAAM,6BAA6B,CAAA;AAC9D,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,MAAM,UAAA,GAAa5D,sBAAAA,CAAK,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AACtC,YAAA,IAAI,UAAA,EAAY,OAAA,EAAS,UAAA,GAAa,MAAA,CAAO,WAAW,OAAO,CAAA;AAAA,UACjE;AAAA,QACF;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,CAAA,IAAK,GAAG,KAAA,EAAO;AACxB,QAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,EAAA,EAAI;AACjB,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,CAAA,CAAE,EAAE,EAAE,IAAA,EAAK;AACpC,QAAA,MAAM,eAAe,MAAA,CAAO,CAAA,CAAE,KAAA,IAAS,EAAE,EAAE,IAAA,EAAK;AAEhD,QAAA,cAAA,CAAe,IAAA,CAAK;AAAA,UAClB,EAAA,EAAI,SAAA;AAAA,UACJ,KAAA,EAAO,YAAA;AAAA,UACP,QAAA,EAAU,OAAO,WAAW;AAAA,SAC7B,CAAA;AAED,QAAA,MAAM,WAAA,GAAc,YAAY,WAAA,EAAY;AAC5C,QAAA,MAAM,YAAA,GAAe,UAAU,WAAA,EAAY;AAG3C,QAAA,MAAM,OAAA,GACJ,YAAA,KAAiB,WAAA,IACjB,YAAA,CAAa,UAAA,CAAW,CAAA,EAAG,WAAW,CAAA,CAAA,CAAG,CAAA,IACzC,WAAA,CAAY,UAAA,CAAW,CAAA,EAAG,YAAY,CAAA,CAAA,CAAG,CAAA;AAE3C,QAAA,IAAI,OAAA,IAAW,CAAC,WAAA,EAAa;AAC3B,UAAA,WAAA,GAAc;AAAA,YACZ,MAAA,EAAQ,SAAA;AAAA,YACR,SAAA,EAAW,YAAA;AAAA,YACX,QAAA,EAAU,OAAO,WAAW,CAAA;AAAA,YAC5B,SAAA;AAAA,YACA,OAAA,EAAS;AAAA,WACX;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,KAAA,EAAO,WAAA;AAAA,MACP;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAA;AAAA,IACP,cAAA;AAAA,IACA,KAAA,EAAO,+BAA4B,WAAW,CAAA,0DAAA;AAAA,GAChD;AACF;AASO,SAAS,sBAAA,CACd,KAAA,EACA,OAAA,GAAkB,OAAA,CAAQ,KAAI,EAM9B;AAEA,EAAA,MAAM,UAAA,GAAa,MAAA;AAInB,EAAA,IAAI,qBAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,iBAAiBoD,0BAAAA,CAAa,KAAA,EAAO,CAAC,QAAA,EAAU,IAAI,CAAA,EAAG;AAAA,MAC3D,GAAA,EAAK,OAAA;AAAA,MACL,QAAA,EAAU,OAAA;AAAA,MACV,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ;AAAA,KACjC,CAAA;AACD,IAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,KAAA,CAAM,iEAAiE,CAAA;AAC7G,IAAA,IAAI,cAAA,IAAkB,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAC/C,MAAA,qBAAA,GAAwB,cAAA,CAAe,CAAC,CAAA,CAAE,OAAA,CAAQ,sBAAsB,EAAE,CAAA;AAAA,IAC5E;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,gBAAgB,KAAA,CAAM,OAAA,IAAW,OAAA,EAAS,OAAA,CAAQ,MAAM,EAAE,CAAA;AAChE,EAAA,MAAM,sBAAA,GAAyB,YAAY,YAAY,CAAA,CAAA;AACvD,EAAA,MAAM,gBACJ,qBAAA,IAAyB,cAAA,CAAe,qBAAqB,CAAA,CAAE,QAC3D,qBAAA,GACA,sBAAA;AAIN,EAAA,MAAM,OAAA,GAAeO,gBAAA,CAAA,QAAA,CAAS,KAAA,CAAM,SAAS,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,QAAQ,OAAA,CAAQ,cAAA,EAAgB,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA;AAGzE,EAAA,IAAI,qBAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,iBAAiBP,0BAAAA,CAAa,KAAA,EAAO,CAAC,QAAA,EAAU,IAAI,CAAA,EAAG;AAAA,MAC3D,GAAA,EAAK,OAAA;AAAA,MACL,QAAA,EAAU,OAAA;AAAA,MACV,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ;AAAA,KACjC,CAAA;AACD,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA;AACvC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,EAAK,CAAE,OAAA,CAAQ,YAAY,EAAE,CAAA,CAAE,OAAA,CAAQ,oBAAA,EAAsB,EAAE,CAAA;AACtF,MAAA,IACE,SAAA,CAAU,WAAW,OAAO,CAAA,KAC3B,UAAU,WAAA,EAAY,CAAE,SAAS,OAAA,CAAQ,WAAA,EAAa,CAAA,IACrD,SAAA,CAAU,aAAY,CAAE,QAAA,CAAS,MAAM,QAAA,CAAS,WAAA,EAAa,CAAA,CAAA,EAC/D;AACA,QAAA,qBAAA,GAAwB,SAAA;AACxB,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,qBAAA,IAAyB,cAAA,CAAe,qBAAqB,CAAA,CAAE,KAAA,EAAO;AACxE,IAAA,aAAA,GAAgB,qBAAA;AAAA,EAClB,CAAA,MAAO;AAEL,IAAA,MAAM,iBAAiB,OAAA,CAAQ,UAAU,CAAA,CAAE,OAAA,CAAQ,0BAA0B,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,GAAG,CAAA,CAAE,WAAA,EAAa,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA;AACnH,IAAA,aAAA,GAAgB,QAAQ,cAAc,CAAA,CAAA;AAAA,EACxC;AAGA,EAAA,MAAM,gBAAgB,aAAA,CAAc,OAAA,CAAQ,sBAAsB,EAAE,CAAA,CAAE,MAAM,4BAA4B,CAAA;AACxG,EAAA,MAAM,QAAA,GAAW,aAAA,GAAgB,aAAA,CAAc,CAAC,IAAI,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,GAAG,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAElG,EAAA,IAAI,kBAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,iBAAiBA,0BAAAA,CAAa,KAAA,EAAO,CAAC,QAAA,EAAU,IAAI,CAAA,EAAG;AAAA,MAC3D,GAAA,EAAK,OAAA;AAAA,MACL,QAAA,EAAU,OAAA;AAAA,MACV,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ;AAAA,KACjC,CAAA;AACD,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA;AACvC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,EAAK,CAAE,OAAA,CAAQ,YAAY,EAAE,CAAA,CAAE,OAAA,CAAQ,oBAAA,EAAsB,EAAE,CAAA;AACtF,MAAA,IACE,SAAA,CAAU,UAAA,CAAW,CAAA,KAAA,EAAQ,QAAQ,GAAG,CAAA,IACxC,SAAA,CAAU,WAAA,EAAY,CAAE,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,WAAA,EAAa,CAAA,EAC3D;AACA,QAAA,kBAAA,GAAqB,SAAA;AACrB,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,kBAAA,IAAsB,cAAA,CAAe,kBAAkB,CAAA,CAAE,KAAA,EAAO;AAClE,IAAA,UAAA,GAAa,kBAAA;AAAA,EACf,CAAA,MAAO;AACL,IAAA,IAAI,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,WAAA,EAAY;AAC1C,IAAA,MAAM,OAAA,GAAU,WAAW,QAAA,CAAS,GAAG,KAAK,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,GAAS,CAAA;AAC3E,IAAA,IAAI,CAAC,OAAA,IAAW,KAAA,CAAM,SAAA,EAAW;AAC/B,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,SAAS,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAC1E,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,UAAA,GAAa,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,MACzC;AAAA,IACF;AACA,IAAA,UAAA,GAAa,CAAA,KAAA,EAAQ,QAAQ,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AAAA,EAC7C;AAEA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;AAMO,SAAS,kBAAA,CACd,MAAA,EACA,OAAA,GAAkC,EAAC,EACZ;AACvB,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAE/C,EAAA,MAAM,SAAA,GAAY,yBAAA,CAA0B,MAAA,EAAQ,OAAO,CAAA;AAC3D,EAAA,IAAI,CAAC,SAAA,CAAU,KAAA,IAAS,CAAC,UAAU,KAAA,EAAO;AACxC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA;AAAA,MACA,iBAAiB,EAAC;AAAA,MAClB,OAAO,SAAA,CAAU,KAAA;AAAA,MACjB,gBAAgB,SAAA,CAAU;AAAA,KAC5B;AAAA,EACF;AAEA,EAAA,MAAM,QAAQ,SAAA,CAAU,KAAA;AACxB,EAAA,MAAM,EAAE,YAAY,aAAA,EAAe,aAAA,EAAe,YAAW,GAAI,sBAAA,CAAuB,OAAO,OAAO,CAAA;AAEtG,EAAA,MAAM,kBAA4B,EAAC;AAEnC,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KAAmB;AACjC,IAAA,OAAOA,0BAAAA,CAAa,OAAO,IAAA,EAAM;AAAA,MAC/B,GAAA,EAAK,OAAA;AAAA,MACL,QAAA,EAAU,OAAA;AAAA,MACV,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,KAC/B,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,mBAAA,GAAsB,CAAC,MAAA,KAA4B;AACvD,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,CAAC,UAAA,EAAY,UAAA,EAAY,WAAW,CAAA,WAAA,EAAc,MAAM,EAAE,CAAC,CAAA;AAClE,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,MAAA,KAA4B;AACxD,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,CAAC,UAAA,EAAY,UAAA,EAAY,WAAW,CAAA,oBAAA,EAAuB,MAAM,EAAE,CAAC,CAAA;AAC3E,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA;AAEA,EAAA,IAAI;AAEF,IAAA,IAAI,CAAC,mBAAA,CAAoB,aAAa,CAAA,EAAG;AACvC,MAAA,IAAI,oBAAA,CAAqB,aAAa,CAAA,EAAG;AACvC,QAAA,MAAA,CAAO,CAAC,QAAA,EAAU,SAAA,EAAW,eAAe,CAAA,OAAA,EAAU,aAAa,EAAE,CAAC,CAAA;AAAA,MACxE,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,CAAC,QAAA,EAAU,aAAA,EAAe,UAAU,CAAC,CAAA;AAAA,MAC9C;AACA,MAAA,eAAA,CAAgB,KAAK,aAAa,CAAA;AAAA,IACpC;AAGA,IAAA,IAAI,CAAC,mBAAA,CAAoB,aAAa,CAAA,EAAG;AACvC,MAAA,IAAI,oBAAA,CAAqB,aAAa,CAAA,EAAG;AACvC,QAAA,MAAA,CAAO,CAAC,QAAA,EAAU,SAAA,EAAW,eAAe,CAAA,OAAA,EAAU,aAAa,EAAE,CAAC,CAAA;AAAA,MACxE,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,CAAC,QAAA,EAAU,aAAA,EAAe,aAAa,CAAC,CAAA;AAAA,MACjD;AACA,MAAA,eAAA,CAAgB,KAAK,aAAa,CAAA;AAAA,IACpC;AAGA,IAAA,IAAI,CAAC,mBAAA,CAAoB,UAAU,CAAA,EAAG;AACpC,MAAA,IAAI,oBAAA,CAAqB,UAAU,CAAA,EAAG;AACpC,QAAA,MAAA,CAAO,CAAC,QAAA,EAAU,SAAA,EAAW,YAAY,CAAA,OAAA,EAAU,UAAU,EAAE,CAAC,CAAA;AAAA,MAClE,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,CAAC,QAAA,EAAU,UAAA,EAAY,aAAa,CAAC,CAAA;AAAA,MAC9C;AACA,MAAA,eAAA,CAAgB,KAAK,UAAU,CAAA;AAAA,IACjC;AAGA,IAAA,MAAA,CAAO,CAAC,UAAA,EAAY,UAAU,CAAC,CAAA;AAE/B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,aAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA;AAAA,MACA,eAAA;AAAA,MACA,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF,SAAS,GAAA,EAAc;AACrB,IAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,aAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA;AAAA,MACA,eAAA;AAAA,MACA,KAAA,EAAO,yDAAsD,OAAO,CAAA;AAAA,KACtE;AAAA,EACF;AACF;AC9WA,IAAM,eAAA,GAAkB;AAAA,EACtB,MAAA,EAAQ,wBAAA;AAAA,EACR,SAAA,EAAW,2BAAA;AAAA,EACX,UAAA,EAAY,oCAAA;AAAA,EACZ,OAAA,EAAS,yBAAA;AAAA,EACT,YAAA,EAAc,iCAAA;AAAA,EACd,gBAAA,EAAkB,qCAAA;AAAA,EAClB,iBAAA,EAAmB;AACrB,CAAA;AAKO,SAAS,oBAAoB,UAAA,EAAoC;AACtE,EAAA,MAAM,OAAO,UAAA,IAAc,EAAA;AAC3B,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,MAAM,CAAA;AACrD,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,SAAS,CAAA;AAC3D,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,UAAU,CAAA;AAC7D,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,OAAO,CAAA;AACvD,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,YAAY,CAAA;AACjE,EAAA,MAAM,qBAAA,GAAwB,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,gBAAgB,CAAA;AACzE,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,iBAAiB,CAAA;AAEpE,EAAA,IAAI,UAAA,GAAgC,OAAA;AACpC,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,UAAA,GAAa,eAAA,CAAgB,CAAC,CAAA,CAAE,WAAA,EAAY;AAAA,EAC9C,WAAW,YAAA,IAAgB,YAAA,CAAa,CAAC,CAAA,CAAE,IAAA,OAAW,KAAA,EAAO;AAC3D,IAAA,UAAA,GAAa,OAAA;AAAA,EACf;AAEA,EAAA,MAAM,UAAU,YAAA,GAAe,YAAA,CAAa,CAAC,CAAA,CAAE,MAAK,GAAI,MAAA;AACxD,EAAA,MAAM,eAAe,iBAAA,GAAoB,QAAA,CAAS,kBAAkB,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAC9E,EAAA,MAAM,mBAAmB,qBAAA,GAAwB,QAAA,CAAS,sBAAsB,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAC1F,EAAA,MAAM,oBAAoB,eAAA,GAAkB,QAAA,CAAS,gBAAgB,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAE/E,EAAA,OAAO;AAAA,IACL,QAAQ,WAAA,GAAc,WAAA,CAAY,CAAC,CAAA,CAAE,MAAK,GAAI,MAAA;AAAA,IAC9C,WAAW,cAAA,GAAiB,cAAA,CAAe,CAAC,CAAA,CAAE,MAAK,GAAI,MAAA;AAAA,IACvD,UAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAW,OAAA,KAAY,KAAA,GAAQ,OAAA,GAAU,MAAA;AAAA,IAClD,YAAA,EAAc,KAAA,CAAM,YAAY,CAAA,GAAI,CAAA,GAAI,YAAA;AAAA,IACxC,gBAAA,EAAkB,KAAA,CAAM,gBAAgB,CAAA,GAAI,CAAA,GAAI,gBAAA;AAAA,IAChD,iBAAA,EAAmB,KAAA,CAAM,iBAAiB,CAAA,GAAI,CAAA,GAAI;AAAA,GACpD;AACF;AAKO,SAAS,qBAAqB,QAAA,EAA2C;AAC9E,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,SAAS,MAAA,EAAQ,KAAA,CAAM,KAAK,CAAA,SAAA,EAAY,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAC7D,EAAA,IAAI,SAAS,SAAA,EAAW,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,QAAA,CAAS,SAAS,CAAA,CAAE,CAAA;AACtE,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,QAAA,CAAS,UAAA,IAAc,OAAO,CAAA,CAAE,CAAA;AAC3D,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,QAAA,CAAS,OAAA,IAAW,KAAK,CAAA,CAAE,CAAA;AACnD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,QAAA,CAAS,YAAA,IAAgB,CAAC,CAAA,CAAE,CAAA;AACzD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,QAAA,CAAS,gBAAA,IAAoB,CAAC,CAAA,CAAE,CAAA;AACjE,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,qBAAA,EAAwB,QAAA,CAAS,iBAAA,IAAqB,CAAC,CAAA,CAAE,CAAA;AACpE,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAQA,SAAS,kBAAkB,MAAA,EAAqC;AAC9D,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,sBAAsB,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA;AACzF,EAAA,MAAM,SAA8B,EAAC;AAErC,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,wBAAwB,CAAA;AACvD,IAAA,IAAI,eAAe,EAAA,EAAI;AAEvB,IAAA,MAAM,YAAY,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,UAAU,EAAE,SAAA,EAAU;AACrD,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,UAAA,GAAa,yBAAyB,MAAM,CAAA;AAEvE,IAAA,MAAM,YAAA,GAAe,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAC3C,IAAA,MAAM,SAAS,YAAA,KAAiB,EAAA,GAAK,YAAY,SAAA,CAAU,KAAA,CAAM,GAAG,YAAY,CAAA;AAChF,IAAA,MAAM,OAAO,YAAA,KAAiB,EAAA,GAAK,KAAK,SAAA,CAAU,KAAA,CAAM,eAAe,CAAC,CAAA;AAExE,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,eAAA,CAAgB,IAAA,CAAK,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AACtF,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,cAAc,CAAA;AAAA,EAC5C;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBAAgB,KAAA,EAAqD;AAC5E,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AACrC,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAC/B,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAC/B,MAAA,IAAI,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,IAAS,CAAA;AACxB,MAAA,IAAI,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,OAAA,IAAW,CAAA;AAAA,IAC5B;AAAA,EACF;AACA,EAAA,OAAO,EAAE,OAAO,OAAA,EAAQ;AAC1B;AAEA,SAAS,gBAAA,CAAiB,SAAiB,SAAA,EAA6B;AACtE,EAAA,IAAI,SAAA,IAAa,cAAA,CAAe,IAAA,CAAK,SAAS,GAAG,OAAO,IAAA;AACxD,EAAA,OAAO,0BAAA,CAA2B,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA;AACvD;AAMO,SAAS,oBAAA,CACd,QAAA,EACA,UAAA,EACA,YAAA,EACgB;AAChB,EAAA,MAAM,MAAA,GAAyB,EAAE,GAAG,QAAA,EAAS;AAC7C,EAAA,MAAM,eAAe,UAAA,GAAa,YAAA;AAElC,EAAA,IAAI,MAAA,CAAO,eAAe,OAAA,EAAS;AAEjC,IAAA,IAAI,MAAA,CAAO,YAAA,KAAiB,CAAA,IAAK,MAAA,CAAO,qBAAqB,CAAA,EAAG;AAC9D,MAAA,IAAI,eAAe,CAAA,EAAG;AACpB,QAAA,MAAA,CAAO,gBAAA,GAAmB,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,IAAI,EAAE,CAAA;AACtD,QAAA,MAAA,CAAO,eAAe,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,YAAA,GAAe,IAAI,GAAI,CAAA;AAAA,MAC/D,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,gBAAA,GAAmB,CAAA;AAC1B,QAAA,MAAA,CAAO,YAAA,GAAe,GAAA;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,sBAAsB,CAAA,EAAG;AAClC,MAAA,MAAA,CAAO,iBAAA,GAAoB,eAAe,CAAA,GAAI,IAAA,CAAK,MAAM,EAAA,GAAK,YAAA,GAAe,GAAG,CAAA,GAAI,EAAA;AAAA,IACtF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,IAAI,MAAA,CAAO,sBAAsB,CAAA,EAAG;AAClC,MAAA,MAAA,CAAO,iBAAA,GAAoB,eAAe,CAAA,GAAI,IAAA,CAAK,MAAM,GAAA,GAAM,YAAA,GAAe,CAAC,CAAA,GAAI,GAAA;AAAA,IACrF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,2BACd,OAAA,EACA,OAAA,GAAkB,MAAA,EAClB,OAAA,GAA4B,EAAC,EACV;AACnB,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACvC,EAAA,MAAM,MAAA,GAAS,iFAAA;AACf,EAAA,IAAI,SAAA,GAAY,EAAA;AAChB,EAAA,MAAM,WAAW,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,GAAK,OAAA;AACtD,EAAA,IAAI;AACF,IAAA,SAAA,GAAYA,0BAAAA;AAAA,MACV,KAAA;AAAA,MACA,CAAC,KAAA,EAAO,QAAA,EAAU,CAAA,SAAA,EAAY,MAAM,IAAI,WAAW,CAAA;AAAA,MACnD,EAAE,KAAK,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAAE,KAC5D;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,IAAI,OAAA,IAAW,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACrC,MAAA,IAAI;AACF,QAAA,SAAA,GAAYA,0BAAAA;AAAA,UACV,KAAA;AAAA,UACA,CAAC,KAAA,EAAO,CAAA,OAAA,EAAU,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,EAAI,CAAA,SAAA,EAAY,MAAM,CAAA,CAAA,EAAI,CAAA,SAAA,CAAW,CAAA;AAAA,UAC1E,EAAE,KAAK,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAAE,SAC5D;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,EAAC;AAAA,MACV;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,kBAAkB,SAAS,CAAA;AAC1C,EAAA,MAAM,UAA6B,EAAC;AAEpC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,GAAM,CAAA;AACxC,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,GAAA,GAAM,OAAO,CAAC,CAAA;AACpB,IAAA,MAAM,UAAA,GAAa,OAAO,CAAC,CAAA;AAC3B,IAAA,MAAM,WAAA,GAAc,OAAO,CAAC,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,IAAA,MAAM,OAAA,GAAU,OAAO,CAAC,CAAA;AAExB,IAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,KAAA,CAAM,IAAI,CAAA;AAClD,IAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI,eAAA,CAAgB,MAAM,YAAY,CAAA;AAC7D,IAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,WAAA,EAAa,KAAA,EAAO,OAAO,CAAA;AACjE,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,OAAA,EAAS,QAAA,CAAS,SAAS,CAAA;AAE7D,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,GAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA,EAAY,KAAA;AAAA,MACZ,YAAA,EAAc,OAAA;AAAA,MACd;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,OAAA;AACT;AC7NA,IAAM,kBAAA,GAAsF;AAAA,EAC1F,EAAE,MAAA,EAAQ,mBAAA,EAAqB,YAAA,EAAc,kBAAA,EAAoB,QAAQ,aAAA,EAAc;AAAA,EACvF,EAAE,MAAA,EAAQ,6BAAA,EAA+B,YAAA,EAAc,kBAAA,EAAoB,QAAQ,aAAA,EAAc;AAAA,EACjG,EAAE,MAAA,EAAQ,sBAAA,EAAwB,YAAA,EAAc,kBAAA,EAAoB,QAAQ,aAAA,EAAc;AAAA,EAC1F,EAAE,MAAA,EAAQ,mBAAA,EAAqB,YAAA,EAAc,mBAAA,EAAqB,QAAQ,QAAA,EAAS;AAAA,EACnF,EAAE,MAAA,EAAQ,aAAA,EAAe,YAAA,EAAc,mBAAA,EAAqB,QAAQ,aAAA,EAAc;AAAA,EAClF,EAAE,MAAA,EAAQ,cAAA,EAAgB,YAAA,EAAc,mBAAA,EAAqB,QAAQ,cAAA,EAAe;AAAA,EACpF,EAAE,MAAA,EAAQ,cAAA,EAAgB,YAAA,EAAc,cAAA,EAAgB,QAAQ,QAAA,EAAS;AAAA,EACzE,EAAE,MAAA,EAAQ,mBAAA,EAAqB,YAAA,EAAc,cAAA,EAAgB,QAAQ,QAAA,EAAS;AAAA,EAC9E,EAAE,MAAA,EAAQ,gBAAA,EAAkB,YAAA,EAAc,kBAAA,EAAoB,QAAQ,UAAA,EAAW;AAAA,EACjF,EAAE,MAAA,EAAQ,eAAA,EAAiB,YAAA,EAAc,kBAAA,EAAoB,QAAQ,SAAA,EAAU;AAAA,EAC/E,EAAE,MAAA,EAAQ,sBAAA,EAAwB,YAAA,EAAc,gBAAA,EAAkB,QAAQ,SAAA,EAAU;AAAA,EACpF,EAAE,MAAA,EAAQ,oBAAA,EAAsB,YAAA,EAAc,gBAAA,EAAkB,QAAQ,SAAA,EAAU;AAAA,EAClF,EAAE,MAAA,EAAQ,aAAA,EAAe,YAAA,EAAc,aAAA,EAAe,QAAQ,OAAA,EAAQ;AAAA,EACtE,EAAE,MAAA,EAAQ,YAAA,EAAc,YAAA,EAAc,gBAAA,EAAkB,QAAQ,QAAA,EAAS;AAAA,EACzE,EAAE,MAAA,EAAQ,eAAA,EAAiB,YAAA,EAAc,iBAAA,EAAmB,QAAQ,eAAA,EAAgB;AAAA,EACpF,EAAE,MAAA,EAAQ,UAAA,EAAY,YAAA,EAAc,iBAAA,EAAmB,QAAQ,eAAA;AACjE,CAAA;AAEA,IAAM,cAAA,GAAiB,iEAAA;AAEvB,SAAS,iBAAA,CAAkB,KAAa,GAAA,EAAiC;AACvE,EAAA,IAAI;AACF,IAAA,MAAM,MAAMA,0BAAAA,CAAa,KAAA,EAAO,CAAC,QAAA,EAAU,OAAA,EAAS,GAAG,CAAA,EAAG;AAAA,MACxD,GAAA;AAAA,MACA,QAAA,EAAU,OAAA;AAAA,MACV,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,KAC/B,EAAE,IAAA,EAAK;AACR,IAAA,OAAO,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,KAAA,CAAA;AAAA,EAChC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AASA,SAAS,qBAAqB,GAAA,EAA0C;AACtE,EAAA,MAAM,aAAA,GAAgB;AAAA,IACfS,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,UAAA,EAAY,wBAAwB,CAAA;AAAA,IAC9CA,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,UAAA,EAAY,oBAAoB;AAAA,GACjD;AACA,EAAA,KAAA,MAAW,KAAK,aAAA,EAAe;AAC7B,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,CAAC,CAAA,EAAG;AACpB,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAASA,cAAA,CAAA,YAAA,CAAa,CAAA,EAAG,OAAO,CAAA;AACtC,QAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,MACvB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,0BAA0B,GAAA,EAAqB;AACtD,EAAA,IAAI,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,mBAAA;AAChC,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,QAAA;AAC7B,EAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,gBAAA;AACjC,EAAA,IAAI,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,gBAAA;AAChC,EAAA,IAAI,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,mBAAA;AAChC,EAAA,OAAO,iBAAA;AACT;AAMO,SAAS,oBAAA,CACd,OAAA,GAAqD,EAAC,EACtC;AAChB,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA;AACnC,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAGvC,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,mBAAA,IAAuB,GAAA,CAAI,WAAA;AACnD,EAAA,IAAI,WAAA,KAAgB,OAAA,IAAW,WAAA,KAAgB,OAAA,EAAS;AACtD,IAAA,MAAM,KAAA,GAAQ,WAAA,KAAgB,OAAA,GAAW,GAAA,CAAI,YAAY,iBAAA,GAAqB,KAAA;AAC9E,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,WAAA;AAAA,MACZ,KAAA;AAAA,MACA,MAAA,EAAQ,cAAA;AAAA,MACR,UAAA,EAAY,MAAA;AAAA,MACZ,YAAA,EAAc,CAAA;AAAA,MACd,gBAAA,EAAkB,CAAA;AAAA,MAClB,iBAAA,EAAmB;AAAA,KACrB;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,qBAAA,EAAuB,GAAG,CAAA;AAClE,EAAA,IAAI,aAAA,KAAkB,OAAA,IAAW,aAAA,KAAkB,OAAA,EAAS;AAC1D,IAAA,MAAM,iBAAiB,iBAAA,CAAkB,eAAA,EAAiB,GAAG,CAAA,KAAM,aAAA,KAAkB,UAAU,iBAAA,GAAoB,KAAA,CAAA;AACnH,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,aAAA;AAAA,MACZ,KAAA,EAAO,cAAA;AAAA,MACP,MAAA,EAAQ,YAAA;AAAA,MACR,UAAA,EAAY,MAAA;AAAA,MACZ,YAAA,EAAc,CAAA;AAAA,MACd,gBAAA,EAAkB,CAAA;AAAA,MAClB,iBAAA,EAAmB;AAAA,KACrB;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,qBAAqB,GAAG,CAAA;AAC1C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,IAAS,GAAA,CAAI,QAAA,IAAY,iBAAA;AACjD,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,OAAA;AAAA,MACZ,KAAA;AAAA,MACA,MAAA,EAAQ,wBAAA;AAAA,MACR,UAAA,EAAY,MAAA;AAAA,MACZ,YAAA,EAAc,UAAU,YAAA,IAAgB,CAAA;AAAA,MACxC,gBAAA,EAAkB,UAAU,gBAAA,IAAoB,CAAA;AAAA,MAChD,iBAAA,EAAmB,UAAU,iBAAA,IAAqB;AAAA,KACpD;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,WAAW,kBAAA,EAAoB;AACxC,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AACjC,IAAA,IAAI,MAAA,IAAU,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,OAAA,EAAS;AAClD,MAAA,MAAM,QAAQ,GAAA,CAAI,QAAA,KAAa,QAAQ,MAAA,KAAW,aAAA,GAAgB,SAAS,OAAA,CAAQ,YAAA,CAAA;AACnF,MAAA,OAAO;AAAA,QACL,UAAA,EAAY,OAAA;AAAA,QACZ,KAAA;AAAA,QACA,MAAA,EAAQ,CAAA,IAAA,EAAO,OAAA,CAAQ,MAAM,CAAA,CAAA;AAAA,QAC7B,UAAA,EAAY,MAAA;AAAA,QACZ,cAAc,QAAA,CAAS,GAAA,CAAI,aAAA,IAAiB,GAAA,EAAK,EAAE,CAAA,IAAK,CAAA;AAAA,QACxD,kBAAkB,QAAA,CAAS,GAAA,CAAI,iBAAA,IAAqB,GAAA,EAAK,EAAE,CAAA,IAAK,CAAA;AAAA,QAChE,iBAAA,EAAmB,SAAS,GAAA,CAAI,mBAAA,IAAuB,IAAI,eAAA,IAAmB,GAAA,EAAK,EAAE,CAAA,IAAK;AAAA,OAC5F;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,aAAa,GAAA,CAAI,eAAA,IAAmB,iBAAA,CAAkB,WAAA,EAAa,GAAG,CAAA,IAAK,EAAA;AACjF,EAAA,MAAM,cAAc,GAAA,CAAI,gBAAA,IAAoB,iBAAA,CAAkB,YAAA,EAAc,GAAG,CAAA,IAAK,EAAA;AAEpF,EAAA,IAAI,eAAe,IAAA,CAAK,UAAU,KAAK,cAAA,CAAe,IAAA,CAAK,WAAW,CAAA,EAAG;AACvE,IAAA,MAAM,gBAAgB,yBAAA,CAA0B,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,WAAW,CAAA,CAAE,CAAA;AAC9E,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,OAAA;AAAA,MACZ,KAAA,EAAO,aAAA;AAAA,MACP,MAAA,EAAQ,oBAAA;AAAA,MACR,UAAA,EAAY,QAAA;AAAA,MACZ,YAAA,EAAc,CAAA;AAAA,MACd,gBAAA,EAAkB,CAAA;AAAA,MAClB,iBAAA,EAAmB;AAAA,KACrB;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,OAAA;AAAA,IACZ,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ,eAAA;AAAA,IACR,UAAA,EAAY,MAAA;AAAA,IACZ,YAAA,EAAc,CAAA;AAAA,IACd,gBAAA,EAAkB,CAAA;AAAA,IAClB,iBAAA,EAAmB;AAAA,GACrB;AACF;AC5KO,IAAM,yBAAA,GAA4B,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmGlC,SAAS,eAAA,CAAgB,OAAA,GAAkB,OAAA,CAAQ,GAAA,EAAI,EAAsB;AAClF,EAAA,MAAM,MAAA,GAAcC,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AACxC,EAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,MAAM,CAAA,EAAG;AAC1B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,2CAAwC,MAAM,CAAA,EAAA;AAAA,KACvD;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAgBD,gBAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AAC1C,EAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,IAAGA,cAAA,CAAA,SAAA,CAAU,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAC5C;AAEA,EAAA,MAAM,QAAA,GAAgBD,gBAAA,CAAA,IAAA,CAAK,QAAA,EAAU,oBAAoB,CAAA;AACzD,EAAA,IAAI;AACF,IAAGC,cAAA,CAAA,aAAA,CAAc,UAAU,yBAAA,EAA2B,EAAE,UAAU,OAAA,EAAS,IAAA,EAAM,KAAO,CAAA;AACxF,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF,SAAS,GAAA,EAAc;AACrB,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,CAAA,8BAAA,EAAiC,QAAQ,CAAA,GAAA,EAAM,GAAG,CAAA;AAAA,KAC3D;AAAA,EACF;AACF;;;AC3GO,IAAM,qBAAA,GAAwB;AAC9B,IAAM,mBAAA,GAAsB;AAEnC,SAAS,sBAAA,CAAuB,cAAsB,gBAAA,EAAkC;AACtF,EAAA,MAAM,UAAA,GAAc,eAAe,GAAA,GAAa,CAAA;AAChD,EAAA,MAAM,cAAA,GAAkB,mBAAmB,GAAA,GAAa,EAAA;AACxD,EAAA,OAAO,IAAA,CAAK,KAAA,CAAA,CAAO,UAAA,GAAa,cAAA,IAAkB,GAAK,CAAA,GAAI,GAAA;AAC7D;AAEA,SAAS,kBAAA,GAAuC;AAC9C,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY,CAAA;AAAA,IACZ,YAAA,EAAc,CAAA;AAAA,IACd,iBAAA,EAAmB,CAAA;AAAA,IACnB,YAAA,EAAc,CAAA;AAAA,IACd,gBAAA,EAAkB,CAAA;AAAA,IAClB,gBAAA,EAAkB;AAAA,GACpB;AACF;AAEA,SAAS,gBAAA,CAAiB,QAA0B,MAAA,EAA+B;AACjF,EAAA,MAAA,CAAO,OAAA,IAAW,CAAA;AAClB,EAAA,MAAA,CAAO,cAAc,MAAA,CAAO,UAAA;AAC5B,EAAA,MAAA,CAAO,gBAAgB,MAAA,CAAO,YAAA;AAC9B,EAAA,MAAA,CAAO,iBAAA,IAAqB,OAAO,QAAA,CAAS,iBAAA;AAC5C,EAAA,MAAA,CAAO,YAAA,IAAgB,OAAO,QAAA,CAAS,YAAA;AACvC,EAAA,MAAA,CAAO,gBAAA,IAAoB,OAAO,QAAA,CAAS,gBAAA;AAC3C,EAAA,MAAA,CAAO,gBAAA,GAAmB,sBAAA,CAAuB,MAAA,CAAO,YAAA,EAAc,OAAO,gBAAgB,CAAA;AAC/F;AAKO,SAAS,gBACd,OAAA,EACA,OAAA,GAAkB,MAAA,EAClB,OAAA,GAA4B,EAAC,EACX;AAClB,EAAA,MAAM,OAAA,GAAU,0BAAA,CAA2B,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AACpE,EAAA,MAAM,eAAe,kBAAA,EAAmB;AACxC,EAAA,MAAM,UAA4C,EAAC;AAEnD,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,eAAA,IAAmB,MAAA,CAAO,UAAA;AAC1B,IAAA,iBAAA,IAAqB,MAAA,CAAO,YAAA;AAC5B,IAAA,eAAA,IAAmB,OAAO,QAAA,CAAS,iBAAA;AACnC,IAAA,WAAA,IAAe,OAAO,QAAA,CAAS,YAAA;AAC/B,IAAA,eAAA,IAAmB,OAAO,QAAA,CAAS,gBAAA;AACnC,IAAA,IAAI,MAAA,CAAO,UAAU,OAAA,GAAU,IAAA;AAE/B,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,UAAA,KAAe,OAAA,EAAS;AAC1C,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,QAAA,CAAS,OAAA,IAAW,eAAA;AAC7C,MAAA,IAAI,CAAC,OAAA,CAAQ,SAAS,CAAA,EAAG;AACvB,QAAA,OAAA,CAAQ,SAAS,IAAI,kBAAA,EAAmB;AAAA,MAC1C;AACA,MAAA,gBAAA,CAAiB,OAAA,CAAQ,SAAS,CAAA,EAAG,MAAM,CAAA;AAAA,IAC7C,CAAA,MAAO;AACL,MAAA,gBAAA,CAAiB,cAAc,MAAM,CAAA;AAAA,IACvC;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAc,OAAA,CAAQ,MAAA;AAAA,IACtB,UAAA,EAAY,eAAA;AAAA,IACZ,YAAA,EAAc,iBAAA;AAAA,IACd,sBAAA,EAAwB,eAAA;AAAA,IACxB,iBAAA,EAAmB,WAAA;AAAA,IACnB,qBAAA,EAAuB,eAAA;AAAA,IACvB,aAAa,WAAA,GAAc,eAAA;AAAA,IAC3B,gBAAA,EAAkB,sBAAA,CAAuB,WAAA,EAAa,eAAe,CAAA;AAAA,IACrE,YAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA,EAAe;AAAA,GACjB;AACF;AAEA,SAAS,cAAc,OAAA,EAAyB;AAC9C,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACpC,EAAA,OAAO,OAAO,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,IAAA,CAAA,GAAS,GAAG,OAAO,CAAA,CAAA,CAAA;AAC9C;AAKO,SAAS,oBAAoB,GAAA,EAA+B;AACjE,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AACtC,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,UAAU,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AACjE,EAAA,MAAM,iBAAiB,MAAA,CAAO,GAAA,CAAI,MAAM,OAAO,CAAA,CAAE,KAAK,KAAK,CAAA;AAE3D,EAAA,MAAM,OAAA,GAAU,qBAAqB,MAAA,CAAO,MAAA,GAAS,IAAI,CAAA,CAAA,EAAI,YAAY,OAAO,EAAE,CAAA,WAAA,CAAA;AAClF,EAAA,MAAMC,IAAAA,GAAM,mBAAmB,MAAA,CAAO,MAAA,GAAS,IAAI,CAAA,CAAA,EAAI,cAAc,OAAO,EAAE,CAAA,QAAA,CAAA;AAE9E,EAAA,MAAM,QAAQ,GAAA,CAAI,YAAA;AAClB,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AACvE,EAAA,MAAM,SAAA,GAAY,OAAO,GAAA,CAAI,CAAC,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,QAAQ,CAAC,CAAA,CAAE,UAAU,CAAA,IAAA,EAAO,GAAA,CAAI,QAAQ,CAAC,CAAA,CAAE,YAAY,CAAA,CAAE,CAAA,CAAE,KAAK,KAAK,CAAA;AACjH,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,aAAA,CAAc,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,iBAAiB,CAAC,CAAA,CAAE,KAAK,KAAK,CAAA;AAC9F,EAAA,MAAM,SAAA,GAAY,OAAO,GAAA,CAAI,CAAC,MAAM,CAAA,EAAA,CAAI,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,YAAA,GAAe,IAAI,OAAA,CAAQ,CAAC,EAAE,gBAAA,EAAkB,cAAA,CAAe,OAAO,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAC5I,EAAA,MAAM,WAAW,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,iBAAiB,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,CAAA,CAAE,KAAK,KAAK,CAAA;AAE/F,EAAA,MAAM,aAAa,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,IAAA,EAAO,IAAI,YAAY,CAAA,CAAA;AAC5D,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,GAAA,CAAI,sBAAsB,CAAA;AAC1D,EAAA,MAAM,iBAAiB,CAAA,EAAG,GAAA,CAAI,WAAA,CAAY,cAAA,CAAe,OAAO,CAAC,CAAA,OAAA,CAAA;AACjE,EAAA,MAAM,eAAe,CAAA,CAAA,EAAI,GAAA,CAAI,gBAAA,CAAiB,OAAA,CAAQ,CAAC,CAAC,CAAA,IAAA,CAAA;AAExD,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,CAAA,gBAAA,EAAmB,KAAA,CAAM,OAAO,CAAA,EAAA,EAAK,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,CAAA,CAAA,EAAI,UAAU,CAAA,EAAA,CAAA,GAAO,EAAE,CAAA,GAAA,EAAM,IAAI,YAAY,CAAA,IAAA,CAAA;AAAA,IACtG,CAAA,+BAAA,EAAkC,KAAA,CAAM,UAAU,CAAA,IAAA,EAAO,MAAM,YAAY,CAAA,EAAA,EAAK,MAAA,CAAO,MAAA,GAAS,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,EAAA,CAAA,GAAO,EAAE,MAAM,UAAU,CAAA,IAAA,CAAA;AAAA,IAC1I,CAAA,gCAAA,EAAmC,aAAA,CAAc,KAAA,CAAM,iBAAiB,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,CAAA,GAAO,EAAE,MAAM,SAAS,CAAA,IAAA,CAAA;AAAA,IACtI,CAAA,oCAAA,EAAuC,OAAO,MAAA,GAAS,CAAA,GAAI,IAAI,SAAS,CAAA,EAAA,CAAA,GAAO,EAAE,CAAA,GAAA,EAAM,cAAc,CAAA,IAAA,CAAA;AAAA,IACrG,CAAA,mDAAA,EAAiD,OAAO,MAAA,GAAS,CAAA,GAAI,IAAI,QAAQ,CAAA,EAAA,CAAA,GAAO,EAAE,CAAA,GAAA,EAAM,YAAY,CAAA,IAAA;AAAA,GAC9G;AAEA,EAAA,OAAO;AAAA,IACL,qBAAA;AAAA,IACA,kDAAA;AAAA,IACA,EAAA;AAAA,IACA,OAAA;AAAA,IACAA,IAAAA;AAAA,IACA,GAAG,IAAA;AAAA,IACH,EAAA;AAAA,IACA,CAAA,0BAAA,EAA6B,GAAA,CAAI,OAAA,GAAU,iCAAA,GAA6B,sBAAiB,cAAc,GAAA,CAAI,OAAO,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,CAAA,GAAA,CAAA;AAAA,IAClI;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACb;AAKO,SAAS,oBAAA,CAAqB,cAAsB,WAAA,EAA6B;AACtF,EAAA,MAAM,OAAO,YAAA,IAAgB,EAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,qBAAqB,CAAA;AACrD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,mBAAmB,CAAA;AAEjD,EAAA,IAAI,UAAA,KAAe,EAAA,IAAM,QAAA,KAAa,EAAA,EAAI;AACxC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,oBAAoB,MAAM,CAAA;AAC9D,IAAA,OAAO,CAAA,EAAG,MAAA,CAAO,OAAA,EAAS;;AAAA,EAAO,WAAW;;AAAA,EAAO,KAAA,CAAM,SAAA,EAAW,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,EAC9E;AAEA,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,OAAA,EAAS;;AAAA,EAAO,WAAW;AAAA,CAAA;AAC5C;AClIA,SAAS,aAAA,CAAc,QAAgB,UAAA,EAA4B;AACjE,EAAA,MAAM,UAAA,GAAc,SAAS,GAAA,GAAa,CAAA;AAC1C,EAAA,MAAM,cAAA,GAAkB,aAAa,GAAA,GAAa,EAAA;AAClD,EAAA,OAAO,IAAA,CAAK,KAAA,CAAA,CAAO,UAAA,GAAa,cAAA,IAAkB,GAAK,CAAA,GAAI,GAAA;AAC7D;AAEA,SAAS,iBAAiB,MAAA,EAA4D;AACpF,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,UAAA,KAAe,OAAA,EAAS;AAC1C,IAAA,OAAO,EAAE,GAAA,EAAK,MAAA,CAAO,SAAS,OAAA,IAAW,eAAA,EAAiB,SAAS,IAAA,EAAK;AAAA,EAC1E;AACA,EAAA,OAAO,EAAE,KAAK,CAAA,OAAA,EAAU,MAAA,CAAO,cAAc,WAAW,CAAA,CAAA,CAAA,EAAK,SAAS,KAAA,EAAM;AAC9E;AAEA,SAAS,qBAAA,CAAsB,KAAa,OAAA,EAAoC;AAC9E,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,GAAA;AAAA,IACf,OAAA;AAAA,IACA,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY,CAAA;AAAA,IACZ,YAAA,EAAc,CAAA;AAAA,IACd,YAAA,EAAc,CAAA;AAAA,IACd,YAAA,EAAc,CAAA;AAAA,IACd,mBAAA,EAAqB,CAAA;AAAA,IACrB,gBAAA,EAAkB,CAAA;AAAA,IAClB,WAAA,EAAa,CAAA;AAAA,IACb,gBAAA,EAAkB;AAAA,GACpB;AACF;AAKO,SAAS,qBACd,aAAA,EACA,UAAA,GAAqB,MAAA,EACrB,OAAA,GAA4B,EAAC,EACX;AAClB,EAAA,MAAM,OAAA,GAAU,0BAAA,CAA2B,UAAA,EAAY,aAAA,EAAe,OAAO,CAAA;AAC7E,EAAA,MAAM,WAA6C,EAAC;AACpD,EAAA,MAAM,UAA8B,EAAC;AAErC,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,iBAAiB,MAAM,CAAA;AAChD,IAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,EAAG;AAClB,MAAA,QAAA,CAAS,GAAG,CAAA,GAAI,qBAAA,CAAsB,GAAA,EAAK,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,MAAM,IAAA,GAAO,SAAS,GAAG,CAAA;AACzB,IAAA,IAAA,CAAK,OAAA,IAAW,CAAA;AAChB,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,UAAA;AAC1B,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,YAAA;AAC5B,IAAA,IAAA,CAAK,gBAAA,IAAoB,OAAO,QAAA,CAAS,iBAAA;AACzC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,YAAA,GAAe,OAAO,QAAA,CAAS,gBAAA;AAC9D,IAAA,IAAA,CAAK,WAAA,IAAe,MAAA;AAEpB,IAAA,eAAA,IAAmB,MAAA,CAAO,UAAA;AAC1B,IAAA,iBAAA,IAAqB,MAAA,CAAO,YAAA;AAC5B,IAAA,SAAA,IAAa,OAAO,QAAA,CAAS,iBAAA;AAC7B,IAAA,WAAA,IAAe,MAAA;AAEf,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,IAAA,CAAK,YAAA,IAAgB,CAAA;AACrB,MAAA,UAAA,IAAc,OAAO,QAAA,CAAS,iBAAA;AAC9B,MAAA,YAAA,IAAgB,MAAA;AAChB,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,GAAA,EAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,QAC1B,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,MAAA,EAAQ,GAAA;AAAA,QACR,SAAA,EAAW,OAAO,QAAA,CAAS,SAAA;AAAA,QAC3B,WAAA,EAAa,OAAO,QAAA,CAAS,iBAAA;AAAA,QAC7B;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,MAAM,cAAc,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS;AACxD,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,KAAA,CAAA,CAAQ,IAAA,CAAK,aAAa,IAAA,CAAK,YAAA,IAAgB,GAAA,GAAQ,GAAG,CAAA,GAAI,GAAA;AACvF,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA,CAAK,YAAA,GAAe,CAAA,GAC3C,IAAA,CAAK,KAAA,CAAO,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,YAAA,GAAgB,GAAG,CAAA,GAAI,MAC5D,IAAA,CAAK,YAAA;AACT,IAAA,IAAA,CAAK,mBAAmB,aAAA,CAAc,IAAA,CAAK,cAAc,GAAA,EAAK,IAAA,CAAK,cAAc,GAAG,CAAA;AACpF,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAA,CAAQ,kBAAkB,iBAAA,IAAqB,GAAA,GAAQ,GAAG,CAAA,GAAI,GAAA;AACrF,EAAA,MAAM,YAAY,OAAA,CAAQ,MAAA;AAC1B,EAAA,MAAM,mBAAA,GAAsB,YAAY,CAAA,GAAI,IAAA,CAAK,MAAO,SAAA,GAAY,SAAA,GAAa,GAAG,CAAA,GAAI,GAAA,GAAM,SAAA;AAC9F,EAAA,MAAM,YAAA,GAAe,aAAA,CAAc,WAAA,GAAc,GAAA,EAAK,cAAc,GAAG,CAAA;AACvE,EAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,YAAA,GAAe,GAAA,EAAK,eAAe,GAAG,CAAA;AAE1E,EAAA,MAAM,iBAAA,GAAoB,YAAY,CAAA,GAAI,IAAA,CAAK,MAAO,UAAA,GAAa,SAAA,GAAa,GAAK,CAAA,GAAI,GAAA,GAAM,CAAA;AAC/F,EAAA,MAAM,mBAAA,GAAsB,cAAc,CAAA,GAAI,IAAA,CAAK,MAAO,YAAA,GAAe,WAAA,GAAe,GAAK,CAAA,GAAI,GAAA,GAAM,CAAA;AACvG,EAAA,MAAM,iBAAA,GAAoB,eAAe,CAAA,GAAI,IAAA,CAAK,MAAO,aAAA,GAAgB,YAAA,GAAgB,GAAK,CAAA,GAAI,GAAA,GAAM,CAAA;AAExG,EAAA,OAAO;AAAA,IACL,aAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IACpC,cAAc,OAAA,CAAQ,MAAA;AAAA,IACtB,eAAA;AAAA,IACA,iBAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,mBAAA;AAAA,IACA,gBAAA,EAAkB,SAAA;AAAA,IAClB,WAAA;AAAA,IACA,YAAA;AAAA,IACA,iBAAA,EAAmB,UAAA;AAAA,IACnB,YAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA,iBAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,YAAY,OAAA,EAAyB;AAC5C,EAAA,MAAM,KAAA,GAAA,CAAS,OAAA,GAAU,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAA;AACxC,EAAA,OAAO,GAAG,KAAK,CAAA,GAAA,EAAM,KAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAC,CAAA,KAAA,CAAA;AAC/C;AAKO,SAAS,yBAAyB,MAAA,EAAkC;AACzE,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,KAAS;AAClD,IAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,aAAa,CAAA,KAAA,EAAQ,IAAA,CAAK,OAAO,CAAA,GAAA,EAAM,IAAA,CAAK,YAAY,CAAA,GAAA,EAAM,IAAA,CAAK,YAAY,QAAQ,IAAA,CAAK,mBAAmB,CAAA,KAAA,EAAQ,WAAA,CAAY,IAAA,CAAK,gBAAgB,CAAC,CAAA,GAAA,EAAM,KAAK,WAAA,CAAY,cAAA,CAAe,OAAO,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,EACnQ,CAAC,CAAA;AAED,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GACpC,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,OAAO,CAAA,CAAE,GAAG,QAAQ,CAAA,CAAE,OAAO,MAAM,CAAA,CAAE,MAAM,CAAA,GAAA,EAAM,CAAA,CAAE,aAAa,KAAK,CAAA,GAAA,EAAM,KAAK,KAAA,CAAM,CAAA,CAAE,cAAc,EAAE,CAAC,CAAA,OAAA,EAAU,CAAA,CAAE,OAAO,cAAA,CAAe,OAAO,CAAC,CAAA,EAAA,CAAI,CAAA,GACjL,CAAC,gFAAiE,CAAA;AAEtE,EAAA,OAAO;AAAA,IACL,CAAA,+CAAA,EAA2C,OAAO,aAAa,CAAA,EAAA,CAAA;AAAA,IAC/D,EAAA;AAAA,IACA,CAAA,kBAAA,EAAqB,MAAA,CAAO,UAAU,CAAA,YAAA,EAAU,OAAO,aAAa,CAAA,EAAA,CAAA;AAAA,IACpE,CAAA,kBAAA,EAAqB,OAAO,WAAW,CAAA,CAAA;AAAA,IACvC,CAAA,oBAAA,EAAuB,MAAA,CAAO,YAAY,CAAA,WAAA,EAAc,MAAA,CAAO,SAAS,CAAA,QAAA,EAAW,MAAA,CAAO,eAAe,CAAA,IAAA,EAAO,MAAA,CAAO,iBAAiB,CAAA,CAAA,CAAA;AAAA,IACxI,CAAA,+BAAA,EAAkC,MAAA,CAAO,mBAAmB,CAAA,gBAAA,EAAmB,OAAO,SAAS,CAAA,gBAAA,CAAA;AAAA,IAC/F,EAAA;AAAA,IACA,KAAA;AAAA,IACA,EAAA;AAAA,IACA,wEAAA;AAAA,IACA,EAAA;AAAA,IACA,oGAAA;AAAA,IACA,kEAAA;AAAA,IACA,GAAG,UAAA;AAAA,IACH,CAAA,wBAAA,EAA2B,MAAA,CAAO,YAAY,CAAA,OAAA,EAAU,MAAA,CAAO,SAAS,CAAA,OAAA,EAAU,MAAA,CAAO,SAAS,CAAA,OAAA,EAAU,MAAA,CAAO,mBAAmB,CAAA,OAAA,EAAU,WAAA,CAAY,MAAA,CAAO,gBAAgB,CAAC,CAAA,OAAA,EAAU,MAAA,CAAO,WAAA,CAAY,cAAA,CAAe,OAAO,CAAC,CAAA,QAAA,EAAW,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,QAAA,CAAA;AAAA,IACjR,EAAA;AAAA,IACA,KAAA;AAAA,IACA,EAAA;AAAA,IACA,8CAAA;AAAA,IACA,EAAA;AAAA,IACA,kHAAA;AAAA,IACA,0CAAA;AAAA,IACA,sBAAsB,WAAA,CAAY,MAAA,CAAO,gBAAgB,CAAC,CAAA,GAAA,EAAM,YAAY,MAAA,CAAO,iBAAiB,CAAC,CAAA,KAAA,EAAQ,OAAO,iBAAiB,CAAA,MAAA,EAAS,OAAO,iBAAA,IAAqB,EAAA,GAAK,kCAAsB,wBAAiB,CAAA,EAAA,CAAA;AAAA,IACtN,CAAA,kBAAA,EAAqB,OAAO,WAAA,CAAY,cAAA,CAAe,OAAO,CAAC,CAAA,UAAA,EAAa,OAAO,YAAA,CAAa,cAAA,CAAe,OAAO,CAAC,CAAA,YAAA,EAAe,OAAO,mBAAmB,CAAA,MAAA,EAAS,OAAO,mBAAA,IAAuB,EAAA,GAAK,kCAAsB,wBAAiB,CAAA,EAAA,CAAA;AAAA,IACnP,CAAA,gCAAA,EAAmC,OAAO,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,QAAA,EAAW,OAAO,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAC,CAAA,SAAA,EAAY,OAAO,iBAAiB,CAAA,MAAA,EAAS,OAAO,iBAAA,IAAqB,EAAA,GAAK,kCAAsB,wBAAiB,CAAA,EAAA,CAAA;AAAA,IAChO,EAAA;AAAA,IACA,KAAA;AAAA,IACA,EAAA;AAAA,IACA,yCAAA;AAAA,IACA,EAAA;AAAA,IACA,gFAAA;AAAA,IACA,+CAAA;AAAA,IACA,GAAG;AAAA,GACL,CAAE,KAAK,IAAI,CAAA;AACb;AAKO,SAAS,qBAAA,CACd,MAAA,EACA,OAAA,GAAkC,EAAC,EACS;AAC5C,EAAA,MAAM,IAAA,GAAO,QAAQ,SAAA,IAAkBC,gBAAA,CAAA,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,WAAW,UAAU,CAAA;AAChF,EAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG;AACxB,IAAGA,cAAA,CAAA,SAAA,CAAU,IAAA,EAAM,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,aAAA,CAAc,OAAA,CAAQ,mBAAmB,GAAG,CAAA;AAC3E,EAAA,MAAM,MAAA,GAAcD,gBAAA,CAAA,IAAA,CAAK,IAAA,EAAM,CAAA,aAAA,EAAgB,eAAe,CAAA,GAAA,CAAK,CAAA;AACnE,EAAA,MAAM,QAAA,GAAgBA,gBAAA,CAAA,IAAA,CAAK,IAAA,EAAM,CAAA,QAAA,EAAW,eAAe,CAAA,UAAA,CAAY,CAAA;AAEvE,EAAA,MAAM,SAAA,GAAY,yBAAyB,MAAM,CAAA;AACjD,EAAGC,cAAA,CAAA,aAAA,CAAc,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAA;AAC3C,EAAGA,cAAA,CAAA,aAAA,CAAc,UAAU,IAAA,CAAK,SAAA,CAAU,QAAQ,IAAA,EAAM,CAAC,GAAG,OAAO,CAAA;AAEnE,EAAA,OAAO,EAAE,YAAA,EAAc,MAAA,EAAQ,QAAA,EAAS;AAC1C;ACpPA,IAAI,YAAA,GAA8B,IAAA;AAElC,IAAM,gBAAA,GAAmB,0EAAA;AAKlB,SAAS,oBAAA,GAAsC;AACpD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMC,sBAAA,CAAc,2PAAe,CAAA;AACzC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,CAAQ,WAAW,CAAA;AACzC,IAAA,MAAM,GAAA,GAAWC,yBAAQ,SAAS,CAAA;AAClC,IAAA,MAAM,OAAA,GAAeA,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,kBAAkB,CAAA;AACjD,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,OAAO,CAAA,EAAG;AAC1B,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,MAAM,UAAA,GAAa;AAAA,IACZD,sBAAK,OAAA,CAAQ,GAAA,IAAO,cAAA,EAAgB,WAAA,EAAa,QAAQ,kBAAkB,CAAA;AAAA,IAC3EA,gBAAA,CAAA,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,YAAY,MAAA,EAAQ,cAAA,EAAgB,WAAA,EAAa,MAAA,EAAQ,kBAAkB;AAAA,GACtG;AAEA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC5B,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,kBAAA,GAA6B;AAC3C,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAa,oBAAA,EAAqB;AACxC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAI;AACF,MAAA,YAAA,GAAkBA,cAAA,CAAA,YAAA,CAAa,YAAY,OAAO,CAAA;AAClD,MAAA,OAAO,YAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,YAAA,GAAe,CAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAIF,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA,KAAA,CAAA;AAM7B,EAAA,OAAO,YAAA;AACT;ACjCO,SAAS,kBAAA,CAAmB,OAAA,GAAkB,OAAA,CAAQ,GAAA,EAAI,EAAwB;AACvF,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,EAAE,OAAA,EAAS,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,EAAE,OAAA,EAAS,CAAA;AAE5C,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA+B;AACnD,EAAA,MAAM,QAA6B,EAAC;AACpC,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAC,CAAA;AAE/D,EAAA,SAAS,QAAQ,CAAA,EAAsB;AACrC,IAAA,MAAM,GAAA,GAAM,GAAG,CAAA,CAAE,MAAM,KAAK,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,QAAQ,CAAA,CAAA;AAClD,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG;AACxB,MAAA,UAAA,CAAW,IAAI,GAAG,CAAA;AAClB,MAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACd;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,MAAA,EAAQ;AAC3B,IAAA,YAAA,CAAa,GAAA,CAAI,EAAE,QAAQ,CAAA;AAAA,EAC7B;AAaA,EAAA,MAAM,mBAAA,uBAA0B,GAAA,EAA6B;AAC7D,EAAA,MAAM,YAAA,GAAe,CAAC,SAAA,EAAW,cAAA,EAAgB,SAAS,UAAU,CAAA;AACpE,EAAA,KAAA,MAAW,WAAW,YAAA,EAAc;AAClC,IAAA,MAAM,WAAA,GAAmBC,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA;AAC9C,IAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,WAAW,CAAA,EAAG;AAC5B,MAAA,MAAM,KAAA,GAAQ,YAAY,WAAW,CAAA;AACrC,MAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,QAAA,IAAI;AACF,UAAA,MAAM,WAAA,GAAiBA,cAAA,CAAA,YAAA,CAAa,CAAA,EAAG,OAAO,CAAA;AAC9C,UAAA,MAAM,UAAeD,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,CAAC,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC5D,UAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,6BAA6B,CAAA;AAC7D,UAAA,IAAI,CAAC,KAAA,EAAO;AACZ,UAAA,IAAI,KAA0B,EAAC;AAC/B,UAAA,IAAI;AACF,YAAA,EAAA,GAAMvE,uBAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,KAA6B,EAAC;AAAA,UACxD,CAAA,CAAA,MAAQ;AACN,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,EAAA,GAAK,OAAO,EAAA,CAAG,EAAA,KAAO,WAAW,EAAA,CAAG,EAAA,CAAG,MAAK,GAAI,KAAA,CAAA;AACtD,UAAA,IAAI,CAAC,EAAA,EAAI;AAET,UAAA,IAAI,IAAA,GAAO,OAAO,EAAA,CAAG,IAAA,KAAS,WAAW,EAAA,CAAG,IAAA,CAAK,MAAK,GAAI,EAAA;AAC1D,UAAA,IAAI,KAAA,GAAwB,SAAA;AAE5B,UAAA,IAAI,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,IAAK,SAAS,SAAA,EAAW;AAC/C,YAAA,IAAA,GAAO,SAAA;AACP,YAAA,KAAA,GAAQ,SAAA;AAAA,UACV,WAAW,EAAA,CAAG,UAAA,CAAW,aAAa,CAAA,IAAK,SAAS,cAAA,EAAgB;AAClE,YAAA,IAAA,GAAO,cAAA;AACP,YAAA,KAAA,GAAQ,SAAA;AAAA,UACV,WAAW,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,IAAK,SAAS,OAAA,EAAS;AACpD,YAAA,IAAA,GAAO,OAAA;AACP,YAAA,KAAA,GAAQ,SAAA;AAAA,UACV,CAAA,MAAA,IAAW,GAAG,UAAA,CAAW,KAAK,KAAK,IAAA,KAAS,UAAA,IAAc,SAAS,SAAA,EAAW;AAC5E,YAAA,IAAA,GAAO,UAAA;AACP,YAAA,KAAA,GAAQ,SAAA;AAAA,UACV,CAAA,MAAA,IAAW,GAAG,UAAA,CAAW,KAAK,KAAK,IAAA,KAAS,eAAA,IAAmB,SAAS,MAAA,EAAQ;AAC9E,YAAA,IAAA,GAAO,eAAA;AACP,YAAA,KAAA,GAAQ,SAAA;AAAA,UACV,WAAW,EAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,IAAK,SAAS,YAAA,EAAc;AAC3D,YAAA,IAAA,GAAO,YAAA;AACP,YAAA,KAAA,GAAQ,SAAA;AAAA,UACV,WAAW,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,IAAK,SAAS,QAAA,EAAU;AACrD,YAAA,IAAA,GAAO,QAAA;AACP,YAAA,KAAA,GAAQ,SAAA;AAAA,UACV,WAAW,EAAA,CAAG,UAAA,CAAW,UAAU,CAAA,IAAK,SAAS,kBAAA,EAAoB;AACnE,YAAA,IAAA,GAAO,kBAAA;AACP,YAAA,KAAA,GAAQ,cAAA;AAAA,UACV,WAAW,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,IAAK,SAAS,WAAA,EAAa;AACxD,YAAA,IAAA,GAAO,WAAA;AACP,YAAA,KAAA,GAAQ,cAAA;AAAA,UACV,CAAA,MAAA,IAAW,GAAG,UAAA,CAAW,MAAM,KAAK,IAAA,KAAS,8BAAA,IAAkC,SAAS,KAAA,EAAO;AAC7F,YAAA,IAAA,GAAO,KAAA;AACP,YAAA,KAAA,GAAQ,cAAA;AAAA,UACV,WAAW,EAAA,CAAG,UAAA,CAAW,UAAU,CAAA,IAAK,SAAS,sBAAA,EAAwB;AACvE,YAAA,IAAA,GAAO,sBAAA;AACP,YAAA,KAAA,GAAQ,aAAA;AAAA,UACV,CAAA,MAAA,IAAW,EAAA,CAAG,UAAA,CAAW,KAAK,KAAK,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,IAAK,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,IAAK,SAAS,aAAA,EAAe;AAC1G,YAAA,IAAA,GAAO,aAAA;AACP,YAAA,KAAA,GAAQ,aAAA;AAAA,UACV,CAAA,MAAO;AACL,YAAA,IAAA,GAAO,IAAA,IAAQ,SAAA;AACf,YAAA,KAAA,GAAQ,SAAA;AAAA,UACV;AAEA,UAAA,MAAM,KAAA,GAAQ,OAAO,EAAA,CAAG,KAAA,KAAU,WAAW,EAAA,CAAG,KAAA,CAAM,MAAK,GAAI,EAAA;AAC/D,UAAA,MAAM,UAAU,WAAA,CAAY,OAAA,CAAQ,2BAAA,EAA6B,EAAE,EAAE,IAAA,EAAK;AAE1E,UAAA,mBAAA,CAAoB,IAAI,EAAA,EAAI;AAAA,YAC1B,EAAA;AAAA,YACA,IAAA;AAAA,YACA,KAAA;AAAA,YACA,KAAA;AAAA,YACA,QAAA,EAAU,OAAA;AAAA,YACV,OAAA;AAAA,YACA,WAAA,EAAa;AAAA,WACd,CAAA;AAAA,QACH,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGF,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,IAAA,EAAM;AAC1B,IAAA,MAAM,QACH,CAAA,CAAE,aAAA,KAAkB,WAAA,IAAe,CAAA,CAAE,kBAAkB,UAAA,MACvD,CAAA,CAAE,UAAA,KAAe,WAAA,IAAe,EAAE,UAAA,KAAe,UAAA,CAAA,KACjD,EAAE,UAAA,KAAe,WAAA,IAAe,EAAE,UAAA,KAAe,UAAA,CAAA;AACpD,IAAA,MAAM,MAAA,GAA0B,OAAO,WAAA,GAAc,QAAA;AACrD,IAAA,MAAM,OAAA,GAAU,EAAE,EAAA,CAAG,UAAA,CAAW,UAAU,CAAA,GAAI,sBAAA,GAA0B,EAAE,IAAA,IAAQ,aAAA;AAElF,IAAA,OAAA,CAAQ,GAAA,CAAI,EAAE,EAAA,EAAI;AAAA,MAChB,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,OAAO,CAAA,CAAE,EAAA;AAAA,MACT,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,aAAA;AAAA,MACP,MAAA;AAAA,MACA,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,OAAA,EAAS;AAAA,QACP,eAAe,CAAA,CAAE,aAAA;AAAA,QACjB,YAAY,CAAA,CAAE,UAAA;AAAA,QACd,YAAY,CAAA,CAAE,UAAA;AAAA,QACd,OAAO,CAAA,CAAE;AAAA,OACX;AAAA,MACA,QAAA,EAAU,CAAA,CAAE,aAAA,CAAc,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,MACxE,UAAA,EAAY;AAAA,QACV,GAAG,CAAA,CAAE,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,QAC9D,GAAG,CAAA,CAAE,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO;AAAA;AAChE,KACD,CAAA;AAGD,IAAA,KAAA,MAAW,EAAA,IAAM,CAAA,CAAE,aAAA,CAAc,KAAA,CAAM,GAAG,CAAA,EAAG;AAC3C,MAAA,MAAM,CAAA,GAAI,GAAG,IAAA,EAAK;AAClB,MAAA,IAAI,CAAA,IAAK,CAAA,KAAM,SAAA,IAAa,CAAA,KAAM,MAAA,EAAQ;AACxC,QAAA,MAAM,OAAA,GAAU,CAAA,CAAE,UAAA,CAAW,QAAQ,CAAA;AACrC,QAAA,OAAA,CAAQ;AAAA,UACN,EAAA,EAAI,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAA,EAAI,EAAE,EAAE,CAAA,CAAA;AAAA,UACrB,MAAA,EAAQ,CAAA;AAAA,UACR,QAAQ,CAAA,CAAE,EAAA;AAAA,UACV,KAAA,EAAO,UAAU,cAAA,GAAiB,cAAA;AAAA,UAClC,QAAA,EAAU,UAAU,cAAA,GAAiB,cAAA;AAAA,UACrC;AAAA,SACD,CAAA;AACD,QAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG;AACnB,UAAA,MAAM,MAAA,GAAS,EAAE,UAAA,CAAW,MAAM,IAAI,OAAA,GAAU,CAAA,CAAE,WAAW,KAAK,CAAA,GAAI,aAAa,CAAA,CAAE,UAAA,CAAW,KAAK,CAAA,GAAI,eAAA,GAAkB,EAAE,UAAA,CAAW,QAAQ,IAAI,YAAA,GAAe,SAAA;AACnK,UAAA,OAAA,CAAQ,IAAI,CAAA,EAAG;AAAA,YACb,EAAA,EAAI,CAAA;AAAA,YACJ,KAAA,EAAO,CAAA;AAAA,YACP,KAAA,EAAO,CAAA;AAAA,YACP,IAAA,EAAM,MAAA;AAAA,YACN,KAAA,EAAO,SAAA;AAAA,YACP,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,IAAA,IAAQ,CAAA,CAAE,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,EAAG;AAC1C,MAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,MAAA,IAAI,CAAA,IAAK,CAAA,KAAM,SAAA,IAAa,CAAA,KAAM,MAAA,EAAQ;AACxC,QAAA,OAAA,CAAQ;AAAA,UACN,EAAA,EAAI,CAAA,KAAA,EAAQ,CAAA,CAAE,EAAE,IAAI,CAAC,CAAA,CAAA;AAAA,UACrB,QAAQ,CAAA,CAAE,EAAA;AAAA,UACV,MAAA,EAAQ,CAAA;AAAA,UACR,KAAA,EAAO,WAAA;AAAA,UACP,QAAA,EAAU,WAAA;AAAA,UACV;AAAA,SACD,CAAA;AACD,QAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG;AACnB,UAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,UAAA,CAAW,MAAM,IAAI,WAAA,GAAc,CAAA,CAAE,UAAA,CAAW,MAAM,IAAI,KAAA,GAAQ,CAAA,CAAE,UAAA,CAAW,UAAU,IAAI,kBAAA,GAAqB,cAAA;AAClI,UAAA,OAAA,CAAQ,IAAI,CAAA,EAAG;AAAA,YACb,EAAA,EAAI,CAAA;AAAA,YACJ,KAAA,EAAO,CAAA;AAAA,YACP,KAAA,EAAO,CAAA;AAAA,YACP,IAAA,EAAM,KAAA;AAAA,YACN,KAAA,EAAO,cAAA;AAAA,YACP,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,GAAA,IAAO,CAAA,CAAE,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,EAAG;AACzC,MAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,MAAA,IAAI,CAAA,IAAK,CAAA,KAAM,SAAA,IAAa,CAAA,KAAM,MAAA,EAAQ;AACxC,QAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,CAAQ,iBAAA,EAAmB,GAAG,CAAA;AAC/C,QAAA,OAAA,CAAQ;AAAA,UACN,EAAA,EAAI,CAAA,KAAA,EAAQ,CAAA,CAAE,EAAE,IAAI,MAAM,CAAA,CAAA;AAAA,UAC1B,QAAQ,CAAA,CAAE,EAAA;AAAA,UACV,MAAA,EAAQ,MAAA;AAAA,UACR,KAAA,EAAO,aAAA;AAAA,UACP,QAAA,EAAU,aAAA;AAAA,UACV;AAAA,SACD,CAAA;AACD,QAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AACxB,UAAA,IAAI,WAAA,GAAc,MAAA;AAClB,UAAA,MAAM,eAAoBuE,gBAAA,CAAA,UAAA,CAAW,CAAC,IAAI,CAAA,GAASA,gBAAA,CAAA,IAAA,CAAK,SAAS,CAAC,CAAA;AAClE,UAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,YAAY,CAAA,EAAG;AAC/B,YAAA,IAAI;AACF,cAAA,WAAA,GAAiBA,cAAA,CAAA,YAAA,CAAa,cAAc,OAAO,CAAA;AAAA,YACrD,CAAA,CAAA,MAAQ;AAAA,YAAC;AAAA,UACX;AACA,UAAA,OAAA,CAAQ,IAAI,MAAA,EAAQ;AAAA,YAClB,EAAA,EAAI,MAAA;AAAA,YACJ,KAAA,EAAYD,0BAAS,CAAC,CAAA;AAAA,YACtB,KAAA,EAAO,CAAA;AAAA,YACP,IAAA,EAAM,CAAA,CAAE,QAAA,CAAS,UAAU,IAAI,aAAA,GAAgB,WAAA;AAAA,YAC/C,KAAA,EAAO,MAAA;AAAA,YACP,MAAA,EAAQ,WAAA;AAAA,YACR,QAAA,EAAU,CAAA;AAAA,YACV,OAAA,EAAS,cAAc,KAAA,IAAS,CAAA,CAAE,SAAS,UAAU,CAAA,GAAI,YAAY,YAAA,CAAA,GAAgB,IAAA,GAAO,YAAY,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA,IAAK,WAAA,CAAY,SAAS,IAAA,GAAO,mBAAA,GAAsB,MAAM,OAAA,GAAU;AAAA,WACjM,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,GAAA,IAAO,mBAAA,CAAoB,MAAA,EAAO,EAAG;AAC9C,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,EAAA,EAAI;AAAA,QAClB,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,OAAO,GAAA,CAAI,EAAA;AAAA,QACX,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,MAAA,EAAQ,WAAA;AAAA,QACR,UAAU,GAAA,CAAI,QAAA;AAAA,QACd,SAAS,GAAA,CAAI;AAAA,OACd,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AAC5B,MAAA,IAAI,CAAC,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,WAAW,GAAA,CAAI,QAAA;AAClC,MAAA,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAA,KAAU,CAAA,CAAE,EAAA,KAAO,GAAA,CAAI,KAAA,EAAO,CAAA,CAAE,KAAA,GAAQ,GAAA,CAAI,KAAA;AAC/D,MAAA,IAAI,CAAC,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,UAAU,GAAA,CAAI,OAAA;AAChC,MAAA,IAAI,IAAI,IAAA,KAAS,CAAC,CAAA,CAAE,IAAA,IAAQ,EAAE,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,IAAA,KAAS,kBAAkB,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,SAAS,MAAA,CAAA,EAAS;AAC3H,QAAA,CAAA,CAAE,OAAO,GAAA,CAAI,IAAA;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,GAAA,IAAO,mBAAA,CAAoB,MAAA,EAAO,EAAG;AAC9C,IAAA,MAAM,KAAK,GAAA,CAAI,WAAA;AAEf,IAAA,IAAI,GAAA,CAAI,SAAS,SAAA,EAAW;AAE1B,MAAA,MAAM,OAAA,GAAU,OAAO,EAAA,CAAG,OAAA,KAAY,QAAA,GAAW,EAAA,CAAG,OAAA,GAAW,OAAO,EAAA,CAAG,KAAA,KAAU,QAAA,GAAW,EAAA,CAAG,KAAA,GAAQ,MAAA;AACzG,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACzB,UAAA,OAAA,CAAQ,IAAI,OAAA,EAAS;AAAA,YACnB,EAAA,EAAI,OAAA;AAAA,YACJ,KAAA,EAAO,OAAA;AAAA,YACP,KAAA,EAAO,OAAA;AAAA,YACP,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO,SAAA;AAAA,YACP,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AACA,QAAA,OAAA,CAAQ;AAAA,UACN,EAAA,EAAI,CAAA,KAAA,EAAQ,OAAO,CAAA,CAAA,EAAI,IAAI,EAAE,CAAA,CAAA;AAAA,UAC7B,MAAA,EAAQ,OAAA;AAAA,UACR,QAAQ,GAAA,CAAI,EAAA;AAAA,UACZ,KAAA,EAAO,SAAA;AAAA,UACP,QAAA,EAAU,SAAA;AAAA,UACV,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,GAAG,mBAAmB,CAAC,IAAI,EAAA,CAAG,mBAAmB,IAAK,KAAA,CAAM,OAAA,CAAQ,GAAG,WAAW,CAAC,IAAI,EAAA,CAAG,WAAW,IAAI,EAAC;AAC3I,MAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,QAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,MAAK,EAAG;AAC3C,UAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,UAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG;AACnB,YAAA,OAAA,CAAQ,IAAI,CAAA,EAAG;AAAA,cACb,EAAA,EAAI,CAAA;AAAA,cACJ,KAAA,EAAO,CAAA;AAAA,cACP,KAAA,EAAO,CAAA;AAAA,cACP,IAAA,EAAM,UAAA;AAAA,cACN,KAAA,EAAO,SAAA;AAAA,cACP,MAAA,EAAQ;AAAA,aACT,CAAA;AAAA,UACH;AACA,UAAA,OAAA,CAAQ;AAAA,YACN,EAAA,EAAI,CAAA,KAAA,EAAQ,GAAA,CAAI,EAAE,IAAI,CAAC,CAAA,CAAA;AAAA,YACvB,QAAQ,GAAA,CAAI,EAAA;AAAA,YACZ,MAAA,EAAQ,CAAA;AAAA,YACR,KAAA,EAAO,iBAAA;AAAA,YACP,QAAA,EAAU,iBAAA;AAAA,YACV,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,UAAA,EAAY;AAElC,MAAA,MAAM,YAAA,GAAe,OAAO,EAAA,CAAG,eAAe,MAAM,QAAA,GAAW,EAAA,CAAG,eAAe,CAAA,GAAK,OAAO,EAAA,CAAG,KAAA,KAAU,QAAA,GAAW,GAAG,KAAA,GAAQ,MAAA;AAChI,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,EAAG;AAC9B,UAAA,OAAA,CAAQ,IAAI,YAAA,EAAc;AAAA,YACxB,EAAA,EAAI,YAAA;AAAA,YACJ,KAAA,EAAO,YAAA;AAAA,YACP,KAAA,EAAO,YAAA;AAAA,YACP,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO,SAAA;AAAA,YACP,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AACA,QAAA,OAAA,CAAQ;AAAA,UACN,EAAA,EAAI,CAAA,KAAA,EAAQ,YAAY,CAAA,CAAA,EAAI,IAAI,EAAE,CAAA,CAAA;AAAA,UAClC,MAAA,EAAQ,YAAA;AAAA,UACR,QAAQ,GAAA,CAAI,EAAA;AAAA,UACZ,KAAA,EAAO,WAAA;AAAA,UACP,QAAA,EAAU,WAAA;AAAA,UACV,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,aAAa,CAAC,CAAA,GAAI,EAAA,CAAG,aAAa,CAAA,GAAI,EAAC;AAC3E,MAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,QAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,MAAK,EAAG;AAC/C,UAAA,MAAM,CAAA,GAAI,OAAO,IAAA,EAAK;AACtB,UAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG;AACnB,YAAA,OAAA,CAAQ,IAAI,CAAA,EAAG;AAAA,cACb,EAAA,EAAI,CAAA;AAAA,cACJ,KAAA,EAAO,CAAA;AAAA,cACP,KAAA,EAAO,CAAA;AAAA,cACP,IAAA,EAAM,eAAA;AAAA,cACN,KAAA,EAAO,SAAA;AAAA,cACP,MAAA,EAAQ;AAAA,aACT,CAAA;AAAA,UACH;AACA,UAAA,OAAA,CAAQ;AAAA,YACN,EAAA,EAAI,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAA,EAAI,IAAI,EAAE,CAAA,CAAA;AAAA,YACvB,MAAA,EAAQ,CAAA;AAAA,YACR,QAAQ,GAAA,CAAI,EAAA;AAAA,YACZ,KAAA,EAAO,SAAA;AAAA,YACP,QAAA,EAAU,SAAA;AAAA,YACV,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,eAAA,EAAiB;AACvC,MAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,SAAS,CAAC,CAAA,GAC9C,EAAA,CAAG,SAAS,CAAA,GACZ,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,YAAY,CAAC,CAAA,GAC9B,EAAA,CAAG,YAAY,CAAA,GACf,OAAO,EAAA,CAAG,SAAS,CAAA,KAAM,QAAA,GACzB,CAAC,EAAA,CAAG,SAAS,CAAC,IACd,EAAC;AACL,MAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,QAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,MAAK,EAAG;AACzC,UAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,UAAA,OAAA,CAAQ;AAAA,YACN,EAAA,EAAI,CAAA,KAAA,EAAQ,GAAA,CAAI,EAAE,IAAI,CAAC,CAAA,CAAA;AAAA,YACvB,QAAQ,GAAA,CAAI,EAAA;AAAA,YACZ,MAAA,EAAQ,CAAA;AAAA,YACR,KAAA,EAAO,SAAA;AAAA,YACP,QAAA,EAAU,SAAA;AAAA,YACV,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AAEpC,MAAA,MAAM,WAAA,GACJ,OAAO,EAAA,CAAG,sBAAsB,MAAM,QAAA,GAClC,EAAA,CAAG,sBAAsB,CAAA,GACzB,OAAO,EAAA,CAAG,cAAc,CAAA,KAAM,QAAA,GAC9B,GAAG,cAAc,CAAA,GACjB,OAAO,EAAA,CAAG,KAAA,KAAU,QAAA,GACpB,EAAA,CAAG,KAAA,GACH,MAAA;AACN,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,EAAG;AAC7B,UAAA,OAAA,CAAQ,IAAI,WAAA,EAAa;AAAA,YACvB,EAAA,EAAI,WAAA;AAAA,YACJ,KAAA,EAAO,WAAA;AAAA,YACP,KAAA,EAAO,WAAA;AAAA,YACP,IAAA,EAAM,cAAA;AAAA,YACN,KAAA,EAAO,SAAA;AAAA,YACP,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AACA,QAAA,OAAA,CAAQ;AAAA,UACN,EAAA,EAAI,CAAA,KAAA,EAAQ,WAAW,CAAA,CAAA,EAAI,IAAI,EAAE,CAAA,CAAA;AAAA,UACjC,MAAA,EAAQ,WAAA;AAAA,UACR,QAAQ,GAAA,CAAI,EAAA;AAAA,UACZ,KAAA,EAAO,WAAA;AAAA,UACP,QAAA,EAAU,WAAA;AAAA,UACV,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,UAAA,GAAa,EAAA,CAAG,kBAAkB,CAAA,GACpC,CAAC,EAAA,CAAG,kBAAkB,CAAC,CAAA,GACvB,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,mBAAmB,CAAC,CAAA,GACrC,EAAA,CAAG,mBAAmB,CAAA,GACtB,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,SAAS,CAAC,CAAA,GAC3B,EAAA,CAAG,SAAS,CAAA,GACZ,EAAC;AACL,MAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,QAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,MAAK,EAAG;AACzC,UAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,UAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG;AAClB,YAAA,OAAA,CAAQ;AAAA,cACN,EAAA,EAAI,CAAA,KAAA,EAAQ,GAAA,CAAI,EAAE,IAAI,CAAC,CAAA,CAAA;AAAA,cACvB,QAAQ,GAAA,CAAI,EAAA;AAAA,cACZ,MAAA,EAAQ,CAAA;AAAA,cACR,KAAA,EAAO,SAAA;AAAA,cACP,QAAA,EAAU,SAAA;AAAA,cACV,MAAA,EAAQ;AAAA,aACT,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAGA,MAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,EAAA,CAAG,cAAc,CAAC,CAAA,GAChD,GAAG,cAAc,CAAA,GACjB,OAAO,EAAA,CAAG,cAAc,MAAM,QAAA,GAC9B,CAAC,GAAG,cAAc,CAAC,IACnB,EAAC;AACL,MAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,QAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,MAAK,EAAG;AAC/C,UAAA,MAAM,CAAA,GAAI,OAAO,IAAA,EAAK;AACtB,UAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG;AACnB,YAAA,OAAA,CAAQ,IAAI,CAAA,EAAG;AAAA,cACb,EAAA,EAAI,CAAA;AAAA,cACJ,KAAA,EAAO,CAAA;AAAA,cACP,KAAA,EAAO,CAAA;AAAA,cACP,IAAA,EAAM,CAAA,CAAE,UAAA,CAAW,UAAU,IAAI,sBAAA,GAAyB,aAAA;AAAA,cAC1D,KAAA,EAAO,aAAA;AAAA,cACP,MAAA,EAAQ;AAAA,aACT,CAAA;AAAA,UACH;AACA,UAAA,OAAA,CAAQ;AAAA,YACN,EAAA,EAAI,CAAA,KAAA,EAAQ,GAAA,CAAI,EAAE,IAAI,CAAC,CAAA,CAAA;AAAA,YACvB,QAAQ,GAAA,CAAI,EAAA;AAAA,YACZ,MAAA,EAAQ,CAAA;AAAA,YACR,KAAA,EAAO,cAAA;AAAA,YACP,QAAA,EAAU,cAAA;AAAA,YACV,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,WAAW,GAAA,CAAI,IAAA,KAAS,aAAA,IAAiB,GAAA,CAAI,SAAS,sBAAA,EAAwB;AAE5E,MAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,EAAA,CAAG,sBAAsB,CAAC,CAAA,GAAI,GAAG,sBAAsB,CAAA,GAAK,OAAO,EAAA,CAAG,sBAAsB,MAAM,QAAA,GAAW,CAAC,GAAG,sBAAsB,CAAC,IAAI,EAAC;AAC7K,MAAA,KAAA,MAAW,WAAW,SAAA,EAAW;AAC/B,QAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,CAAQ,MAAK,EAAG;AACjD,UAAA,MAAM,EAAA,GAAK,QAAQ,IAAA,EAAK;AACxB,UAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AACpB,YAAA,OAAA,CAAQ,IAAI,EAAA,EAAI;AAAA,cACd,EAAA,EAAI,EAAA;AAAA,cACJ,KAAA,EAAO,EAAA;AAAA,cACP,KAAA,EAAO,EAAA;AAAA,cACP,IAAA,EAAM,YAAA;AAAA,cACN,KAAA,EAAO,SAAA;AAAA,cACP,MAAA,EAAQ;AAAA,aACT,CAAA;AAAA,UACH;AACA,UAAA,OAAA,CAAQ;AAAA,YACN,EAAA,EAAI,CAAA,KAAA,EAAQ,EAAE,CAAA,CAAA,EAAI,IAAI,EAAE,CAAA,CAAA;AAAA,YACxB,MAAA,EAAQ,EAAA;AAAA,YACR,QAAQ,GAAA,CAAI,EAAA;AAAA,YACZ,KAAA,EAAO,cAAA;AAAA,YACP,QAAA,EAAU,cAAA;AAAA,YACV,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,IAAI,CAAA,IAAK,OAAA,CAAQ,SAAQ,EAAG;AAC1C,IAAA,IAAI,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA,EAAG;AACxB,MAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AAAA,IAChB;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA;AACpC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,EAAC;AAC5C,MAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG;AAC1C,QAAA,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,CAAA,CAAE,MAAM,CAAA;AAAA,MAClC;AAAA,IACF;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,EAAC;AACxC,MAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG;AACxC,QAAA,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAA,CAAE,MAAM,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAA+C;AAAA,IACnD,OAAA,EAAS,CAAA;AAAA,IACT,WAAA,EAAa,CAAA;AAAA,IACb,YAAA,EAAc,CAAA;AAAA,IACd,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,MAAM,WAA+B,EAAC;AAEtC,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAChC,IAAA,YAAA,CAAa,EAAE,KAAK,CAAA,GAAA,CAAK,aAAa,CAAA,CAAE,KAAK,KAAK,CAAA,IAAK,CAAA;AACvD,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,WAAA,IAAe,CAAA,CAAE,WAAW,UAAA,EAAY;AACvD,MAAA,eAAA,EAAA;AAAA,IACF,CAAA,MAAO;AACL,MAAA,UAAA,EAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA,MACN,OAAA,EAAS,CAAA,MAAA,EAAS,CAAA,CAAE,KAAK,CAAA,MAAA,EAAS,CAAA,CAAE,IAAI,CAAA,QAAA,EAAW,CAAA,CAAE,MAAA,CAAO,WAAA,EAAa,CAAA;AAAA,KAC1E,CAAA;AAAA,EACH;AAEA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA,MACN,OAAA,EAAS,YAAY,CAAA,CAAE,QAAQ,WAAW,CAAA,CAAE,MAAA,EAAQ,WAAA,EAAY,IAAK,WAAW,CAAA;AAAA,KACjF,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,YAAA,EAAc,eAAA,EAAiB,UAAA,EAAW;AAC/D;AAKO,SAAS,sBAAsB,OAAA,EAA2C;AAC/E,EAAA,MAAM,WAAA,GAAmBA,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,SAAA,EAAW,UAAU,CAAA;AAC5D,EAAA,MAAM,QAAkC,EAAC;AAEzC,EAAA,IAAOC,cAAA,CAAA,UAAA,CAAW,WAAW,CAAA,EAAG;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAWA,cAAA,CAAA,WAAA,CAAY,WAAW,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,YAAY,CAAC,CAAA;AAChF,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,QAAA,GAAgBD,gBAAA,CAAA,IAAA,CAAK,WAAA,EAAa,IAAI,CAAA;AAC5C,QAAA,MAAM,OAAA,GAAaC,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AACjD,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,IAAI,MAAA,CAAO,aAAA;AAAA,UACX,OAAO,MAAA,CAAO,aAAA;AAAA,UACd,WAAW,MAAA,CAAO,WAAA;AAAA,UAClB,MAAM,MAAA,CAAO,SAAA;AAAA,UACb,SAAS,MAAA,CAAO,YAAA;AAAA,UAChB,MAAM,MAAA,CAAO,SAAA;AAAA,UACb,eAAe,MAAA,CAAO,mBAAA;AAAA,UACtB,eAAe,MAAA,CAAO,iBAAA;AAAA,UACtB,SAAS,MAAA,CAAO;AAAA,SACjB,CAAA;AAAA,MACH;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,OAAO,MAAM,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,IAAI,KAAK,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,KAAY,IAAI,IAAA,CAAK,EAAE,SAAS,CAAA,CAAE,SAAS,CAAA;AAC/F;AAKO,SAAS,wBAAwB,OAAA,EAAiB;AACvD,EAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,EAAE,OAAA,EAAS,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,EAAE,OAAA,EAAS,CAAA;AAC7C,EAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,EAAE,OAAA,EAAS,CAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,EAAE,OAAA,EAAS,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,sBAAsB,OAAO,CAAA;AAE7C,EAAA,IAAI,WAAA,GAAc,IAAA;AAClB,EAAA,IAAI,YAAA,GAAe,MAAA;AACnB,EAAA,IAAI;AACF,IAAA,IAAI;AACF,MAAA,YAAA,GAAepB,2BAAa,KAAA,EAAO,CAAC,WAAA,EAAa,cAAA,EAAgB,MAAM,CAAA,EAAG;AAAA,QACxE,GAAA,EAAK,OAAA;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,OAC/B,EAAE,IAAA,EAAK;AAAA,IACV,CAAA,CAAA,MAAQ;AACN,MAAA,YAAA,GAAe,MAAA;AAAA,IACjB;AAEA,IAAA,MAAM,eAAA,GAAkB,YAAA,KAAiB,MAAA,IAAU,YAAA,KAAiB,QAAA;AACpE,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,IAAI,IAAA,GAAO,SAAA;AACX,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,QAAA;AAAA,UACZA,2BAAa,KAAA,EAAO,CAAC,UAAA,EAAY,SAAA,EAAW,MAAM,CAAA,EAAG;AAAA,YACnD,GAAA,EAAK,OAAA;AAAA,YACL,QAAA,EAAU,OAAA;AAAA,YACV,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,WAC/B,EAAE,IAAA,EAAK;AAAA,UACR;AAAA,SACF;AACA,QAAA,IAAI,SAAS,EAAA,EAAI;AACf,UAAA,MAAM,aAAaA,0BAAAA,CAAa,KAAA,EAAO,CAAC,UAAA,EAAY,iBAAA,EAAmB,MAAM,CAAA,EAAG;AAAA,YAC9E,GAAA,EAAK,OAAA;AAAA,YACL,QAAA,EAAU,OAAA;AAAA,YACV,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,WAC/B,CAAA,CAAE,IAAA,GAAO,KAAA,CAAM,IAAI,EAAE,CAAC,CAAA;AACvB,UAAA,IAAA,GAAO,UAAA;AAAA,QACT;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,IAAA,GAAO,QAAA;AAAA,MACT;AACA,MAAA,WAAA,GAAc,gBAAgB,IAAA,EAAM,MAAA,EAAQ,EAAE,GAAA,EAAK,SAAS,CAAA;AAAA,IAC9D,CAAA,MAAO;AACL,MAAA,WAAA,GAAc,gBAAgB,MAAA,EAAQ,MAAA,EAAQ,EAAE,GAAA,EAAK,SAAS,CAAA;AAC9D,MAAA,IAAI,WAAA,CAAY,iBAAiB,CAAA,EAAG;AAClC,QAAA,IAAI;AACF,UAAA,WAAA,GAAc,gBAAgB,QAAA,EAAU,MAAA,EAAQ,EAAE,GAAA,EAAK,SAAS,CAAA;AAAA,QAClE,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,YAAA,GAAe,wBAAwB,OAAO,CAAA;AAEpD,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,OAAO,IACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,MAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,EACpB,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC1B;AAEA,SAAS,0BACP,IAAA,EACA,UAAA,EACA,OACA,eAAA,EACA,QAAA,GAAkB,EAAC,EACX;AACR,EAAA,MAAM,SAAA,GAAA,CAAa,QAAA,IAAY,EAAC,EAAG,MAAA;AAAA,IACjC,CAAC,CAAA,KAAA,CAAY,CAAA,CAAE,MAAM,YAAA,IAAgB,EAAA,EAAI,aAAY,KAAM;AAAA,GAC7D;AACA,EAAA,MAAM,YAAY,SAAA,CAAU,MAAA;AAAA,IAC1B,CAAC,CAAA,KAAA,CAAY,CAAA,CAAE,MAAM,MAAA,IAAU,EAAA,EAAI,aAAY,KAAM;AAAA,GACvD,CAAE,MAAA;AACF,EAAA,MAAM,cAAc,SAAA,CAAU,MAAA;AAAA,IAC5B,CAAC,CAAA,KAAA,CAAY,CAAA,CAAE,MAAM,MAAA,IAAU,EAAA,EAAI,aAAY,KAAM;AAAA,GACvD,CAAE,MAAA;AAEF,EAAA,OAAO;AAAA,uDAAA,EACgD,IAAI,2DAA2D,IAAI,CAAA;AAAA;AAAA,0DAAA,EAEhE,IAAI,CAAA;AAAA,cAAA,EAChD,IAAI,CAAA;AAAA;AAAA;AAAA,UAAA,EAGR,UAAU,CAAA;AAAA,kBAAA,EACF,KAAK,CAAA;AAAA,UAAA,EACb,eAAe,CAAA;AAAA;AAAA,sBAAA,EAEH,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAAA,EAKU,IAAI,CAAA;AAAA,qEAAA,EAC6B,UAAU,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA,6EAAA,EAIR,IAAI,CAAA,oCAAA,EAAuC,IAAI,CAAA,yBAAA,EAA4B,UAAU,MAAM,CAAA;AAAA,sEAAA,EAClG,IAAI,CAAA,qCAAA,EAAwC,IAAI,CAAA,6BAAA,EAAgC,SAAS,CAAA;AAAA,sEAAA,EACzF,IAAI,CAAA,uCAAA,EAA0C,IAAI,CAAA,+BAAA,EAAkC,WAAW,CAAA;AAAA;AAAA;AAAA,UAAA,EAG3J,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA;AAAA,qDAAA,EAEkB,IAAI,CAAA;AAAA;AAAA,UAAA,CAAA,GAE7C;AAAA,+BAAA,EACmB,IAAI,CAAA;AAAA;AAAA;AAAA,wDAAA,EAGqB,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAY9C,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAW;AAC1B,IAAA,MAAM,SAAA,GAAA,CAAa,CAAA,CAAE,IAAA,IAAQ,EAAA,EAAI,OAAA,CAAQ,OAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AACxE,IAAA,MAAM,SAAA,GAAA,CAAa,CAAA,CAAE,IAAA,EAAM,MAAA,IAAU,WAAW,WAAA,EAAY;AAC5D,IAAA,MAAM,WAAW,SAAA,KAAc,WAAA;AAC/B,IAAA,MAAM,SAAS,CAAC,QAAA;AAChB,IAAA,IAAI,UAAA,GAAa,aAAA;AACjB,IAAA,IAAI,SAAA,GAAY,GAAG,SAAS,CAAA,UAAA,CAAA;AAC5B,IAAA,IAAI,cAAc,WAAA,EAAa;AAC7B,MAAA,UAAA,GAAa,aAAA;AACb,MAAA,SAAA,GAAY,qBAAA;AAAA,IACd,CAAA,MAAA,IAAW,cAAc,aAAA,EAAe;AACtC,MAAA,UAAA,GAAa,YAAA;AACb,MAAA,SAAA,GAAY,uBAAA;AAAA,IACd,CAAA,MAAA,IAAW,cAAc,SAAA,EAAW;AAClC,MAAA,UAAA,GAAa,YAAA;AACb,MAAA,SAAA,GAAY,mBAAA;AAAA,IACd;AACA,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,IAAA,EAAM,YAAA,EAAc,QAAA,IAAY,KAAA;AACnD,IAAA,MAAM,aAAA,GAAgB,SAAS,MAAA,GAAS,EAAA,GAAK,SAAS,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA,GAAQ,QAAA;AACjF,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA;AACrC,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,CAAU,MAAM,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,SAAA;AAEzE,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA;AACtC,IAAA,OAAO;AAAA,wDAAA,EACmC,MAAA,GAAS,MAAA,GAAS,QAAQ,CAAA,2BAAA,EAA8B,WAAW,CAAA,gCAAA,EAAgC,UAAA,CAAW,CAAA,CAAE,IAAA,EAAM,EAAA,IAAM,UAAU,CAAC,CAAA;AAAA;AAAA,6FAAA,EAElG,UAAA,CAAW,CAAA,CAAE,IAAA,EAAM,EAAA,IAAM,aAAa,CAAC,CAAA;AAAA;AAAA;AAAA,6EAAA,EAGvD,UAAA,CAAW,CAAA,CAAE,IAAA,EAAM,KAAA,IAAS,eAAe,CAAC,CAAA;AAAA;AAAA;AAAA,uCAAA,EAGlF,UAAU,CAAA,EAAA,EAAK,UAAA,CAAW,SAAS,CAAC,CAAA;AAAA;AAAA;AAAA,0BAAA,EAGjD,UAAA,CAAW,CAAA,CAAE,IAAA,EAAM,UAAA,IAAc,iBAAiB,CAAC,CAAA;AAAA;AAAA;AAAA,6EAAA,EAGA,WAAW,QAAQ,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,aAAa,CAAC,CAAA;AAAA;AAAA;AAAA,gFAAA,EAG/C,UAAA,CAAW,SAAS,CAAC,CAAA;AAAA;AAAA;AAAA,gBAAA,CAAA;AAAA,EAIzF,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA,UAAA,CAGd;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAKX;AAKO,SAAS,mBAAA,CACd,SAAA,EACA,WAAA,EACA,KAAA,GAAgB,0DAAA,EACR;AACR,EAAA,MAAM,kBAAkB,kBAAA,EAAmB;AAC3C,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,QAAQ,CAAA;AACtD,EAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAEnC,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAKE,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAA,EAyQW,SAAA,CAAU,UAAA,KAAe,CAAA,GAAI,aAAA,GAAgB,aAAa,CAAA;AAAA,QAAA,EAC3E,UAAU,UAAA,KAAe,CAAA,GAAI,gBAAA,GAAmB,SAAA,CAAU,aAAa,SAAS;AAAA;AAAA;AAAA;AAAA,uBAAA,EAIjE,GAAA,CAAI,QAAQ,GAAA,EAAK,GAAG,EAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EAsGjD,WAAA,CAAY,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAW;AACvC,IAAA,MAAM,WAAW,CAAA,CAAE,aAAA,KAAkB,WAAA,IAAe,CAAA,CAAE,kBAAkB,UAAA,MACrE,CAAA,CAAE,UAAA,KAAe,WAAA,IAAe,EAAE,UAAA,KAAe,UAAA,CAAA,KACjD,EAAE,UAAA,KAAe,WAAA,IAAe,EAAE,UAAA,KAAe,UAAA,CAAA;AACpD,IAAA,OAAO;AAAA,sCAAA,EACmB,CAAA,CAAE,EAAE,CAAA,0CAAA,EAA6C,CAAA,CAAE,EAAE,CAAA;AAAA,kCAAA,EACzD,EAAE,EAAE,CAAA;AAAA,oBAAA,EAClB,EAAE,KAAK,CAAA;AAAA,0BAAA,EACD,EAAE,aAAa,CAAA;AAAA,0BAAA,EACf,EAAE,UAAU,CAAA;AAAA,0BAAA,EACZ,EAAE,UAAU,CAAA;AAAA,uCAAA,EACC,UAAU,aAAA,GAAgB,aAAa,CAAA,EAAA,EAAK,OAAA,GAAU,cAAc,QAAQ,CAAA;AAAA;AAAA,YAAA,CAAA;AAAA,EAExG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8CAAA,EAYwB,WAAA,CAAY,IAAA,CAAK,OAAA,GAAU,uBAAA,GAA0B,oBAAoB,MAAM,WAAA,CAAY,IAAA,CAAK,OAAA,GAAU,MAAA,GAAS,MAAM,CAAA;AAAA,mCAAA,EACpI,WAAA,CAAY,KAAK,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA,gCAAA,EAI7B,WAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,KAAK,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAW,CAAA,KAAW,CAAA,GAAI,CAAA,CAAE,eAAA,EAAiB,CAAC,CAAA,GAAI,YAAY,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,GAAI,GAAG,CAAA;AAAA,sDAAA,EACpJ,WAAA,CAAY,IAAA,CAAK,MAAA,CAAO,mBAAmB,CAAA;AAAA;AAAA;AAAA;AAAA,gCAAA,EAIjE,WAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAA,CAAK,YAAY,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAW,CAAA,KAAW,IAAI,CAAA,CAAE,UAAA,EAAY,CAAC,CAAA,GAAI,WAAA,CAAY,IAAA,CAAK,QAAQ,MAAA,EAAQ,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAG,CAAA;AAAA,sDAAA,EAChJ,WAAA,CAAY,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA,gCAAA,EAI5D,WAAA,CAAY,GAAA,CAAI,iBAAA,GAAoB,CAAA,GAAI,KAAK,KAAA,CAAO,WAAA,CAAY,GAAA,CAAI,kBAAA,GAAqB,WAAA,CAAY,GAAA,CAAI,iBAAA,GAAqB,GAAG,IAAI,GAAG,CAAA;AAAA,mCAAA,EACrI,YAAY,GAAA,CAAI,kBAAkB,CAAA,GAAA,EAAM,WAAA,CAAY,IAAI,iBAAiB,CAAA;AAAA;AAAA;AAAA;AAAA,gCAAA,EAI5E,YAAY,YAAA,GAAe,WAAA,CAAY,YAAA,CAAa,QAAA,GAAW,MAAM,KAAK,CAAA;AAAA,mCAAA,EACvE,YAAY,YAAA,GAAe,CAAA,UAAA,EAAa,WAAA,CAAY,YAAA,CAAa,WAAW,CAAA,WAAA,EAAc,WAAA,CAAY,YAAA,CAAa,YAAY,MAAM,CAAA,YAAA,EAAe,WAAA,CAAY,IAAA,CAAK,MAAA,CAAO,iBAAiB,CAAA,qBAAA,CAAuB,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAmBzO,yBAAA,CAA0B,YAAA,EAAc,WAAA,EAAM,WAAA,CAAY,GAAA,CAAI,UAAA,EAAY,UAAA,IAAc,CAAA,EAAG,yDAAA,EAA2D,WAAA,CAAY,GAAA,CAAI,KAAK,CAAC;AAAA,cAAA,EAC5K,yBAAA,CAA0B,mBAAA,EAAqB,WAAA,EAAM,WAAA,CAAY,GAAA,CAAI,UAAA,EAAY,iBAAA,IAAqB,CAAA,EAAG,uCAAA,EAAyC,WAAA,CAAY,GAAA,CAAI,KAAK,CAAC;AAAA,cAAA,EACxK,yBAAA,CAA0B,WAAA,EAAa,WAAA,EAAM,WAAA,CAAY,GAAA,CAAI,UAAA,EAAY,SAAA,IAAa,CAAA,EAAG,iDAAA,EAAmD,WAAA,CAAY,GAAA,CAAI,KAAK,CAAC;AAAA,cAAA,EAClK,yBAAA,CAA0B,kBAAA,EAAoB,WAAA,EAAM,WAAA,CAAY,GAAA,CAAI,UAAA,EAAY,gBAAA,IAAoB,CAAA,EAAG,sCAAA,EAAwC,WAAA,CAAY,GAAA,CAAI,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EAW3K,YAAY,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA,gCAAA,EAIF,WAAA,CAAY,YAAY,YAAY,CAAA;AAAA,oCAAA,EAChC,YAAY,WAAA,CAAY,UAAU,CAAA,IAAA,EAAO,WAAA,CAAY,YAAY,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA,gCAAA,EAIjF,KAAK,KAAA,CAAM,WAAA,CAAY,WAAA,CAAY,sBAAA,GAAyB,EAAE,CAAC,CAAA;AAAA,mCAAA,EAC5D,WAAA,CAAY,YAAY,sBAAsB,CAAA;AAAA;AAAA;AAAA;AAAA,gCAAA,EAIjD,WAAA,CAAY,WAAA,CAAY,WAAA,CAAY,cAAA,CAAe,OAAO,CAAC,CAAA;AAAA,uCAAA,EACpD,WAAA,CAAY,WAAA,CAAY,iBAAA,CAAkB,cAAA,EAAgB,WAAW,WAAA,CAAY,WAAA,CAAY,qBAAA,CAAsB,cAAA,EAAgB,CAAA;AAAA;AAAA;AAAA;AAAA,iCAAA,EAIzI,WAAA,CAAY,WAAA,CAAY,gBAAA,CAAiB,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,uDAAA,EAM7B,WAAA,CAAY,gBAAgB,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAc3E,WAAA,CAAY,WAAA,CAAY,YAAA,CAAa,OAAA,GAAU,CAAA,GAAI;AAAA;AAAA;AAAA;AAAA,oBAAA,EAI7C,WAAA,CAAY,WAAA,CAAY,YAAA,CAAa,OAAO,CAAA;AAAA,qBAAA,EAC3C,WAAA,CAAY,YAAY,YAAA,CAAa,UAAU,OAAO,WAAA,CAAY,WAAA,CAAY,aAAa,YAAY,CAAA;AAAA,oBAAA,EACxG,KAAK,KAAA,CAAM,WAAA,CAAY,YAAY,YAAA,CAAa,iBAAA,GAAoB,EAAE,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,cAAA,CAAA,GAI3E,EAAE;AAAA,cAAA,EACJ,MAAA,CAAO,OAAA,CAAQ,WAAA,CAAY,WAAA,CAAY,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,KAAA,EAAO,OAAO,CAAA,KAAqB;AAAA;AAAA,kCAAA,EAErE,KAAK,CAAA;AAAA;AAAA,oBAAA,EAEnB,QAAQ,OAAO,CAAA;AAAA,qBAAA,EACd,OAAA,CAAQ,UAAU,CAAA,IAAA,EAAO,OAAA,CAAQ,YAAY,CAAA;AAAA,oBAAA,EAC9C,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,iBAAA,GAAoB,EAAE,CAAC,CAAA;AAAA,oBAAA,EAAA,CACzC,QAAQ,YAAA,GAAe,OAAA,CAAQ,gBAAA,EAAkB,cAAA,CAAe,OAAO,CAAC,CAAA;AAAA,qBAAA,EACxE,OAAA,CAAQ,gBAAA,CAAiB,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA;AAAA,cAAA,CAE3C,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,oBAAA,EAIH,WAAA,CAAY,YAAY,YAAY,CAAA;AAAA,qBAAA,EACnC,YAAY,WAAA,CAAY,UAAU,CAAA,IAAA,EAAO,WAAA,CAAY,YAAY,YAAY,CAAA;AAAA,oBAAA,EAC9E,KAAK,KAAA,CAAM,WAAA,CAAY,WAAA,CAAY,sBAAA,GAAyB,EAAE,CAAC,CAAA;AAAA,oBAAA,EAC/D,WAAA,CAAY,WAAA,CAAY,WAAA,CAAY,cAAA,CAAe,OAAO,CAAC,CAAA;AAAA,qBAAA,EAC1D,WAAA,CAAY,WAAA,CAAY,gBAAA,CAAiB,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,GAK9D,EAAE;;AAAA;AAAA;AAAA,UAAA,EAIF,WAAA,CAAY,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAe7B,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAW;AAAA;AAAA,oCAAA,EAEd,EAAE,EAAE,CAAA;AAAA,sBAAA,EAClB,CAAA,CAAE,SAAA,CAAU,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,sBAAA,EAC5B,EAAE,IAAI,CAAA;AAAA,sBAAA,EACN,EAAE,OAAO,CAAA;AAAA,sBAAA,EACT,EAAE,IAAI,CAAA;AAAA,8BAAA,EACE,EAAE,aAAa,CAAA;AAAA,sBAAA,EACvB,EAAE,aAAa,CAAA;AAAA,uBAAA,EACd,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA;AAAA,cAAA,CAE9B,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA,UAAA,CAAA,GAGX;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAKH;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,IAAA,EA4BL,eAAe;AAAA;AAAA;AAAA,mBAAA,EAGA,YAAY,CAAA;AAAA,mBAAA,EACZ,KAAK,SAAA,CAAU,WAAA,CAAY,IAAI,KAAA,IAAS,EAAE,CAAC,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","file":"index.cjs","sourcesContent":["/**\n * AI-SDLC Core Domain Types and Interfaces\n */\n\n// --- Quality Gate Types ---\nexport interface QualityPolicy {\n max_cyclomatic: number;\n max_cognitive: number;\n min_maintainability: number;\n max_function_lines: number;\n min_line_coverage: number;\n min_branch_coverage: number;\n min_function_coverage: number;\n enforce_mode: 'STRICT' | 'PERMISSIVE' | string;\n target_directories: string[];\n supported_extensions: string[];\n exclude_patterns: string[];\n}\n\nexport interface FunctionMetrics {\n functionName: string;\n filePath: string;\n loc: number;\n cyclomatic: number;\n cognitive: number;\n maintainability: number;\n codeSmells: string[];\n}\n\nexport interface AnalysisResult extends FunctionMetrics {\n relPath: string;\n status: 'PASS' | 'FAIL';\n violations: string[];\n}\n\nexport interface QualityThresholds {\n max_cyclomatic?: number;\n max_cognitive?: number;\n min_maintainability?: number;\n max_function_lines?: number;\n enforce_mode?: 'STRICT' | 'PERMISSIVE' | string;\n}\n\nexport interface QualityGateOptions {\n rootDir?: string;\n policyPath?: string;\n policy?: QualityPolicy;\n thresholds?: QualityThresholds;\n}\n\nexport interface QualityGateResult {\n success: boolean;\n totalFiles: number;\n totalFunctions: number;\n passCount: number;\n failCount: number;\n violationsCount: number;\n results: AnalysisResult[];\n policy: QualityPolicy;\n reportMarkdown?: string;\n}\n\n// --- Traceability Types ---\nexport interface ArtifactFrontmatter {\n id?: string;\n type?: string;\n title?: string;\n level?: number;\n 'bounded-context'?: string;\n 'parent-component'?: string;\n 'implementation-type'?: 'service' | 'dll' | 'function' | 'composite' | string;\n 'satisfies-requirements'?: string[];\n 'derives-from'?: string | string[];\n 'mitigates-abuse-case'?: string | string[];\n 'enforced-in-enclave'?: string;\n 'cucumber-tags'?: string[];\n [key: string]: unknown;\n}\n\nexport interface TraceabilityRow {\n id: string;\n title: string;\n type?: string;\n hofId?: string;\n productTraces: string;\n productStatus: 'COMPLIANT' | 'ORPHAN' | 'CONFORME' | 'HUÉRFANO';\n archTraces: string;\n archStatus: 'COMPLIANT' | 'ORPHAN' | 'CONFORME' | 'HUÉRFANO';\n testTraces: string;\n testStatus: 'COMPLIANT' | 'ORPHAN' | 'CONFORME' | 'HUÉRFANO';\n content?: string;\n filePath?: string;\n}\n\nexport interface TraceabilityOptions {\n rootDir?: string;\n specsDir?: string;\n examplesDir?: string;\n testsDir?: string;\n strictHandoff?: boolean;\n}\n\nexport interface TraceabilityResult {\n success: boolean;\n rows: TraceabilityRow[];\n orphans: TraceabilityRow[];\n orphanCount: number;\n totalRequirements: number;\n reportMarkdown: string;\n}\n\n// --- PDaC Handoff & SDD Adapter Types ---\nexport interface ProductHandoffSubgraph {\n requirements: string[];\n useCases?: string[];\n businessRules?: string[];\n securityRequirements?: string[];\n abuseCases?: string[];\n actors?: string[];\n [key: string]: unknown;\n}\n\nexport interface ProductHandoff {\n id: string; // e.g. HOF-001-TELEMETRY-INGESTION\n type: 'handoff' | 'product-handoff' | string;\n title?: string;\n changeId: string;\n version?: string;\n subgraph: ProductHandoffSubgraph;\n citations?: {\n id?: string;\n targetId?: string;\n expectedDigest?: string;\n anchor?: string;\n comment?: string;\n }[];\n createdAt?: string;\n [key: string]: unknown;\n}\n\nexport type SddFramework = 'openspec' | 'speckit';\n\nexport type ChangeProfile = 'patch' | 'standard' | 'critical';\nexport const VALID_CHANGE_PROFILES: readonly ChangeProfile[] = ['patch', 'standard', 'critical'] as const;\n\nexport interface SddWorkspaceInfo {\n framework: SddFramework;\n changeId: string;\n changeDir: string;\n profile?: ChangeProfile;\n proposalFile?: string;\n specFile?: string;\n designFile?: string;\n tasksFile?: string;\n sidecarFile?: string;\n handoff?: ProductHandoff;\n}\n\nexport interface SddDepositOptions {\n rootDir?: string;\n changeId: string;\n framework: SddFramework;\n handoff: ProductHandoff;\n destinationDir?: string;\n}\n\nexport interface SddValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n workspace?: SddWorkspaceInfo;\n}\n\nexport interface SddIntegrationOptions {\n rootDir?: string;\n changeId: string;\n author?: string;\n date?: string;\n autoArchive?: boolean;\n}\n\nexport interface SddIntegrationResult {\n success: boolean;\n changeId: string;\n completedTasks: string[];\n pendingTasks: string[];\n integratedRequirements: string[];\n updatedProductArtifacts: string[];\n updatedArchitectureArtifacts: string[];\n createdCanonicalArtifacts?: string[];\n archived: boolean;\n archivedPath?: string;\n errors: string[];\n}\n\nexport interface SddChangeScaffoldOptions {\n rootDir?: string;\n name: string;\n changeId?: string;\n id?: string;\n from?: string | string[];\n framework?: SddFramework;\n author?: string;\n profile?: ChangeProfile;\n silent?: boolean;\n}\n\nexport interface SddChangeScaffoldResult {\n success: boolean;\n changeId: string;\n canonicalId: string;\n profile: ChangeProfile;\n changeDir: string;\n createdFiles: string[];\n productArtifactCreated?: string;\n citedArtifacts: Array<{ id: string; digest: string; title?: string; comment?: string }>;\n errors: string[];\n}\n\n// --- Progressive Friction & Anti-Bypass Types ---\nexport interface ProgressiveFrictionOptions {\n rootDir?: string;\n changeId?: string;\n changeDir?: string;\n diffFiles?: string[];\n modifiedFiles?: string[];\n}\n\nexport interface ProgressiveFrictionResult {\n success: boolean;\n profile: ChangeProfile;\n bypassed: boolean;\n violations: string[];\n bypassedRules: string[];\n evaluatedFiles: string[];\n errors: string[];\n reportMarkdown?: string;\n}\n\n\nexport interface ChangeDetectionOptions {\n rootDir?: string;\n headRef?: string;\n prTitle?: string;\n prBody?: string;\n changedFiles?: string[];\n}\n\nexport interface ChangeDetectionResult {\n detected: boolean;\n changeId?: string;\n source?: 'branch' | 'title' | 'body' | 'files' | 'single_active_completed';\n changeDir?: string;\n allTasksCompleted?: boolean;\n completedTasksCount?: number;\n totalTasksCount?: number;\n reasons: string[];\n}\n\nexport interface SddIntegrationAudit {\n changeId: string;\n status: 'FULLY_INTEGRATED' | 'PARTIALLY_INTEGRATED' | 'UNINTEGRATED';\n completedTasksCount: number;\n totalTasksCount: number;\n integratedRequirements: string[];\n missingRequirements: string[];\n gaps: string[];\n}\n\n// --- Tasks Governance Types ---\nexport type AutonomyMode = 'AUTONOMOUS' | 'HUMAN_REVIEW_PLAN' | 'AMBIGUOUS' | 'HIGH_RISK_MANUAL';\n\nexport const VALID_AUTONOMY_MODES: readonly AutonomyMode[] = [\n 'AUTONOMOUS',\n 'HUMAN_REVIEW_PLAN',\n 'AMBIGUOUS',\n 'HIGH_RISK_MANUAL'\n] as const;\n\nexport interface TaskVerification {\n method?: string;\n criteria?: string;\n}\n\nexport interface TaskItem {\n id: string;\n title?: string;\n complexity?: string;\n riskLevel?: string;\n autonomyMode?: string;\n assignedTo?: string;\n status?: string;\n blockingReason?: string;\n verification: TaskVerification;\n}\n\nexport interface TaskSummary {\n file: string;\n task: TaskItem;\n hasVerification: boolean;\n validAutonomy: boolean;\n riskAnomaly: boolean;\n}\n\nexport interface GovernanceOptions {\n rootDir?: string;\n specsDir?: string;\n}\n\nexport interface GovernanceResult {\n success: boolean;\n totalTasks: number;\n verifiedCount: number;\n unverifiedCount: number;\n riskCounts: Record<string, number>;\n modeCounts: Record<string, number>;\n tasks: TaskSummary[];\n violations: string[];\n reportMarkdown: string;\n}\n\n// --- Testing Coverage Types ---\nexport interface RequirementAuditItem {\n id: string;\n title: string;\n file: string;\n isTemplate: boolean;\n method: string;\n testRefs: string;\n existingCount: number;\n status: 'VERIFICADO_CON_PRUEBA' | 'FALLO_SIN_PRUEBA';\n}\n\nexport interface TaskAuditItem {\n id: string;\n title: string;\n file: string;\n method: string;\n commandOrCriteria: string;\n status: 'VERIFICADO_CON_PRUEBA' | 'FALLO_SIN_PRUEBA';\n}\n\nexport interface TestingCoverageOptions {\n rootDir?: string;\n}\n\nexport interface TestingCoverageResult {\n success: boolean;\n totalRequirements: number;\n passedRequirements: number;\n failedRequirements: number;\n totalTasks: number;\n passedTasks: number;\n failedTasks: number;\n requirements: RequirementAuditItem[];\n tasks: TaskAuditItem[];\n reportMarkdown: string;\n}\n\n// --- Gherkin Extraction Types ---\nexport interface ExtractedFeature {\n sourceFile: string;\n outputFile: string;\n featureName: string;\n scenarioCount: number;\n}\n\nexport interface GherkinExtractionOptions {\n rootDir?: string;\n targetPath?: string;\n all?: boolean;\n}\n\nexport interface GherkinExtractionResult {\n success: boolean;\n features: ExtractedFeature[];\n totalScenarios: number;\n}\n\nexport interface GherkinSyncCheckResult {\n inSync: boolean;\n outOfSyncFiles: string[];\n missingFiles: string[];\n totalFeatures: number;\n}\n\n// --- License Compliance Types ---\nexport interface LicensePolicy {\n version: string;\n permitted: string[];\n restricted: string[];\n blocked: string[];\n exception_packages?: Record<string, string>;\n}\n\nexport interface LicenseViolation {\n packageName: string;\n version?: string;\n license: string;\n reason: string;\n category: 'BLOCKED' | 'RESTRICTED' | 'UNRECOGNIZED';\n}\n\nexport type ScaTool = 'native' | 'license-checker' | 'trivy' | 'syft';\n\nexport interface ScannedDependency {\n name: string;\n version: string;\n spdxLicense: string;\n purl?: string;\n path?: string;\n licenseFile?: string;\n repository?: string;\n author?: string;\n isDirect?: boolean;\n}\n\nexport interface CycloneDxLicense {\n license: {\n id?: string;\n name?: string;\n };\n}\n\nexport interface CycloneDxComponent {\n type: 'library' | 'application' | 'framework';\n name: string;\n version: string;\n purl?: string;\n author?: string;\n licenses?: CycloneDxLicense[];\n}\n\nexport interface CycloneDxBom {\n bomFormat: 'CycloneDX';\n specVersion: '1.5';\n version: number;\n serialNumber: string;\n metadata: {\n timestamp: string;\n tools: Array<{ vendor: string; name: string; version: string }>;\n component: {\n type: string;\n name: string;\n version: string;\n };\n };\n components: CycloneDxComponent[];\n}\n\nexport interface LicenseVerificationOptions {\n rootDir?: string;\n policyPath?: string;\n manifestPath?: string;\n dynamic?: boolean;\n tool?: ScaTool;\n depth?: 'direct' | 'transitive';\n generateSbom?: boolean;\n sbomPath?: string;\n generateNotices?: boolean;\n noticesPath?: string;\n productionOnly?: boolean;\n}\n\nexport interface LicenseVerificationResult {\n success: boolean;\n totalEvaluated: number;\n permittedCount: number;\n violations: LicenseViolation[];\n reportMarkdown: string;\n sbomPath?: string;\n noticesPath?: string;\n scannedDependencies?: ScannedDependency[];\n}\n\n// --- PDaC Graph & Cryptographic Drift Types ---\nexport interface PdacNode {\n id: string;\n type: string;\n filePath: string;\n title?: string;\n digest: string;\n rawContent: string;\n citations: {\n targetId: string;\n expectedDigest?: string;\n anchor?: string;\n }[];\n}\n\nexport interface PdacDrift {\n sourceId: string;\n targetId: string;\n sourceFile: string;\n expectedDigest: string;\n actualDigest: string;\n}\n\nexport interface PdacGraphOptions {\n rootDir?: string;\n}\n\nexport interface PdacGraphResult {\n success: boolean;\n totalNodes: number;\n totalEdges: number;\n drifts: PdacDrift[];\n reportMarkdown: string;\n}\n\nexport interface PdacSyncOptions {\n rootDir?: string;\n targetPath?: string;\n}\n\nexport interface PdacSyncDetail {\n sourceFile: string;\n targetId: string;\n previousDigest: string;\n newDigest: string;\n}\n\nexport interface PdacSyncResult {\n success: boolean;\n syncedCount: number;\n updatedFiles: string[];\n details: PdacSyncDetail[];\n}\n\nexport interface PreflightGateSummary {\n name: string;\n status: 'PASSED' | 'FAILED' | 'FIXED' | 'WARNING';\n message: string;\n remediation?: string;\n}\n\nexport interface PreflightCheckOptions {\n root?: string;\n fix?: boolean;\n silent?: boolean;\n}\n\nexport interface PreflightCheckResult {\n success: boolean;\n autoFixExecuted: boolean;\n gherkinSynced: number;\n digestsSynced: number;\n gates: PreflightGateSummary[];\n}\n\n// --- Quality Report Types ---\nexport interface CodeCoverageSummary {\n linesPct: number;\n branchesPct: number;\n functionsPct: number;\n statementsPct?: number;\n source: string;\n}\n\nexport interface QualityReportOptions {\n rootDir?: string;\n policyPath?: string;\n thresholds?: QualityThresholds;\n}\n\nexport interface QualityReportResult {\n markdown: string;\n totalFiles: number;\n totalFunctions: number;\n avgMaintainability: number;\n avgCyclomatic: number;\n verdict: 'PASS' | 'FAIL';\n coverage?: CodeCoverageSummary | null;\n}\n\n// --- Git Workflow Types ---\nexport interface BranchValidationSuccess {\n valid: true;\n tier: 1 | 2 | 3 | 4;\n tierName: string;\n parentRequirement: string;\n targetMerge: string;\n id?: string;\n parentId?: string;\n taskId?: string;\n}\n\nexport interface BranchValidationError {\n valid: false;\n tier: 0;\n tierName: 'Inválido';\n error: string;\n}\n\nexport type BranchClassificationResult = BranchValidationSuccess | BranchValidationError;\n\nexport interface BranchHierarchyPlan {\n version: string;\n feature: string;\n tasks: string[];\n planText: string;\n}\n\n// --- Artifact Schema Validation Types ---\nexport interface ArtifactSchemaOptions {\n rootDir?: string;\n targetPath?: string;\n schemaDir?: string;\n}\n\nexport interface ArtifactSchemaViolation {\n filePath: string;\n id?: string;\n type?: string;\n schemaId?: string;\n property?: string;\n message: string;\n}\n\nexport interface ArtifactValidationResult {\n valid: boolean;\n filePath: string;\n id?: string;\n type?: string;\n schemaId?: string;\n errors: string[];\n}\n\nexport interface ArtifactSchemaResult {\n success: boolean;\n totalEvaluated: number;\n validCount: number;\n invalidCount: number;\n violations: ArtifactSchemaViolation[];\n results: ArtifactValidationResult[];\n}\n\n// --- Git Task Checkout Types ---\nexport interface ActiveTaskMatch {\n taskId: string;\n taskTitle: string;\n changeId: string;\n changeDir: string;\n version: string;\n}\n\nexport interface GitCheckoutTaskOptions {\n rootDir?: string;\n}\n\nexport interface GitCheckoutTaskResult {\n success: boolean;\n taskId: string;\n changeId?: string;\n releaseBranch?: string;\n featureBranch?: string;\n taskBranch?: string;\n createdBranches: string[];\n switchedBranch?: string;\n error?: string;\n availableTasks?: Array<{ id: string; title: string; changeId: string }>;\n}\n\n// --- Duplicate Requirements Verifier Types ---\nexport type DuplicateSeverity = 'ERROR' | 'WARNING';\n\nexport type DuplicateIssueType =\n | 'ID_COLLISION'\n | 'EXACT_CONTENT'\n | 'TITLE_SIMILARITY'\n | 'BDD_TAG_COLLISION'\n | 'SHARED_BUSINESS_RULE';\n\nexport interface DuplicateIssue {\n type: DuplicateIssueType;\n severity: DuplicateSeverity;\n id: string;\n file: string;\n conflictingId?: string;\n conflictingFile?: string;\n message: string;\n similarityScore?: number;\n}\n\nexport interface DuplicateVerifierOptions {\n rootDir?: string;\n specsDir?: string;\n examplesDir?: string;\n titleSimilarityThreshold?: number; // default: 0.85\n allowWarnings?: boolean;\n}\n\nexport interface DuplicateVerifierResult {\n success: boolean;\n totalRequirements: number;\n errorCount: number;\n warningCount: number;\n issues: DuplicateIssue[];\n reportMarkdown?: string;\n}\n\n// --- Secret Scanning & Gitleaks Types ---\nexport type SecretFindingType =\n | 'PRIVATE_KEY'\n | 'AWS_CREDENTIAL'\n | 'GITHUB_TOKEN'\n | 'SLACK_TOKEN'\n | 'GOOGLE_API_KEY'\n | 'OPENAI_API_KEY'\n | 'STRIPE_API_KEY'\n | 'JWT_TOKEN'\n | 'GENERIC_HIGH_ENTROPY_SECRET'\n | 'GITLEAKS_FINDING';\n\nexport interface SecretViolation {\n filePath: string;\n relPath: string;\n lineNumber: number;\n type: SecretFindingType;\n maskedMatch: string;\n ruleId: string;\n entropy?: number;\n message: string;\n}\n\nexport interface SecretVerifierOptions {\n rootDir?: string;\n diff?: boolean;\n baseBranch?: string;\n entropyThreshold?: number; // default: 4.3\n gitleaks?: boolean;\n excludePatterns?: string[];\n ignoreSecrets?: string[];\n}\n\nexport interface SecretVerifierResult {\n success: boolean;\n totalFilesScanned: number;\n findingsCount: number;\n findings: SecretViolation[];\n scannedWithGitleaks: boolean;\n reportMarkdown?: string;\n}\n\n// --- SAST (Static Application Security Testing) Types ---\nexport type SastSeverity = 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW';\n\nexport type SastFindingType =\n | 'SQL_INJECTION'\n | 'COMMAND_INJECTION'\n | 'SSRF'\n | 'PATH_TRAVERSAL'\n | 'UNSAFE_EVAL'\n | 'PROMPT_INJECTION_RISK'\n | 'SEMGREP_FINDING';\n\nexport interface SastViolation {\n filePath: string;\n relPath: string;\n lineNumber: number;\n ruleId: string;\n type: SastFindingType;\n severity: SastSeverity;\n snippet: string;\n message: string;\n}\n\nexport interface SastVerifierOptions {\n rootDir?: string;\n semgrep?: boolean;\n targetDirectories?: string[];\n minSeverity?: SastSeverity;\n}\n\nexport interface SastVerifierResult {\n success: boolean;\n totalFilesScanned: number;\n violationsCount: number;\n violations: SastViolation[];\n reportMarkdown?: string;\n}\n\nexport interface PromptInjectionFinding {\n ruleId: string;\n severity: SastSeverity;\n pattern: string;\n snippet: string;\n lineNumber?: number;\n message: string;\n}\n\n// --- Interactive Web Dashboard & Cytoscape Graph Types ---\nexport type GraphNodeLayer = 'product' | 'requirement' | 'architecture' | 'test';\nexport type GraphNodeStatus = 'COMPLIANT' | 'ORPHAN' | 'DRIFT' | 'REVIEW' | 'CONFORME' | 'HUÉRFANO';\nexport type GraphNodeType =\n | 'journey'\n | 'actor'\n | 'threat-actor'\n | 'use-case'\n | 'business-rule'\n | 'abuse-case'\n | 'hazard'\n | 'requirement'\n | 'security-requirement'\n | 'safety-requirement'\n | 'component'\n | 'adr'\n | 'security-enclave'\n | 'bdd-feature'\n | 'code-test'\n | string;\n\nexport interface CytoscapeNodeData {\n id: string;\n label: string;\n title: string;\n type: GraphNodeType;\n layer: GraphNodeLayer;\n status: GraphNodeStatus;\n filePath?: string;\n content?: string;\n digest?: string;\n details?: Record<string, unknown>;\n upstream?: string[];\n downstream?: string[];\n}\n\nexport interface CytoscapeEdgeData {\n id: string;\n source: string;\n target: string;\n label?: string;\n relation: string;\n status?: GraphNodeStatus;\n}\n\nexport interface CytoscapeElement {\n group: 'nodes' | 'edges';\n data: CytoscapeNodeData | CytoscapeEdgeData;\n classes?: string;\n}\n\nexport interface DashboardHistoricalKpi {\n id: string;\n label: string;\n timestamp: string;\n kloc: number;\n commits: number;\n bugs: number;\n defectDensity: number;\n reworkPercent: number;\n costUsd: number;\n}\n\nexport interface DashboardOptions {\n rootDir?: string;\n outputPath?: string;\n title?: string;\n includeHistoricalKpis?: boolean;\n}\n\nexport interface DashboardResult {\n outputPath: string;\n totalNodes: number;\n totalEdges: number;\n conformingCount: number;\n issueCount: number;\n nodesByLayer: Record<GraphNodeLayer, number>;\n metrics: {\n totalFiles: number;\n totalFunctions: number;\n avgMaintainability: number;\n avgCyclomatic: number;\n qualityVerdict: 'PASS' | 'FAIL';\n autonomyDistribution: Record<string, number>;\n traceabilityRatio: number;\n bddCoverageRatio: number;\n };\n html: string;\n}\n\n\n\n","/**\n * AI-SDLC: TypeScript/JavaScript Real AST Static Analysis Engine\n * Powered by ts-morph (MIT License)\n */\n\nimport * as path from 'path';\nimport { Node, Project, SyntaxKind } from 'ts-morph';\nimport { FunctionMetrics } from '../../types/index.js';\n\nconst CYCLOMATIC_KINDS = new Set<SyntaxKind>([\n SyntaxKind.IfStatement,\n SyntaxKind.ConditionalExpression,\n SyntaxKind.ForStatement,\n SyntaxKind.ForInStatement,\n SyntaxKind.ForOfStatement,\n SyntaxKind.WhileStatement,\n SyntaxKind.DoStatement,\n SyntaxKind.CaseClause,\n SyntaxKind.CatchClause,\n]);\n\nconst LOGICAL_BINARY_OPS = new Set<SyntaxKind>([\n SyntaxKind.AmpersandAmpersandToken,\n SyntaxKind.BarBarToken,\n SyntaxKind.QuestionQuestionToken,\n]);\n\nlet sharedProject: Project | null = null;\n\nfunction getSharedProject(): Project {\n if (!sharedProject) {\n sharedProject = new Project({\n useInMemoryFileSystem: true,\n compilerOptions: { allowJs: true, jsx: 1 },\n });\n }\n return sharedProject;\n}\n\nfunction resolveDeclarationName(node: Node): string | null {\n if (\n Node.isFunctionDeclaration(node) ||\n Node.isMethodDeclaration(node) ||\n Node.isGetAccessorDeclaration(node) ||\n Node.isSetAccessorDeclaration(node)\n ) {\n const prefix = Node.isGetAccessorDeclaration(node) ? 'get ' : Node.isSetAccessorDeclaration(node) ? 'set ' : '';\n return `${prefix}${node.getName() || 'anonymous'}`;\n }\n if (Node.isConstructorDeclaration(node)) return 'constructor';\n return null;\n}\n\nfunction resolveExpressionParentName(parent: Node): string {\n if (Node.isVariableDeclaration(parent) || Node.isPropertyAssignment(parent)) {\n return parent.getName();\n }\n if (Node.isCallExpression(parent)) {\n const args = parent.getArguments();\n if (args.length > 0 && Node.isStringLiteral(args[0])) {\n return args[0].getLiteralText();\n }\n return parent.getExpression().getText();\n }\n return 'anonymous';\n}\n\nfunction resolveFunctionName(node: Node): string {\n const declName = resolveDeclarationName(node);\n if (declName) return declName;\n\n const parent = node.getParent();\n return parent ? resolveExpressionParentName(parent) : 'anonymous';\n}\n\nfunction isBranchNode(kind: SyntaxKind, child: Node): boolean {\n if (CYCLOMATIC_KINDS.has(kind)) return true;\n if (kind === SyntaxKind.BinaryExpression) {\n const binExpr = child.asKind(SyntaxKind.BinaryExpression);\n return LOGICAL_BINARY_OPS.has(binExpr?.getOperatorToken().getKind() ?? SyntaxKind.Unknown);\n }\n return false;\n}\n\nfunction computeCyclomaticFromAst(node: Node): number {\n let complexity = 1;\n node.forEachDescendant((child) => {\n if (isNestedFunctionBoundary(child, node)) return;\n if (isBranchNode(child.getKind(), child)) {\n complexity++;\n }\n });\n return complexity;\n}\n\nfunction isNestedFunctionBoundary(child: Node, root: Node): boolean {\n if (child === root) return false;\n return (\n Node.isFunctionDeclaration(child) ||\n Node.isMethodDeclaration(child) ||\n Node.isConstructorDeclaration(child)\n );\n}\n\nfunction computeCognitiveFromAst(node: Node, currentNesting = 0): number {\n let cognitive = 0;\n for (const child of node.getChildren()) {\n const kind = child.getKind();\n const isControlFlow = CYCLOMATIC_KINDS.has(kind);\n const nextNesting = isControlFlow ? currentNesting + 1 : currentNesting;\n\n if (isControlFlow) {\n cognitive += kind === SyntaxKind.CaseClause ? 1 : 1 + currentNesting;\n }\n\n if (!isNestedFunctionBoundary(child, node)) {\n cognitive += computeCognitiveFromAst(child, nextNesting);\n }\n }\n return cognitive;\n}\n\nfunction calculateLocAndHalstead(fullText: string, cyclomatic: number): { loc: number; mi: number } {\n const allLines = fullText.split(/\\r?\\n/).map((l) => l.trim()).filter((l) => l.length > 0);\n const commentLines = allLines.filter((l) => l.startsWith('//') || l.startsWith('/*') || l.startsWith('*')).length;\n const loc = Math.max(1, allLines.length - commentLines);\n\n const cleanText = fullText.replace(/\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*/g, '');\n const tokens = cleanText.split(/[\\s,;().{}[\\]=+\\-*/<>!&|:]+/).filter((t) => t.length > 0);\n const N = tokens.length || 1;\n const n = new Set(tokens).size || 1;\n const V = Math.max(1, N * Math.log2(Math.max(2, n)));\n\n const perCM = allLines.length > 0 ? commentLines / allLines.length : 0;\n const commentWeight = 50 * Math.sin(Math.sqrt(2.4 * perCM));\n\n const rawMI = 171 - 5.2 * Math.log(V) - 0.23 * cyclomatic - 16.2 * Math.log(loc) + commentWeight;\n const normalizedMI = Math.max(0, Math.min(100, (rawMI * 100) / 171));\n\n return { loc, mi: Math.round(normalizedMI * 10) / 10 };\n}\n\nfunction detectAstCodeSmells(node: Node, loc: number, nodeText: string): string[] {\n const smells: string[] = [];\n if (node.getDescendantsOfKind(SyntaxKind.AnyKeyword).length > 0) {\n smells.push('Uso prohibido de \"any\"');\n }\n if (/\\/\\/\\s*@ts-ignore|\\/\\/\\s*eslint-disable/.test(nodeText)) {\n smells.push('Supresión no autorizada de linter');\n }\n if (loc > 40) {\n smells.push(`Función extensa (${loc} líneas > límite 40)`);\n }\n return smells;\n}\n\nfunction isDeclarationFunction(node: Node): boolean {\n return (\n Node.isFunctionDeclaration(node) ||\n Node.isMethodDeclaration(node) ||\n Node.isConstructorDeclaration(node) ||\n Node.isGetAccessorDeclaration(node) ||\n Node.isSetAccessorDeclaration(node)\n );\n}\n\nfunction isAnalyzableArrowOrExpr(node: Node): boolean {\n if (!Node.isArrowFunction(node) && !Node.isFunctionExpression(node)) return false;\n const parent = node.getParent();\n if (!parent) return false;\n if (Node.isVariableDeclaration(parent) || Node.isPropertyAssignment(parent)) return true;\n if (Node.isCallExpression(parent)) {\n return ['it', 'test'].includes(parent.getExpression().getText());\n }\n return false;\n}\n\nfunction isAnalyzableFunction(node: Node): boolean {\n return isDeclarationFunction(node) || isAnalyzableArrowOrExpr(node);\n}\n\nfunction buildNodeMetrics(node: Node, filePath: string): FunctionMetrics {\n const functionName = resolveFunctionName(node);\n const cyclomatic = computeCyclomaticFromAst(node);\n const cognitive = computeCognitiveFromAst(node);\n const fullText = node.getFullText();\n const nodeText = node.getText();\n const { loc, mi } = calculateLocAndHalstead(fullText, cyclomatic);\n const codeSmells = detectAstCodeSmells(node, loc, nodeText);\n\n return { functionName, filePath, loc, cyclomatic, cognitive, maintainability: mi, codeSmells };\n}\n\nfunction buildModuleFallback(content: string, filePath: string): FunctionMetrics {\n const { loc, mi } = calculateLocAndHalstead(content, 1);\n const codeSmells = loc > 40 ? [`Función extensa (${loc} líneas > límite 40)`] : [];\n return {\n functionName: 'main_module',\n filePath,\n loc,\n cyclomatic: 1,\n cognitive: 0,\n maintainability: mi,\n codeSmells,\n };\n}\n\nexport function extractFunctionsTypeScriptAst(content: string, filePath: string): FunctionMetrics[] {\n const project = getSharedProject();\n const ext = path.extname(filePath).toLowerCase() || '.ts';\n const fileName = `temp_${Date.now()}_${Math.random().toString(36).substring(2, 7)}${ext}`;\n const sourceFile = project.createSourceFile(fileName, content, { overwrite: true });\n const metricsList: FunctionMetrics[] = [];\n\n try {\n sourceFile.forEachDescendant((node) => {\n if (isAnalyzableFunction(node)) {\n metricsList.push(buildNodeMetrics(node, filePath));\n }\n });\n return metricsList.length > 0 ? metricsList : [buildModuleFallback(content, filePath)];\n } finally {\n sourceFile.forget();\n }\n}\n","/**\n * AI-SDLC: Polyglot Token-Aware Structural AST Scanner\n * Supports Go, Rust, Java, C#, C/C++, and Python with exact delimiter tracking.\n */\n\nimport * as path from 'path';\nimport { FunctionMetrics } from '../../types/index.js';\n\ninterface RawFunctionBlock {\n name: string;\n body: string;\n startLine: number;\n}\n\nexport function extractFunctionsPolyglot(content: string, filePath: string): FunctionMetrics[] {\n const ext = path.extname(filePath).toLowerCase();\n return ext === '.py' ? extractPythonFunctions(content, filePath) : extractBraceFunctions(content, filePath);\n}\n\nfunction isDocstringToggle(trimmed: string): boolean {\n const dCount = (trimmed.match(/\"\"\"/g) || []).length;\n const sCount = (trimmed.match(/'''/g) || []).length;\n return dCount % 2 === 1 || sCount % 2 === 1;\n}\n\nfunction shouldAppendPythonBody(line: string, baseIndent: number, inDoc: boolean): boolean {\n if (inDoc || line.trim().length === 0) return true;\n const lineIndent = line.length - line.trimStart().length;\n return lineIndent > baseIndent;\n}\n\nfunction parsePythonDefLine(line: string, inDoc: boolean): { name: string; indent: number } | null {\n if (inDoc) return null;\n const match = line.match(/^(\\s*)(?:async\\s+)?def\\s+([a-zA-Z0-9_$]+)\\s*\\(/);\n return match ? { name: match[2], indent: match[1].length } : null;\n}\n\nfunction flushPythonBlock(\n state: { currentFn: string | null; fnLines: string[] },\n blocks: RawFunctionBlock[],\n lineIndex: number\n): void {\n if (state.currentFn && state.fnLines.length > 0) {\n blocks.push({ name: state.currentFn, body: state.fnLines.join('\\n'), startLine: lineIndex });\n }\n state.currentFn = null;\n state.fnLines = [];\n}\n\nfunction handlePythonBodyLine(\n raw: string,\n state: { currentFn: string | null; fnLines: string[]; baseIndent: number; inDocstring: boolean },\n blocks: RawFunctionBlock[],\n lineIndex: number\n): void {\n if (shouldAppendPythonBody(raw, state.baseIndent, state.inDocstring)) {\n state.fnLines.push(raw);\n } else {\n flushPythonBlock(state, blocks, lineIndex);\n }\n}\n\nfunction processPythonLine(\n raw: string,\n state: { currentFn: string | null; fnLines: string[]; baseIndent: number; inDocstring: boolean },\n blocks: RawFunctionBlock[],\n lineIndex: number\n): void {\n if (isDocstringToggle(raw.trim())) state.inDocstring = !state.inDocstring;\n\n const defMatch = parsePythonDefLine(raw, state.inDocstring);\n if (defMatch) {\n flushPythonBlock(state, blocks, lineIndex);\n state.currentFn = defMatch.name;\n state.baseIndent = defMatch.indent;\n state.fnLines = [raw];\n return;\n }\n\n if (state.currentFn) {\n handlePythonBodyLine(raw, state, blocks, lineIndex);\n }\n}\n\nfunction extractPythonFunctions(content: string, filePath: string): FunctionMetrics[] {\n const lines = content.split('\\n');\n const blocks: RawFunctionBlock[] = [];\n const state = { currentFn: null as string | null, fnLines: [] as string[], baseIndent: 0, inDocstring: false };\n\n for (let i = 0; i < lines.length; i++) {\n processPythonLine(lines[i], state, blocks, i);\n }\n\n if (state.currentFn && state.fnLines.length > 0) {\n blocks.push({ name: state.currentFn, body: state.fnLines.join('\\n'), startLine: lines.length });\n }\n\n return buildMetricsFromBlocks(blocks, content, filePath);\n}\n\ninterface BraceScanState {\n currentFn: string | null;\n braceCount: number;\n fnLines: string[];\n inBlockComment: boolean;\n}\n\nfunction processBraceLine(\n line: string,\n state: BraceScanState,\n blocks: RawFunctionBlock[],\n lineIndex: number,\n ext: string\n): void {\n if (!state.currentFn) {\n const candidate = matchFunctionHeader(line, ext);\n if (!candidate) return;\n state.currentFn = candidate;\n state.braceCount = 0;\n state.fnLines = [];\n }\n\n state.fnLines.push(line);\n const res = scanBracesInLine(line, state.inBlockComment, ext);\n state.inBlockComment = res.nowInBlock;\n state.braceCount += res.delta;\n\n if (state.braceCount === 0 && state.fnLines.length > 1) {\n blocks.push({ name: state.currentFn, body: state.fnLines.join('\\n'), startLine: lineIndex });\n state.currentFn = null;\n state.fnLines = [];\n }\n}\n\nfunction extractBraceFunctions(content: string, filePath: string): FunctionMetrics[] {\n const ext = path.extname(filePath).toLowerCase();\n const lines = content.split('\\n');\n const blocks: RawFunctionBlock[] = [];\n const state: BraceScanState = { currentFn: null, braceCount: 0, fnLines: [], inBlockComment: false };\n\n for (let i = 0; i < lines.length; i++) {\n processBraceLine(lines[i], state, blocks, i, ext);\n }\n\n return buildMetricsFromBlocks(blocks, content, filePath);\n}\n\nfunction matchCStyleHeader(line: string): string | null {\n const match = line.match(\n /(?:(?:public|private|protected|static|async|virtual|override|fn)\\s+)*(?:function\\s+([a-zA-Z0-9_$]+)|(?:[a-zA-Z0-9_<>[\\]?]+\\s+)+([a-zA-Z0-9_$]+)\\s*\\([^;{]*\\)\\s*(?:throws\\s+[^{]+)?\\{|([a-zA-Z0-9_$]+)\\s*\\([^;{]*\\)\\s*(?::\\s*[^{]+\\s*)?\\{)/\n );\n if (!match) return null;\n const candidate = match[1] || match[2] || match[3];\n const exclusions = ['if', 'for', 'while', 'switch', 'catch', 'select', 'match', 'class', 'struct'];\n return candidate && !exclusions.includes(candidate) ? candidate : null;\n}\n\nfunction matchFunctionHeader(line: string, ext: string): string | null {\n const trimmed = line.trim();\n if (trimmed.startsWith('//') || trimmed.startsWith('/*') || trimmed.startsWith('*')) return null;\n\n if (ext === '.go') {\n const match = line.match(/func\\s+(?:\\([^)]*\\)\\s*)?([a-zA-Z0-9_$]+)\\s*\\(/);\n return match ? match[1] : null;\n }\n if (ext === '.rs') {\n const match = line.match(/(?:pub\\s+)?(?:async\\s+)?(?:unsafe\\s+)?fn\\s+([a-zA-Z0-9_$]+)\\s*\\(/);\n return match ? match[1] : null;\n }\n return matchCStyleHeader(line);\n}\n\ninterface ScanResult {\n delta: number;\n nowInBlock: boolean;\n}\n\nfunction handleStringChar(char: string, inString: string | null): { inString: string | null; skip: boolean } {\n if (char === inString) return { inString: null, skip: false };\n return { inString, skip: char === '\\\\' };\n}\n\nfunction handleBlockState(char: string, next: string, inBlock: boolean): { inBlock: boolean; skip: boolean } {\n if (inBlock && char === '*' && next === '/') return { inBlock: false, skip: true };\n return { inBlock, skip: false };\n}\n\nfunction checkCommentOrQuote(\n char: string,\n next: string,\n ext: string\n): { startBlock: boolean; quote: string | null; isLineComment: boolean } {\n if (char === '/' && next === '/') return { startBlock: false, quote: null, isLineComment: true };\n if (char === '/' && next === '*') return { startBlock: true, quote: null, isLineComment: false };\n const isQuote = char === '\"' || char === \"'\" || (char === '`' && ext === '.go');\n return { startBlock: false, quote: isQuote ? char : null, isLineComment: false };\n}\n\nfunction stepSkippedState(\n char: string,\n next: string,\n inBlock: boolean,\n inString: string | null\n): { inBlock: boolean; inString: string | null; skip: boolean; handled: boolean } {\n if (inBlock) {\n const res = handleBlockState(char, next, inBlock);\n return { inBlock: res.inBlock, inString, skip: res.skip, handled: true };\n }\n if (inString) {\n const res = handleStringChar(char, inString);\n return { inBlock, inString: res.inString, skip: res.skip, handled: true };\n }\n return { inBlock, inString, skip: false, handled: false };\n}\n\nfunction checkCodeChar(\n char: string,\n next: string,\n ext: string\n): { delta: number; startBlock: boolean; quote: string | null; stop: boolean } {\n const trigger = checkCommentOrQuote(char, next, ext);\n if (trigger.isLineComment) return { delta: 0, startBlock: false, quote: null, stop: true };\n if (trigger.startBlock) return { delta: 0, startBlock: true, quote: null, stop: false };\n if (trigger.quote) return { delta: 0, startBlock: false, quote: trigger.quote, stop: false };\n const delta = char === '{' ? 1 : char === '}' ? -1 : 0;\n return { delta, startBlock: false, quote: null, stop: false };\n}\n\nfunction applyCodeChar(\n res: { delta: number; startBlock: boolean; quote: string | null; stop: boolean },\n state: { delta: number; inBlock: boolean; inString: string | null }\n): { advance: number; stop: boolean } {\n if (res.stop) return { advance: 0, stop: true };\n if (res.startBlock) {\n state.inBlock = true;\n return { advance: 1, stop: false };\n }\n if (res.quote) {\n state.inString = res.quote;\n return { advance: 0, stop: false };\n }\n state.delta += res.delta;\n return { advance: 0, stop: false };\n}\n\nfunction scanBracesInLine(line: string, wasInBlock: boolean, ext: string): ScanResult {\n const state = { delta: 0, inBlock: wasInBlock, inString: null as string | null };\n\n for (let j = 0; j < line.length; j++) {\n const char = line[j];\n const next = j + 1 < line.length ? line[j + 1] : '';\n\n const skipped = stepSkippedState(char, next, state.inBlock, state.inString);\n if (skipped.handled) {\n state.inBlock = skipped.inBlock;\n state.inString = skipped.inString;\n if (skipped.skip) j++;\n continue;\n }\n\n const res = checkCodeChar(char, next, ext);\n const step = applyCodeChar(res, state);\n if (step.stop) break;\n j += step.advance;\n }\n\n return { delta: state.delta, nowInBlock: state.inBlock };\n}\n\nfunction buildMetricsFromBlocks(blocks: RawFunctionBlock[], content: string, filePath: string): FunctionMetrics[] {\n if (blocks.length === 0) {\n return [calculatePolyglotMetrics(content, 'main_module', filePath)];\n }\n return blocks.map((b) => calculatePolyglotMetrics(b.body, b.name, filePath));\n}\n\nfunction detectPolyglotSmells(body: string, loc: number): string[] {\n const smells: string[] = [];\n if (/#\\s*noqa|#\\s*type:\\s*ignore|@SuppressWarnings/.test(body)) {\n smells.push('Supresión no autorizada de linter');\n }\n if (loc > 40) {\n smells.push(`Función extensa (${loc} líneas > límite 40)`);\n }\n return smells;\n}\n\nfunction computeHalsteadMI(body: string, cyclomatic: number, loc: number, commentCount: number): number {\n const cleanText = body.replace(/\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*|#.*/g, '');\n const tokens = cleanText.split(/[\\s,;().{}[\\]=+\\-*/<>!&|:]+/).filter((t) => t.length > 0);\n const N = tokens.length || 1;\n const n = new Set(tokens).size || 1;\n const V = Math.max(1, N * Math.log2(Math.max(2, n)));\n\n const totalLines = loc + commentCount;\n const perCM = totalLines > 0 ? commentCount / totalLines : 0;\n const commentWeight = 50 * Math.sin(Math.sqrt(2.4 * perCM));\n\n const rawMI = 171 - 5.2 * Math.log(V) - 0.23 * cyclomatic - 16.2 * Math.log(loc) + commentWeight;\n return Math.round(Math.max(0, Math.min(100, (rawMI * 100) / 171)) * 10) / 10;\n}\n\nfunction isCommentLine(line: string, isPy: boolean): boolean {\n return isPy\n ? line.startsWith('#') || line.startsWith('\"\"\"') || line.startsWith(\"'''\")\n : line.startsWith('//') || line.startsWith('/*') || line.startsWith('*');\n}\n\nfunction countCommentsAndLoc(rawLines: string[], isPy: boolean): { loc: number; commentCount: number; cleanLines: string[] } {\n const commentCount = rawLines.filter((l) => isCommentLine(l, isPy)).length;\n const loc = Math.max(1, rawLines.length - commentCount);\n const cleanLines = rawLines.filter((l) => !isCommentLine(l, isPy));\n return { loc, commentCount, cleanLines };\n}\n\nfunction calculatePolyglotMetrics(body: string, name: string, filePath: string): FunctionMetrics {\n const ext = path.extname(filePath).toLowerCase();\n const rawLines = body.split(/\\r?\\n/).map((l) => l.trim()).filter((l) => l.length > 0);\n const { loc, commentCount, cleanLines } = countCommentsAndLoc(rawLines, ext === '.py');\n\n const cyclomatic = computePolyglotCyclomatic(body, ext);\n const cognitive = computePolyglotCognitive(cleanLines, ext === '.py');\n const maintainability = computeHalsteadMI(body, cyclomatic, loc, commentCount);\n\n return {\n functionName: name,\n filePath,\n loc,\n cyclomatic,\n cognitive,\n maintainability,\n codeSmells: detectPolyglotSmells(body, loc),\n };\n}\n\nfunction computePolyglotCyclomatic(body: string, ext: string): number {\n let regex: RegExp;\n if (ext === '.py') {\n regex = /\\b(if|elif|for|while|except)\\b|\\b(and|or)\\b/g;\n } else if (ext === '.go') {\n regex = /\\b(if|for|case|select)\\b|&&|\\|\\|/g;\n } else if (ext === '.rs') {\n regex = /\\b(if|for|while|match)\\b|&&|\\|\\||\\?/g;\n } else {\n regex = /\\b(if|else\\s+if|for|while|catch|case)\\b|\\?|&&|\\|\\|/g;\n }\n const cleanBody = body.replace(/\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'/g, '');\n const matches = cleanBody.match(regex);\n return 1 + (matches ? matches.length : 0);\n}\n\nfunction computePolyglotCognitive(lines: string[], isPy: boolean): number {\n let cognitive = 0;\n let nesting = 0;\n\n for (const line of lines) {\n if (isPy) {\n const indent = line.length - line.trimStart().length;\n if (/\\b(if|elif|for|while|except)\\b/.test(line)) {\n cognitive += 1 + Math.floor(indent / 4);\n }\n } else {\n if (line.includes('{')) nesting++;\n if (line.includes('}')) nesting = Math.max(0, nesting - 1);\n if (/\\b(if|for|while|catch|match|select)\\b/.test(line)) {\n cognitive += 1 + nesting;\n }\n }\n }\n\n return cognitive;\n}\n","/**\n * AI-SDLC: Deterministic Quality Gate Engine (Polyglot Support)\n * Uses modern AST static analysis with zero legacy heuristics.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n AnalysisResult,\n FunctionMetrics,\n QualityGateOptions,\n QualityGateResult,\n QualityPolicy,\n QualityThresholds,\n} from '../types/index.js';\nimport { extractFunctionsTypeScriptAst } from './ast/typescript-ast.js';\nimport { extractFunctionsPolyglot } from './ast/polyglot-scanner.js';\n\nexport const DEFAULT_EXTENSIONS: readonly string[] = [\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.py',\n '.java',\n '.go',\n '.cs',\n '.rs',\n '.cpp',\n '.c',\n];\n\nexport const DEFAULT_EXCLUDES: readonly string[] = [\n 'node_modules',\n '__pycache__',\n '.pytest_cache',\n 'target',\n 'bin',\n 'obj',\n '.git',\n 'reports',\n 'dist',\n '.changeset',\n];\n\nconst TS_JS_EXTENSIONS: readonly string[] = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'];\n\nexport function createDefaultQualityPolicy(): QualityPolicy {\n return {\n max_cyclomatic: 10,\n max_cognitive: 15,\n min_maintainability: 50.0,\n max_function_lines: 40,\n min_line_coverage: 85.0,\n min_branch_coverage: 80.0,\n min_function_coverage: 90.0,\n enforce_mode: 'STRICT',\n target_directories: ['src', 'lib', 'examples', 'tests'],\n supported_extensions: [...DEFAULT_EXTENSIONS],\n exclude_patterns: [...DEFAULT_EXCLUDES],\n };\n}\n\nfunction applyDocScope(policy: QualityPolicy, doc: Record<string, unknown>): void {\n if (typeof doc.enforcement_mode === 'string') policy.enforce_mode = doc.enforcement_mode;\n if (!doc.scope || typeof doc.scope !== 'object') return;\n const scope = doc.scope as Record<string, unknown>;\n\n if (Array.isArray(scope.target_directories)) {\n policy.target_directories = scope.target_directories.map(String);\n }\n if (Array.isArray(scope.supported_extensions)) {\n policy.supported_extensions = scope.supported_extensions.map(String);\n }\n if (Array.isArray(scope.exclude_patterns)) {\n for (const pat of scope.exclude_patterns) {\n const p = String(pat);\n if (!policy.exclude_patterns.includes(p)) policy.exclude_patterns.push(p);\n }\n }\n}\n\nfunction applyCoverageThresholds(policy: QualityPolicy, covRaw: unknown): void {\n if (!covRaw || typeof covRaw !== 'object') return;\n const cov = covRaw as Record<string, unknown>;\n if (cov.min_line_coverage_percent !== undefined) policy.min_line_coverage = Number(cov.min_line_coverage_percent);\n if (cov.min_branch_coverage_percent !== undefined) policy.min_branch_coverage = Number(cov.min_branch_coverage_percent);\n if (cov.min_function_coverage_percent !== undefined) {\n policy.min_function_coverage = Number(cov.min_function_coverage_percent);\n }\n}\n\nfunction applyDocThresholds(policy: QualityPolicy, doc: Record<string, unknown>): void {\n const sections = [doc.release_thresholds, doc.thresholds].filter(\n (s): s is Record<string, unknown> => Boolean(s && typeof s === 'object')\n );\n\n for (const s of sections) {\n const cc = (s.cyclomatic_complexity as Record<string, unknown>)?.max_per_function;\n const cog = (s.cognitive_complexity as Record<string, unknown>)?.max_per_function;\n const mi = (s.maintainability_index as Record<string, unknown>)?.min_acceptable_score;\n const loc = (s.function_length as Record<string, unknown>)?.max_function_lines;\n\n if (cc !== undefined) policy.max_cyclomatic = Number(cc);\n if (cog !== undefined) policy.max_cognitive = Number(cog);\n if (mi !== undefined) policy.min_maintainability = Number(mi);\n if (loc !== undefined) policy.max_function_lines = Number(loc);\n applyCoverageThresholds(policy, s.test_coverage);\n }\n\n const codingRules = doc.coding_rules as Record<string, unknown> | undefined;\n const rules = codingRules?.rules as Record<string, unknown> | undefined;\n if (rules?.max_function_lines !== undefined) {\n policy.max_function_lines = Number(rules.max_function_lines);\n }\n}\n\nfunction applyEnvThresholds(policy: QualityPolicy): void {\n if (typeof process === 'undefined' || !process.env) return;\n const env = process.env;\n\n if (env.AI_SDLC_MAX_CYCLOMATIC) policy.max_cyclomatic = parseInt(env.AI_SDLC_MAX_CYCLOMATIC, 10);\n if (env.AI_SDLC_MAX_COGNITIVE) policy.max_cognitive = parseInt(env.AI_SDLC_MAX_COGNITIVE, 10);\n if (env.AI_SDLC_MIN_MAINTAINABILITY) policy.min_maintainability = parseFloat(env.AI_SDLC_MIN_MAINTAINABILITY);\n if (env.AI_SDLC_MAX_FUNCTION_LINES) policy.max_function_lines = parseInt(env.AI_SDLC_MAX_FUNCTION_LINES, 10);\n if (env.AI_SDLC_ENFORCE_MODE) policy.enforce_mode = env.AI_SDLC_ENFORCE_MODE;\n}\n\nfunction applyOptionOverrides(policy: QualityPolicy, overrides?: QualityThresholds): void {\n if (!overrides) return;\n if (overrides.max_cyclomatic !== undefined) policy.max_cyclomatic = Number(overrides.max_cyclomatic);\n if (overrides.max_cognitive !== undefined) policy.max_cognitive = Number(overrides.max_cognitive);\n if (overrides.min_maintainability !== undefined) policy.min_maintainability = Number(overrides.min_maintainability);\n if (overrides.max_function_lines !== undefined) policy.max_function_lines = Number(overrides.max_function_lines);\n if (overrides.enforce_mode !== undefined) policy.enforce_mode = overrides.enforce_mode;\n}\n\nexport function parseQualityPolicy(content: string, overrides?: QualityThresholds): QualityPolicy {\n const policy = createDefaultQualityPolicy();\n try {\n const doc = yaml.load(content);\n if (doc && typeof doc === 'object') {\n const record = doc as Record<string, unknown>;\n applyDocScope(policy, record);\n applyDocThresholds(policy, record);\n if (record.max_per_function !== undefined) policy.max_cyclomatic = Number(record.max_per_function);\n if (record.min_acceptable_score !== undefined) policy.min_maintainability = Number(record.min_acceptable_score);\n if (record.max_function_lines !== undefined) policy.max_function_lines = Number(record.max_function_lines);\n }\n } catch {\n // Keep defaults on YAML error\n }\n applyEnvThresholds(policy);\n applyOptionOverrides(policy, overrides);\n return policy;\n}\n\nexport function extractFunctions(content: string, filePath: string): FunctionMetrics[] {\n const ext = path.extname(filePath).toLowerCase();\n return TS_JS_EXTENSIONS.includes(ext)\n ? extractFunctionsTypeScriptAst(content, filePath)\n : extractFunctionsPolyglot(content, filePath);\n}\n\nexport function extractFunctionsBraceLanguages(content: string, filePath: string): FunctionMetrics[] {\n return extractFunctions(content, filePath);\n}\n\nexport function extractFunctionsPython(content: string, filePath: string): FunctionMetrics[] {\n return extractFunctionsPolyglot(content, filePath);\n}\n\nexport function calculateMetrics(fnBody: string, fnName: string, filePath: string): FunctionMetrics {\n const functions = extractFunctions(fnBody, filePath);\n if (functions.length > 0) {\n const matched = functions.find((f) => f.functionName === fnName) || functions[0];\n return { ...matched, functionName: fnName };\n }\n return {\n functionName: fnName,\n filePath,\n loc: 1,\n cyclomatic: 1,\n cognitive: 0,\n maintainability: 100,\n codeSmells: [],\n };\n}\n\nexport function walkDir(\n dir: string,\n extensions: readonly string[] = DEFAULT_EXTENSIONS,\n excludePatterns: readonly string[] = DEFAULT_EXCLUDES\n): string[] {\n let results: string[] = [];\n if (!fs.existsSync(dir)) return results;\n const list = fs.readdirSync(dir);\n for (const file of list) {\n const fullPath = path.join(dir, file);\n const stat = fs.statSync(fullPath);\n if (stat && stat.isDirectory()) {\n if (!excludePatterns.some((pattern) => file === pattern || fullPath.includes(pattern))) {\n results = results.concat(walkDir(fullPath, extensions, excludePatterns));\n }\n } else {\n const ext = path.extname(file).toLowerCase();\n if (extensions.includes(ext)) {\n results.push(fullPath);\n }\n }\n }\n return results;\n}\n\nfunction resolvePolicy(rootDir: string, options: QualityGateOptions): QualityPolicy {\n const policyFile = options.policyPath || path.join(rootDir, 'quality-policy.yaml');\n if (options.policy) {\n const policy = { ...options.policy };\n applyOptionOverrides(policy, options.thresholds);\n return policy;\n }\n if (fs.existsSync(policyFile)) {\n return parseQualityPolicy(fs.readFileSync(policyFile, 'utf-8'), options.thresholds);\n }\n return parseQualityPolicy('', options.thresholds);\n}\n\nfunction collectFilesToScan(rootDir: string, policy: QualityPolicy): string[] {\n const files: string[] = [];\n for (const targetDir of policy.target_directories) {\n const fullDir = path.join(rootDir, targetDir);\n if (fs.existsSync(fullDir)) {\n files.push(...walkDir(fullDir, policy.supported_extensions, policy.exclude_patterns));\n }\n }\n return files;\n}\n\nfunction evaluateViolations(fn: FunctionMetrics, policy: QualityPolicy): string[] {\n const violations: string[] = [];\n if (fn.cyclomatic > policy.max_cyclomatic) {\n violations.push(`Cyclomatic Complexity ${fn.cyclomatic} exceeds threshold of ${policy.max_cyclomatic}`);\n }\n if (fn.cognitive > policy.max_cognitive) {\n violations.push(`Cognitive Complexity ${fn.cognitive} exceeds threshold of ${policy.max_cognitive}`);\n }\n if (fn.maintainability < policy.min_maintainability) {\n violations.push(`Maintainability Index ${fn.maintainability} below minimum of ${policy.min_maintainability}`);\n }\n if (fn.loc > policy.max_function_lines) {\n violations.push(`Function lines ${fn.loc} exceeds maximum of ${policy.max_function_lines}`);\n }\n if (fn.codeSmells.length > 0) {\n violations.push(...fn.codeSmells);\n }\n return violations;\n}\n\nfunction evaluateFileQuality(file: string, rootDir: string, policy: QualityPolicy): AnalysisResult[] {\n const content = fs.readFileSync(file, 'utf-8');\n const fns = extractFunctions(content, file);\n return fns.map((fn) => {\n const violations = evaluateViolations(fn, policy);\n return {\n ...fn,\n relPath: path.relative(rootDir, file).replace(/\\\\/g, '/'),\n status: violations.length === 0 ? 'PASS' : 'FAIL',\n violations,\n };\n });\n}\n\nfunction buildQualityGateResult(\n results: AnalysisResult[],\n totalFiles: number,\n policy: QualityPolicy\n): QualityGateResult {\n const failCount = results.filter((r) => r.status === 'FAIL').length;\n const passCount = results.length - failCount;\n const violationsCount = results.reduce((acc, r) => acc + r.violations.length, 0);\n const success = policy.enforce_mode === 'STRICT' ? failCount === 0 : true;\n\n return {\n success,\n totalFiles,\n totalFunctions: results.length,\n passCount,\n failCount,\n violationsCount,\n results,\n policy,\n };\n}\n\nexport function verifyQualityGate(options: QualityGateOptions = {}): QualityGateResult {\n const rootDir = options.rootDir || process.cwd();\n const policy = resolvePolicy(rootDir, options);\n const allFiles = collectFilesToScan(rootDir, policy);\n const results: AnalysisResult[] = [];\n\n for (const file of allFiles) {\n try {\n results.push(...evaluateFileQuality(file, rootDir, policy));\n } catch {\n // Gracefully ignore unparseable files\n }\n }\n\n return buildQualityGateResult(results, allFiles.length, policy);\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nexport function walkMdFiles(\n dir: string,\n fileList: string[] = [],\n excludeDirs: string[] = [\n 'node_modules',\n '.git',\n 'dist',\n '.changeset',\n 'scratch',\n 'test-scaffold',\n 'fixtures',\n 'templates',\n 'examples',\n '.agent',\n '.agents',\n '.claude',\n '.cursor',\n '.github',\n '.vscode',\n ]\n): string[] {\n try {\n if (!fs.existsSync(dir)) return fileList;\n const files = fs.readdirSync(dir);\n for (const file of files) {\n const fullPath = path.join(dir, file);\n try {\n if (fs.statSync(fullPath).isDirectory()) {\n if (!excludeDirs.includes(file) && !file.startsWith('temp-') && !file.startsWith('.temp-')) {\n walkMdFiles(fullPath, fileList, excludeDirs);\n }\n } else if (file.endsWith('.md')) {\n fileList.push(fullPath);\n }\n } catch {\n // Ignore files unlinked concurrently\n }\n }\n } catch {\n // Ignore directories removed concurrently\n }\n return fileList;\n}\n","/**\n * AI-SDLC: Automated Gherkin to Cucumber (.feature) Extraction Engine\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {\n ExtractedFeature,\n GherkinExtractionOptions,\n GherkinExtractionResult,\n GherkinSyncCheckResult,\n} from '../types/index.js';\nimport { walkMdFiles } from '../utils/fs.js';\n\ninterface MarkdownFrontmatter {\n id?: string;\n version?: string;\n 'cucumber-feature-file'?: string;\n [key: string]: string | undefined;\n}\n\nexport function parseMarkdownFrontmatter(content: string): {\n frontmatter: MarkdownFrontmatter;\n body: string;\n} {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return { frontmatter: {}, body: content };\n\n const yamlLines = match[1].split('\\n');\n const frontmatter: MarkdownFrontmatter = {};\n\n for (const line of yamlLines) {\n const parts = line.split(':');\n if (parts.length >= 2) {\n const key = parts[0].trim();\n let val = parts.slice(1).join(':').trim();\n if ((val.startsWith('\"') && val.endsWith('\"')) || (val.startsWith(\"'\") && val.endsWith(\"'\"))) {\n val = val.substring(1, val.length - 1);\n }\n frontmatter[key] = val;\n }\n }\n\n const body = content.substring(match[0].length);\n return { frontmatter, body };\n}\n\nexport function extractGherkinBlock(body: string): string[] {\n const gherkinRegex = /```gherkin\\r?\\n([\\s\\S]*?)\\r?\\n```/g;\n const blocks: string[] = [];\n let match: RegExpExecArray | null;\n while ((match = gherkinRegex.exec(body)) !== null) {\n blocks.push(match[1].trim());\n }\n return blocks;\n}\n\nexport function resolveTargetFiles(rootDir: string, targetPath?: string): string[] {\n if (targetPath) {\n const fullTarget = path.isAbsolute(targetPath) ? targetPath : path.join(rootDir, targetPath);\n if (!fs.existsSync(fullTarget)) return [];\n return fs.statSync(fullTarget).isDirectory() ? walkMdFiles(fullTarget) : [fullTarget];\n }\n const searchDirs = [\n path.join(rootDir, 'product'),\n path.join(rootDir, 'security'),\n path.join(rootDir, 'specs'),\n path.join(rootDir, 'examples', 'product'),\n path.join(rootDir, 'examples', 'security'),\n path.join(rootDir, 'examples', 'specs'),\n ];\n return searchDirs.filter((d) => fs.existsSync(d)).flatMap((d) => walkMdFiles(d));\n}\n\nexport function resolveFeatureFilePath(\n rootDir: string,\n filePath: string,\n id: string,\n customTarget?: string\n): string {\n if (customTarget) {\n return path.isAbsolute(customTarget) ? customTarget : path.join(rootDir, customTarget);\n }\n const baseDir = path.join(rootDir, 'tests', 'features');\n const candidateSecurity = path.join(baseDir, 'security', `${id.toLowerCase()}.feature`);\n const candidateRoot = path.join(baseDir, `${id.toLowerCase()}.feature`);\n if (fs.existsSync(candidateSecurity)) return candidateSecurity;\n if (fs.existsSync(candidateRoot)) return candidateRoot;\n const subDir = filePath.includes('security') ? 'security' : '';\n return path.join(baseDir, subDir, `${id.toLowerCase()}.feature`);\n}\n\nexport function buildFeatureFileContent(\n rootDir: string,\n filePath: string,\n id: string,\n version: string | undefined,\n gherkinBlocks: string[]\n): string {\n const banner = [\n `# ==============================================================================`,\n `# AUTO-GENERADO POR AI-SDLC (Cucumber Integration)`,\n `# Origen: ${path.relative(rootDir, filePath).replace(/\\\\/g, '/')}`,\n `# ID Requerimiento: ${id}`,\n `# Versión: ${version || '1.0.0'}`,\n `# NO EDITAR MANUALMENTE: Cualquier cambio debe realizarse en el Markdown origen.`,\n `# ==============================================================================`,\n '',\n '',\n ].join('\\n');\n return banner + gherkinBlocks.join('\\n\\n') + '\\n';\n}\n\nfunction countScenarios(gherkinBlocks: string[]): number {\n let count = 0;\n for (const block of gherkinBlocks) {\n const matches = block.match(/\\b(Scenario|Escenario|Scenario Outline|Esquema del escenario):/g);\n if (matches) count += matches.length;\n }\n return count;\n}\n\nexport function extractGherkinFeatures(\n options: GherkinExtractionOptions = {}\n): GherkinExtractionResult {\n const rootDir = options.rootDir || process.cwd();\n const features: ExtractedFeature[] = [];\n let totalScenarios = 0;\n const targetFiles = resolveTargetFiles(rootDir, options.targetPath);\n\n for (const filePath of targetFiles) {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const { frontmatter, body } = parseMarkdownFrontmatter(content);\n const gherkinBlocks = extractGherkinBlock(body);\n if (gherkinBlocks.length === 0) continue;\n\n const id = frontmatter.id || path.basename(filePath, path.extname(filePath));\n const targetPath = resolveFeatureFilePath(rootDir, filePath, id, frontmatter['cucumber-feature-file']);\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\n\n const fullContent = buildFeatureFileContent(rootDir, filePath, id, frontmatter.version, gherkinBlocks);\n fs.writeFileSync(targetPath, fullContent, 'utf-8');\n\n const scenarioCount = countScenarios(gherkinBlocks);\n totalScenarios += scenarioCount;\n features.push({\n sourceFile: path.relative(rootDir, filePath).replace(/\\\\/g, '/'),\n outputFile: path.relative(rootDir, targetPath).replace(/\\\\/g, '/'),\n featureName: id,\n scenarioCount,\n });\n } catch {\n // Ignore unparseable files\n }\n }\n\n return { success: true, features, totalScenarios };\n}\n\nexport function checkGherkinInSync(\n options: GherkinExtractionOptions = {}\n): GherkinSyncCheckResult {\n const rootDir = options.rootDir || process.cwd();\n const targetFiles = resolveTargetFiles(rootDir, options.targetPath);\n const outOfSyncFiles: string[] = [];\n const missingFiles: string[] = [];\n let totalFeatures = 0;\n\n for (const filePath of targetFiles) {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const { frontmatter, body } = parseMarkdownFrontmatter(content);\n const gherkinBlocks = extractGherkinBlock(body);\n if (gherkinBlocks.length === 0) continue;\n\n totalFeatures++;\n const id = frontmatter.id || path.basename(filePath, path.extname(filePath));\n const targetPath = resolveFeatureFilePath(rootDir, filePath, id, frontmatter['cucumber-feature-file']);\n const relTarget = path.relative(rootDir, targetPath).replace(/\\\\/g, '/');\n\n if (!fs.existsSync(targetPath)) {\n missingFiles.push(relTarget);\n continue;\n }\n\n const expectedContent = buildFeatureFileContent(rootDir, filePath, id, frontmatter.version, gherkinBlocks);\n const actualContent = fs.readFileSync(targetPath, 'utf-8');\n if (actualContent.replace(/\\r\\n/g, '\\n') !== expectedContent.replace(/\\r\\n/g, '\\n')) {\n outOfSyncFiles.push(relTarget);\n }\n } catch {\n // Ignore unparseable files\n }\n }\n\n return {\n inSync: missingFiles.length === 0 && outOfSyncFiles.length === 0,\n outOfSyncFiles,\n missingFiles,\n totalFeatures,\n };\n}\n","/**\n * AI-SDLC: OpenSpec SDD Adapter\n * Manages OpenSpec change workspaces and deposits Product Handoff sidecars (HOF-*).\n * Aligns with @prodshape/integration-openspec.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport { ChangeProfile, ProductHandoff, SddValidationResult, SddWorkspaceInfo } from '../../types/index.js';\nimport { extractGherkinBlock } from '../../verifiers/gherkin.js';\nimport { SddAdapter } from './types.js';\n\nexport class OpenSpecAdapter implements SddAdapter {\n readonly framework = 'openspec' as const;\n\n getChangeWorkspaceDir(rootDir: string, changeId: string): string {\n // 1. Check for standard openspec path: openspec/changes/<changeId>\n const openspecDir = path.join(rootDir, 'openspec', 'changes', changeId);\n if (fs.existsSync(openspecDir)) return openspecDir;\n\n // 2. Check for AI-SDLC active change path: specs/changes/active/<changeId>\n const activeChangeDir = path.join(rootDir, 'specs', 'changes', 'active', changeId);\n if (fs.existsSync(activeChangeDir)) return activeChangeDir;\n\n // 3. Check for AI-SDLC completed change path: specs/changes/completed/<changeId>\n const completedChangeDir = path.join(rootDir, 'specs', 'changes', 'completed', changeId);\n if (fs.existsSync(completedChangeDir)) return completedChangeDir;\n\n // 4. Default: specs/changes/active/<changeId>\n return activeChangeDir;\n }\n\n depositSidecar(options: {\n rootDir: string;\n changeId: string;\n handoff: ProductHandoff;\n format?: 'yaml' | 'json';\n }): string {\n const changeDir = this.getChangeWorkspaceDir(options.rootDir, options.changeId);\n if (!fs.existsSync(changeDir)) {\n fs.mkdirSync(changeDir, { recursive: true });\n }\n\n const handoff = { ...options.handoff };\n if (!handoff.id.startsWith('HOF-')) {\n handoff.id = `HOF-${handoff.id}`;\n }\n if (!handoff.changeId) {\n handoff.changeId = options.changeId;\n }\n if (!handoff.createdAt) {\n handoff.createdAt = new Date().toISOString();\n }\n\n const filename = options.format === 'json' ? 'handoff.json' : 'handoff.yaml';\n const filePath = path.join(changeDir, filename);\n\n const content =\n options.format === 'json'\n ? JSON.stringify(handoff, null, 2)\n : yaml.dump(handoff, { indent: 2, lineWidth: -1 });\n\n fs.writeFileSync(filePath, content, 'utf-8');\n return filePath;\n }\n\n loadSidecar(changeWorkspaceDir: string): ProductHandoff | null {\n if (!fs.existsSync(changeWorkspaceDir)) return null;\n\n const candidateFiles = [\n 'handoff.yaml',\n 'handoff.yml',\n 'product-handoff.yaml',\n 'product-handoff.yml',\n '.handoff.yaml',\n 'handoff.json',\n 'product-handoff.json',\n ];\n\n for (const file of candidateFiles) {\n const fullPath = path.join(changeWorkspaceDir, file);\n if (fs.existsSync(fullPath)) {\n try {\n const raw = fs.readFileSync(fullPath, 'utf-8').replace(/^\\uFEFF/, '');\n const parsed = file.endsWith('.json') ? JSON.parse(raw) : (yaml.load(raw) as any);\n if (parsed && typeof parsed === 'object' && parsed.id && String(parsed.id).startsWith('HOF-')) {\n return parsed as ProductHandoff;\n }\n } catch {\n // Ignore invalid parse attempt, try next\n }\n }\n }\n\n return null;\n }\n\n validateWorkspace(changeWorkspaceDir: string): SddValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!fs.existsSync(changeWorkspaceDir)) {\n return {\n valid: false,\n errors: [`El directorio del cambio OpenSpec no existe: ${changeWorkspaceDir}`],\n warnings: [],\n };\n }\n\n const changeId = path.basename(changeWorkspaceDir);\n\n const proposalFile = path.join(changeWorkspaceDir, 'proposal.md');\n const specFile = path.join(changeWorkspaceDir, 'spec.md');\n const designFile = path.join(changeWorkspaceDir, 'design.md');\n const tasksFile = path.join(changeWorkspaceDir, 'tasks.md');\n\n let profile: ChangeProfile = 'standard';\n if (fs.existsSync(specFile)) {\n try {\n const rawSpec = fs.readFileSync(specFile, 'utf-8').replace(/^\\uFEFF/, '');\n const match = rawSpec.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (match) {\n const parsedFm = yaml.load(match[1]) as any;\n if (parsedFm && parsedFm.profile && ['patch', 'standard', 'critical'].includes(parsedFm.profile)) {\n profile = parsedFm.profile as ChangeProfile;\n }\n }\n } catch {\n // ignore parse error\n }\n }\n\n if (!fs.existsSync(specFile)) {\n errors.push(`Falta el archivo obligatorio 'spec.md' en ${changeWorkspaceDir}.`);\n } else {\n try {\n const rawSpec = fs.readFileSync(specFile, 'utf-8').replace(/^\\uFEFF/, '');\n const match = rawSpec.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (match) {\n const parsedFm = yaml.load(match[1]) as any;\n if (parsedFm && parsedFm['acceptance-format'] && parsedFm['acceptance-format'] !== 'gherkin') {\n errors.push(\n `El archivo 'spec.md' declara acceptance-format '${parsedFm['acceptance-format']}', pero el estándar obligatorio es 'gherkin'.`\n );\n }\n if (parsedFm && parsedFm['acceptance-format'] === 'gherkin') {\n const blocks = extractGherkinBlock(rawSpec);\n if (blocks.length === 0) {\n errors.push(\n `El archivo 'spec.md' en ${changeWorkspaceDir} declara 'acceptance-format: gherkin' pero no incluye ningún bloque de especificación ejecutable (\\`\\`\\`gherkin ... \\`\\`\\`).`\n );\n }\n }\n }\n } catch {\n // ignore parse error\n }\n }\n\n let sidecarFile: string | undefined;\n let handoff: ProductHandoff | null = null;\n\n if (profile === 'patch') {\n handoff = this.loadSidecar(changeWorkspaceDir);\n if (handoff) {\n sidecarFile = path.join(changeWorkspaceDir, 'handoff.yaml');\n }\n } else {\n if (!fs.existsSync(proposalFile)) {\n warnings.push(`Falta 'proposal.md' en el espacio de trabajo OpenSpec.`);\n }\n if (!fs.existsSync(tasksFile)) {\n errors.push(`Falta el archivo obligatorio 'tasks.md' en ${changeWorkspaceDir}.`);\n }\n\n handoff = this.loadSidecar(changeWorkspaceDir);\n if (!handoff) {\n errors.push(\n `Falta el archivo de acompañamiento (sidecar) 'handoff.yaml' con identificador 'HOF-*' en ${changeWorkspaceDir}.`\n );\n } else {\n if (!handoff.subgraph || !Array.isArray(handoff.subgraph.requirements)) {\n errors.push(`El sidecar '${handoff.id}' no define un subgrafo de requerimientos válido.`);\n }\n sidecarFile = path.join(changeWorkspaceDir, 'handoff.yaml');\n }\n }\n\n const workspace: SddWorkspaceInfo = {\n framework: this.framework,\n changeId,\n changeDir: changeWorkspaceDir,\n profile,\n proposalFile: fs.existsSync(proposalFile) ? proposalFile : undefined,\n specFile: fs.existsSync(specFile) ? specFile : undefined,\n designFile: fs.existsSync(designFile) ? designFile : undefined,\n tasksFile: fs.existsSync(tasksFile) ? tasksFile : undefined,\n sidecarFile,\n handoff: handoff || undefined,\n };\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n workspace,\n };\n }\n}\n","/**\n * AI-SDLC: Spec Kit SDD Adapter\n * Manages GitHub Spec Kit workspaces and deposits Product Handoff sidecars (HOF-*).\n * Aligns with @prodshape/integration-speckit.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport { ChangeProfile, ProductHandoff, SddValidationResult, SddWorkspaceInfo } from '../../types/index.js';\nimport { extractGherkinBlock } from '../../verifiers/gherkin.js';\nimport { SddAdapter } from './types.js';\n\nexport class SpecKitAdapter implements SddAdapter {\n readonly framework = 'speckit' as const;\n\n getChangeWorkspaceDir(rootDir: string, changeId: string): string {\n // 1. Spec Kit convention: specs/<changeId>\n const standardDir = path.join(rootDir, 'specs', changeId);\n if (fs.existsSync(standardDir)) return standardDir;\n\n // 2. Active changes path: specs/changes/active/<changeId>\n const activeChangeDir = path.join(rootDir, 'specs', 'changes', 'active', changeId);\n if (fs.existsSync(activeChangeDir)) return activeChangeDir;\n\n // 3. Completed changes path: specs/changes/completed/<changeId>\n const completedChangeDir = path.join(rootDir, 'specs', 'changes', 'completed', changeId);\n if (fs.existsSync(completedChangeDir)) return completedChangeDir;\n\n // 4. Default: specs/<changeId>\n return standardDir;\n }\n\n depositSidecar(options: {\n rootDir: string;\n changeId: string;\n handoff: ProductHandoff;\n format?: 'yaml' | 'json';\n }): string {\n const changeDir = this.getChangeWorkspaceDir(options.rootDir, options.changeId);\n if (!fs.existsSync(changeDir)) {\n fs.mkdirSync(changeDir, { recursive: true });\n }\n\n const handoff = { ...options.handoff };\n if (!handoff.id.startsWith('HOF-')) {\n handoff.id = `HOF-${handoff.id}`;\n }\n if (!handoff.changeId) {\n handoff.changeId = options.changeId;\n }\n if (!handoff.createdAt) {\n handoff.createdAt = new Date().toISOString();\n }\n\n const filename = options.format === 'json' ? 'handoff.json' : 'handoff.yaml';\n const filePath = path.join(changeDir, filename);\n\n const content =\n options.format === 'json'\n ? JSON.stringify(handoff, null, 2)\n : yaml.dump(handoff, { indent: 2, lineWidth: -1 });\n\n fs.writeFileSync(filePath, content, 'utf-8');\n\n // Also mirror to .specify/memory/<changeId>.handoff.yaml if .specify/ directory exists\n const specifyMemoryDir = path.join(options.rootDir, '.specify', 'memory');\n if (fs.existsSync(path.join(options.rootDir, '.specify'))) {\n if (!fs.existsSync(specifyMemoryDir)) {\n fs.mkdirSync(specifyMemoryDir, { recursive: true });\n }\n fs.writeFileSync(path.join(specifyMemoryDir, `${options.changeId}.handoff.yaml`), content, 'utf-8');\n }\n\n return filePath;\n }\n\n loadSidecar(changeWorkspaceDir: string): ProductHandoff | null {\n if (!fs.existsSync(changeWorkspaceDir)) return null;\n\n const candidateFiles = [\n 'handoff.yaml',\n 'handoff.yml',\n 'product-handoff.yaml',\n 'product-handoff.yml',\n '.handoff.yaml',\n 'handoff.json',\n ];\n\n for (const file of candidateFiles) {\n const fullPath = path.join(changeWorkspaceDir, file);\n if (fs.existsSync(fullPath)) {\n try {\n const raw = fs.readFileSync(fullPath, 'utf-8').replace(/^\\uFEFF/, '');\n const parsed = file.endsWith('.json') ? JSON.parse(raw) : (yaml.load(raw) as any);\n if (parsed && typeof parsed === 'object' && parsed.id && String(parsed.id).startsWith('HOF-')) {\n return parsed as ProductHandoff;\n }\n } catch {\n // Ignore invalid parse attempt, try next\n }\n }\n }\n\n return null;\n }\n\n validateWorkspace(changeWorkspaceDir: string): SddValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!fs.existsSync(changeWorkspaceDir)) {\n return {\n valid: false,\n errors: [`El directorio del cambio Spec Kit no existe: ${changeWorkspaceDir}`],\n warnings: [],\n };\n }\n\n const changeId = path.basename(changeWorkspaceDir);\n\n const specFile = path.join(changeWorkspaceDir, 'spec.md');\n const planFile = path.join(changeWorkspaceDir, 'plan.md');\n const tasksFile = path.join(changeWorkspaceDir, 'tasks.md');\n\n let profile: ChangeProfile = 'standard';\n if (fs.existsSync(specFile)) {\n try {\n const rawSpec = fs.readFileSync(specFile, 'utf-8').replace(/^\\uFEFF/, '');\n const match = rawSpec.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (match) {\n const parsedFm = yaml.load(match[1]) as any;\n if (parsedFm && parsedFm.profile && ['patch', 'standard', 'critical'].includes(parsedFm.profile)) {\n profile = parsedFm.profile as ChangeProfile;\n }\n }\n } catch {\n // ignore parse error\n }\n }\n\n if (!fs.existsSync(specFile)) {\n errors.push(`Falta el archivo de especificación obligatorio 'spec.md' en ${changeWorkspaceDir}.`);\n } else {\n try {\n const rawSpec = fs.readFileSync(specFile, 'utf-8').replace(/^\\uFEFF/, '');\n const match = rawSpec.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (match) {\n const parsedFm = yaml.load(match[1]) as any;\n if (parsedFm && parsedFm['acceptance-format'] && parsedFm['acceptance-format'] !== 'gherkin') {\n errors.push(\n `El archivo 'spec.md' declara acceptance-format '${parsedFm['acceptance-format']}', pero el estándar obligatorio es 'gherkin'.`\n );\n }\n if (parsedFm && parsedFm['acceptance-format'] === 'gherkin') {\n const blocks = extractGherkinBlock(rawSpec);\n if (blocks.length === 0) {\n errors.push(\n `El archivo 'spec.md' en ${changeWorkspaceDir} declara 'acceptance-format: gherkin' pero no incluye ningún bloque de especificación ejecutable (\\`\\`\\`gherkin ... \\`\\`\\`).`\n );\n }\n }\n }\n } catch {\n // ignore parse error\n }\n }\n\n let sidecarFile: string | undefined;\n let handoff: ProductHandoff | null = null;\n\n if (profile === 'patch') {\n handoff = this.loadSidecar(changeWorkspaceDir);\n if (handoff) {\n sidecarFile = path.join(changeWorkspaceDir, 'handoff.yaml');\n }\n } else {\n if (!fs.existsSync(tasksFile)) {\n errors.push(`Falta el archivo de tareas obligatorio 'tasks.md' en ${changeWorkspaceDir}.`);\n }\n if (!fs.existsSync(planFile)) {\n warnings.push(`Se recomienda incluir 'plan.md' en el espacio de trabajo Spec Kit.`);\n }\n\n handoff = this.loadSidecar(changeWorkspaceDir);\n if (!handoff) {\n errors.push(\n `Falta el archivo de acompañamiento (sidecar) 'handoff.yaml' con identificador 'HOF-*' en ${changeWorkspaceDir}.`\n );\n } else {\n if (!handoff.subgraph || !Array.isArray(handoff.subgraph.requirements)) {\n errors.push(`El sidecar '${handoff.id}' no define un subgrafo de requerimientos válido.`);\n }\n sidecarFile = path.join(changeWorkspaceDir, 'handoff.yaml');\n }\n }\n\n const workspace: SddWorkspaceInfo = {\n framework: this.framework,\n changeId,\n changeDir: changeWorkspaceDir,\n profile,\n specFile: fs.existsSync(specFile) ? specFile : undefined,\n designFile: fs.existsSync(planFile) ? planFile : undefined,\n tasksFile: fs.existsSync(tasksFile) ? tasksFile : undefined,\n sidecarFile,\n handoff: handoff || undefined,\n };\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n workspace,\n };\n }\n}\n","/**\n * AI-SDLC: SDD Change Integration & Canonical Specification Promotion Engine\n * Ensures that changes implemented in SDD workspaces are correctly integrated\n * into canonical specifications (Product, Requirements, and Architecture arc42/NAF v4).\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n ChangeDetectionOptions,\n ChangeDetectionResult,\n ProductHandoff,\n SddIntegrationAudit,\n SddIntegrationOptions,\n SddIntegrationResult,\n} from '../../types/index.js';\nimport { walkMdFiles } from '../../utils/fs.js';\nimport { parseFrontmatter } from '../../verifiers/traceability.js';\nimport { loadProductHandoffSidecar } from './index.js';\n\ninterface TaskParsed {\n id: string;\n title?: string;\n status?: string;\n}\n\nexport function parseTasksFromContent(content: string): TaskParsed[] {\n const tasks: TaskParsed[] = [];\n const { frontmatter } = parseFrontmatter(content);\n\n if (frontmatter && Array.isArray(frontmatter.tasks)) {\n for (const t of frontmatter.tasks as any[]) {\n if (t && typeof t === 'object' && t.id) {\n tasks.push({\n id: String(t.id),\n title: t.title ? String(t.title) : undefined,\n status: t.status ? String(t.status).toUpperCase() : undefined,\n });\n }\n }\n }\n\n // Also match markdown task checkboxes if no frontmatter tasks found\n if (tasks.length === 0) {\n const lines = content.split('\\n');\n let index = 1;\n for (const line of lines) {\n const trimmed = line.trim();\n const match = trimmed.match(/^-\\s+\\[([ xX])\\]\\s+(?:`([^`]+)`\\s*:?\\s*)?(.*)$/);\n if (match) {\n const isDone = match[1].toLowerCase() === 'x';\n const taskId = match[2] || `TSK-${String(index).padStart(3, '0')}`;\n tasks.push({\n id: taskId,\n title: match[3],\n status: isDone ? 'COMPLETED' : 'PENDING',\n });\n index++;\n }\n }\n }\n\n return tasks;\n}\n\nexport function appendRevisionHistoryRow(\n body: string,\n entry: { version: string; date: string; author: string; description: string; reference: string }\n): string {\n // Check if reference already recorded in table\n if (body.includes(entry.reference)) {\n return body;\n }\n\n const tableHeaderMatch = body.match(\n /(\\|\\s*Versi[oó]n\\s*\\|\\s*Fecha\\s*\\|\\s*Autor[^\\n]*\\r?\\n\\|[\\s\\-:|]+\\r?\\n)/i\n );\n\n const newRow = `| **${entry.version}** | ${entry.date} | ${entry.author} | ${entry.description} | ${entry.reference} |\\n`;\n\n if (tableHeaderMatch && tableHeaderMatch.index !== undefined) {\n const insertPos = tableHeaderMatch.index + tableHeaderMatch[0].length;\n return body.substring(0, insertPos) + newRow + body.substring(insertPos);\n }\n\n // If table header not found, append section at the end\n const newSection = `\\n\\n## Historial de Revisiones\\n\\n| Versión | Fecha | Autor / Agente | Descripción del Cambio | Referencia de Cambio (Change/PR) |\\n| :--- | :--- | :--- | :--- | :--- |\\n${newRow}`;\n return body + newSection;\n}\n\n\n// --- Canonical Artifact Materialization ---\n\n\ninterface SpecCatalogNewItem {\n id: string;\n targetDir: string;\n category: string;\n scope: string;\n}\n\ninterface SpecCatalogAffectedItem {\n id: string;\n action: 'MODIFIED' | 'DEPRECATED';\n category: string;\n}\n\nexport interface SpecCatalogScope {\n newItems: SpecCatalogNewItem[];\n affectedItems: SpecCatalogAffectedItem[];\n}\n\n/**\n * Parses a spec.md using the canonical template format to extract:\n * - Section 1.1: existing catalog items that are MODIFIED or DEPRECATED\n * - Section 1.2: new catalog items to be physically materialized\n *\n * Returns empty arrays when the spec uses the simplified format (no 1.1 / 1.2 headings).\n */\nexport function parseSpecCatalogScope(specContent: string): SpecCatalogScope {\n const newItems: SpecCatalogNewItem[] = [];\n const affectedItems: SpecCatalogAffectedItem[] = [];\n\n // Locate section 1.1 and 1.2 blocks by heading\n const section11Match = specContent.match(/###\\s+1\\.1\\s+Affected Existing Catalog Items[^\\n]*\\n([\\s\\S]*?)(?=\\n###\\s+1\\.2|\\n---|\\n##\\s|$)/i);\n const section12Match = specContent.match(/###\\s+1\\.2\\s+New Catalog Items Introduced[^\\n]*\\n([\\s\\S]*?)(?=\\n---|\\n##\\s|\\n###\\s+[^1]|$)/i);\n\n // Parse section 1.1 — table rows: | Category | `ID` | `ACTION` | Description |\n if (section11Match) {\n const tableRows = section11Match[1].split('\\n').filter(l => l.trim().startsWith('|'));\n for (const row of tableRows) {\n // Skip header and separator rows\n if (/^\\|\\s*:?-+:?\\s*\\|/.test(row) || /Catalog Category/.test(row)) continue;\n const cols = row.split('|').map(c => c.trim()).filter(Boolean);\n if (cols.length < 3) continue;\n const rawId = cols[1].replace(/`/g, '').trim();\n const rawAction = cols[2].replace(/`/g, '').trim().toUpperCase();\n if (!rawId || !rawAction) continue;\n if (rawAction === 'MODIFIED' || rawAction === 'DEPRECATED') {\n affectedItems.push({ id: rawId, action: rawAction as 'MODIFIED' | 'DEPRECATED', category: cols[0] });\n }\n }\n }\n\n // Parse section 1.2 — table rows: | Category | `ID` | `target/dir/` | Scope |\n if (section12Match) {\n const tableRows = section12Match[1].split('\\n').filter(l => l.trim().startsWith('|'));\n for (const row of tableRows) {\n if (/^\\|\\s*:?-+:?\\s*\\|/.test(row) || /Catalog Category/.test(row)) continue;\n const cols = row.split('|').map(c => c.trim()).filter(Boolean);\n if (cols.length < 3) continue;\n const rawId = cols[1].replace(/`/g, '').trim();\n const rawDir = cols[2].replace(/`/g, '').trim();\n if (!rawId || !rawDir) continue;\n newItems.push({ id: rawId, targetDir: rawDir, category: cols[0], scope: cols[3] || '' });\n }\n }\n\n return { newItems, affectedItems };\n}\n\n/**\n * Writes a new canonical artifact file with valid frontmatter and empty revision table.\n * Only runs if the target file does not already exist (idempotent).\n */\nfunction materializeCanonicalArtifact(\n rootDir: string,\n item: SpecCatalogNewItem,\n changeId: string,\n author: string,\n date: string\n): string {\n const targetPath = path.join(rootDir, item.targetDir, `${item.id}.md`);\n if (fs.existsSync(targetPath)) return targetPath;\n\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\n\n const typeMap: Record<string, string> = {\n 'product/requirements/': 'requirement',\n 'product/use-cases/': 'use-case',\n 'product/actors/': 'actor',\n 'product/business-rules/': 'business-rule',\n 'product/journeys/': 'journey',\n 'security/requirements/': 'security-requirement',\n 'architecture/': 'component',\n };\n const artifactType = typeMap[item.targetDir] || 'artifact';\n const frontmatter = `id: ${item.id}\\ntype: ${artifactType}\\nstatus: draft\\nversion: \"1.0.0\"\\n`;\n const title = item.scope || item.id;\n const revisionRow = `| **1.0.0** | ${date} | ${author} | Creación inicial desde ${changeId} | ${changeId} |\\n`;\n const body = `# ${item.id}: ${title}\\n\\n## Historial de Revisiones\\n\\n| Versión | Fecha | Autor / Agente | Descripción del Cambio | Referencia de Cambio (Change/PR) |\\n| :--- | :--- | :--- | :--- | :--- |\\n${revisionRow}`;\n\n fs.writeFileSync(targetPath, `---\\n${frontmatter}---\\n${body}`, 'utf-8');\n return targetPath;\n}\n\nexport function findChangeWorkspaceDir(rootDir: string, changeId: string): string | null {\n const candidateDirs = [\n path.join(rootDir, 'specs', 'changes', 'active', changeId),\n path.join(rootDir, 'specs', changeId),\n path.join(rootDir, 'openspec', 'changes', changeId),\n path.join(rootDir, 'specs', 'changes', 'completed', changeId),\n ];\n\n for (const dir of candidateDirs) {\n if (fs.existsSync(dir)) return dir;\n }\n\n return null;\n}\n\nexport function integrateSddChange(options: SddIntegrationOptions): SddIntegrationResult {\n const rootDir = options.rootDir || process.cwd();\n const changeId = options.changeId;\n const author = options.author || 'AI-SDLC Integration Engine';\n const date = options.date || new Date().toISOString().split('T')[0];\n const autoArchive = options.autoArchive !== false;\n\n const errors: string[] = [];\n const updatedProductArtifacts: string[] = [];\n const updatedArchitectureArtifacts: string[] = [];\n\n // 1. Locate change workspace\n const changeDir = findChangeWorkspaceDir(rootDir, changeId);\n if (!changeDir) {\n return {\n success: false,\n changeId,\n completedTasks: [],\n pendingTasks: [],\n integratedRequirements: [],\n updatedProductArtifacts: [],\n updatedArchitectureArtifacts: [],\n archived: false,\n errors: [`No se encontró el espacio de trabajo para el cambio '${changeId}'.`],\n };\n }\n\n // 2. Parse tasks.md to identify implemented vs pending tasks\n const tasksFile = path.join(changeDir, 'tasks.md');\n const allTasks: TaskParsed[] = [];\n if (fs.existsSync(tasksFile)) {\n const tasksContent = fs.readFileSync(tasksFile, 'utf-8');\n allTasks.push(...parseTasksFromContent(tasksContent));\n }\n\n const completedTasks = allTasks.filter((t) => t.status === 'COMPLETED').map((t) => t.id);\n const pendingTasks = allTasks.filter((t) => t.status !== 'COMPLETED').map((t) => t.id);\n\n // Bloquear integración si existen tareas pendientes o no completadas\n if (pendingTasks.length > 0) {\n return {\n success: false,\n changeId,\n completedTasks,\n pendingTasks,\n integratedRequirements: [],\n updatedProductArtifacts: [],\n updatedArchitectureArtifacts: [],\n archived: false,\n errors: [\n `No se puede integrar el cambio '${changeId}' porque existen ${pendingTasks.length} tareas pendientes o bloqueadas (${pendingTasks.join(\n ', '\n )}). Todas las tareas deben estar en estado COMPLETED antes de consolidar en la especificación canónica.`,\n ],\n };\n }\n\n // 3. Load sidecar HOF-* or fallback to proposal citations\n let handoff: ProductHandoff | null = loadProductHandoffSidecar(changeDir);\n\n if (!handoff) {\n // Attempt to extract from proposal.md\n const proposalFile = path.join(changeDir, 'proposal.md');\n if (fs.existsSync(proposalFile)) {\n const propContent = fs.readFileSync(proposalFile, 'utf-8');\n const { frontmatter } = parseFrontmatter(propContent);\n const citations = Array.isArray(frontmatter.citations) ? (frontmatter.citations as any[]) : [];\n const reqs = citations.map((c) => c.id).filter((id: string) => id.startsWith('FR-') || id.startsWith('QR-') || id.startsWith('CON-') || id.startsWith('SEC-REQ-'));\n handoff = {\n id: `HOF-${changeId.toUpperCase()}`,\n type: 'handoff',\n changeId,\n subgraph: {\n requirements: reqs,\n },\n citations,\n };\n }\n }\n\n if (!handoff || !handoff.subgraph) {\n return {\n success: false,\n changeId,\n completedTasks,\n pendingTasks,\n integratedRequirements: [],\n updatedProductArtifacts: [],\n updatedArchitectureArtifacts: [],\n archived: false,\n errors: [`El cambio '${changeId}' no posee un sidecar 'handoff.yaml' ni citaciones válidas en proposal.md.`],\n };\n }\n\n // 4. Determine which requirements are implemented\n // \"integra todo lo implementado\": integrate all requirements declared in the handoff subgraph\n const targetReqs = [\n ...(handoff.subgraph.requirements || []),\n ...(handoff.subgraph.securityRequirements || []),\n ];\n\n // 4.5 Materialize new canonical artifacts declared in spec.md section 1.2\n const createdCanonicalArtifacts: string[] = [];\n const specFile = path.join(changeDir, 'spec.md');\n if (fs.existsSync(specFile)) {\n const specContent = fs.readFileSync(specFile, 'utf-8');\n const { newItems } = parseSpecCatalogScope(specContent);\n for (const item of newItems) {\n try {\n materializeCanonicalArtifact(rootDir, item, changeId, author, date);\n createdCanonicalArtifacts.push(item.id);\n } catch (err: any) {\n errors.push(`Error materializando artefacto canónico '${item.id}': ${err.message}`);\n }\n }\n }\n\n // 5. Scan all markdown files to find canonical target files\n const allMdFiles = walkMdFiles(rootDir);\n const canonicalArtifacts = new Map<string, { file: string; frontmatter: any; body: string }>();\n\n for (const file of allMdFiles) {\n const relFile = path.relative(rootDir, file).replace(/\\\\/g, '/');\n // Skip change folders and templates\n if (relFile.includes('specs/changes/') || relFile.includes('templates/')) continue;\n\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const { frontmatter, body } = parseFrontmatter(content);\n if (frontmatter.id) {\n canonicalArtifacts.set(String(frontmatter.id), { file, frontmatter, body });\n }\n } catch {\n // Ignore\n }\n }\n\n // 6. Integrate Product & Requirements Artifacts\n for (const reqId of targetReqs) {\n if (createdCanonicalArtifacts.includes(reqId)) continue; // newly materialized — leave as draft\n const canonical = canonicalArtifacts.get(reqId);\n if (canonical) {\n try {\n const fm = canonical.frontmatter;\n let modified = false;\n\n if (fm.status !== 'active') {\n fm.status = 'active';\n modified = true;\n }\n\n const taskDesc =\n completedTasks.length > 0\n ? `Implementación verificada (${completedTasks.join(', ')})`\n : `Integración de especificación`;\n\n const updatedBody = appendRevisionHistoryRow(canonical.body, {\n version: String(fm.version || '1.0.0'),\n date,\n author,\n description: taskDesc,\n reference: changeId,\n });\n\n if (updatedBody !== canonical.body || modified) {\n const yamlHeader = `---\\n${yaml.dump(fm, { indent: 2, lineWidth: -1 }).trim()}\\n---\\n`;\n fs.writeFileSync(canonical.file, yamlHeader + updatedBody, 'utf-8');\n updatedProductArtifacts.push(reqId);\n }\n } catch (err: any) {\n errors.push(`Error actualizando artefacto canónico '${reqId}': ${err.message}`);\n }\n }\n }\n\n // 7. Integrate Architecture Components & Views (arc42 / NAF v4)\n // Identify cited architecture components in handoff or proposal\n const citedComponents: string[] = [];\n if (handoff.citations) {\n for (const c of handoff.citations) {\n const citeId = (c as any).targetId || (c as any).id;\n if (\n citeId &&\n (citeId.startsWith('CMP-') ||\n citeId.startsWith('SEC-ENC-') ||\n citeId.startsWith('ADR-'))\n ) {\n citedComponents.push(citeId);\n }\n }\n }\n\n // If no components cited directly in citations, search canonical components that implement target requirements\n for (const [artId, art] of canonicalArtifacts.entries()) {\n if (artId.startsWith('CMP-') && art.frontmatter) {\n const satisfies = Array.isArray(art.frontmatter['satisfies-requirements'])\n ? (art.frontmatter['satisfies-requirements'] as string[])\n : [];\n if (targetReqs.some((r) => satisfies.includes(r))) {\n if (!citedComponents.includes(artId)) citedComponents.push(artId);\n }\n }\n }\n\n for (const cmpId of citedComponents) {\n const canonical = canonicalArtifacts.get(cmpId);\n if (canonical) {\n try {\n const fm = canonical.frontmatter;\n let modified = false;\n\n // Ensure satisfies-requirements includes target requirements\n if (cmpId.startsWith('CMP-')) {\n const existingSatisfies = Array.isArray(fm['satisfies-requirements'])\n ? [...fm['satisfies-requirements']]\n : [];\n for (const req of targetReqs) {\n if (!existingSatisfies.includes(req)) {\n existingSatisfies.push(req);\n modified = true;\n }\n }\n fm['satisfies-requirements'] = existingSatisfies;\n }\n\n const updatedBody = appendRevisionHistoryRow(canonical.body, {\n version: String(fm.version || '1.0.0'),\n date,\n author,\n description: `Integración de incremento de entrega ${changeId}`,\n reference: changeId,\n });\n\n if (updatedBody !== canonical.body || modified) {\n const yamlHeader = `---\\n${yaml.dump(fm, { indent: 2, lineWidth: -1 }).trim()}\\n---\\n`;\n fs.writeFileSync(canonical.file, yamlHeader + updatedBody, 'utf-8');\n updatedArchitectureArtifacts.push(cmpId);\n }\n } catch (err: any) {\n errors.push(`Error actualizando componente de arquitectura '${cmpId}': ${err.message}`);\n }\n }\n }\n\n // 8. Archiving / Promotion of Change Workspace\n let archived = false;\n let archivedPath: string | undefined;\n\n const isActiveFolder = changeDir.includes('specs' + path.sep + 'changes' + path.sep + 'active');\n const allTasksCompleted = allTasks.length > 0 && pendingTasks.length === 0;\n\n if (allTasksCompleted && autoArchive && isActiveFolder) {\n const completedParent = path.join(rootDir, 'specs', 'changes', 'completed');\n if (!fs.existsSync(completedParent)) {\n fs.mkdirSync(completedParent, { recursive: true });\n }\n\n const destDir = path.join(completedParent, changeId);\n if (fs.existsSync(destDir)) {\n fs.rmSync(destDir, { recursive: true, force: true });\n }\n\n // Move folder\n fs.renameSync(changeDir, destDir);\n archived = true;\n archivedPath = destDir;\n\n // Update proposal.md status to applied\n const destProposal = path.join(destDir, 'proposal.md');\n if (fs.existsSync(destProposal)) {\n const content = fs.readFileSync(destProposal, 'utf-8');\n const { frontmatter, body } = parseFrontmatter(content);\n frontmatter.status = 'applied';\n const newContent = `---\\n${yaml.dump(frontmatter, { indent: 2, lineWidth: -1 }).trim()}\\n---\\n` + body;\n fs.writeFileSync(destProposal, newContent, 'utf-8');\n }\n } else {\n // Update proposal status or add integration note\n const proposalFile = path.join(changeDir, 'proposal.md');\n if (fs.existsSync(proposalFile)) {\n const content = fs.readFileSync(proposalFile, 'utf-8');\n const { frontmatter, body } = parseFrontmatter(content);\n if (allTasksCompleted) {\n frontmatter.status = 'completed';\n }\n const newContent = `---\\n${yaml.dump(frontmatter, { indent: 2, lineWidth: -1 }).trim()}\\n---\\n` + body;\n fs.writeFileSync(proposalFile, newContent, 'utf-8');\n }\n }\n\n return {\n success: errors.length === 0,\n changeId,\n completedTasks,\n pendingTasks,\n integratedRequirements: targetReqs,\n updatedProductArtifacts,\n updatedArchitectureArtifacts,\n createdCanonicalArtifacts,\n archived,\n archivedPath,\n errors,\n };\n}\n\nexport function verifySddIntegration(options: { rootDir?: string } = {}): {\n success: boolean;\n audits: SddIntegrationAudit[];\n errors: string[];\n} {\n const rootDir = options.rootDir || process.cwd();\n const audits: SddIntegrationAudit[] = [];\n const errors: string[] = [];\n\n // Look for changes in specs/changes/active and specs/changes/completed\n const searchDirs = [\n path.join(rootDir, 'specs', 'changes', 'completed'),\n path.join(rootDir, 'specs', 'changes', 'active'),\n ];\n\n // Scan all canonical requirements\n const allMdFiles = walkMdFiles(rootDir);\n const canonicalMap = new Map<string, any>();\n for (const file of allMdFiles) {\n const rel = path.relative(rootDir, file).replace(/\\\\/g, '/');\n if (rel.includes('specs/changes/') || rel.includes('templates/')) continue;\n try {\n const { frontmatter, body } = parseFrontmatter(fs.readFileSync(file, 'utf-8'));\n if (frontmatter.id) {\n canonicalMap.set(String(frontmatter.id), { file, frontmatter, body });\n }\n } catch {}\n }\n\n for (const parent of searchDirs) {\n if (!fs.existsSync(parent)) continue;\n const entries = fs.readdirSync(parent, { withFileTypes: true });\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const changeDir = path.join(parent, e.name);\n const handoff = loadProductHandoffSidecar(changeDir);\n if (!handoff) continue;\n\n const tasksFile = path.join(changeDir, 'tasks.md');\n const tasks: TaskParsed[] = fs.existsSync(tasksFile)\n ? parseTasksFromContent(fs.readFileSync(tasksFile, 'utf-8'))\n : [];\n\n const completed = tasks.filter((t) => t.status === 'COMPLETED');\n const targetReqs = handoff.subgraph?.requirements || [];\n const integrated: string[] = [];\n const missing: string[] = [];\n const gaps: string[] = [];\n\n for (const reqId of targetReqs) {\n const canonical = canonicalMap.get(reqId);\n if (!canonical) {\n missing.push(reqId);\n gaps.push(`El requerimiento '${reqId}' no existe en la especificación canónica.`);\n } else {\n // Check if canonical reflects active status\n if (canonical.frontmatter.status !== 'active') {\n gaps.push(`El requerimiento '${reqId}' no tiene status: active en la especificación canónica.`);\n }\n integrated.push(reqId);\n }\n }\n\n let status: 'FULLY_INTEGRATED' | 'PARTIALLY_INTEGRATED' | 'UNINTEGRATED' = 'UNINTEGRATED';\n if (integrated.length === targetReqs.length && gaps.length === 0) {\n status = 'FULLY_INTEGRATED';\n } else if (integrated.length > 0) {\n status = 'PARTIALLY_INTEGRATED';\n }\n\n if (gaps.length > 0) {\n errors.push(`[${e.name}] Desalineación: ${gaps.join('; ')}`);\n }\n\n audits.push({\n changeId: e.name,\n status,\n completedTasksCount: completed.length,\n totalTasksCount: tasks.length,\n integratedRequirements: integrated,\n missingRequirements: missing,\n gaps,\n });\n }\n }\n\n return {\n success: errors.length === 0,\n audits,\n errors,\n };\n}\n\nfunction matchesFolderOrPrefix(folder: string, candidate: string): boolean {\n const fLower = folder.toLowerCase();\n const cLower = candidate.toLowerCase();\n if (fLower === cLower || cLower.includes(fLower)) return true;\n const fPrefix = fLower.match(/^([a-z0-9]+-[0-9]+)/);\n const cPrefix = cLower.match(/([a-z0-9]+-[0-9]+)/);\n return Boolean(fPrefix && cPrefix && fPrefix[1] === cPrefix[1]);\n}\n\nfunction resolveMatchFromMetadata(\n activeFolders: string[],\n options: ChangeDetectionOptions\n): { changeId?: string; source?: ChangeDetectionResult['source']; reason?: string } {\n const hasSpecificFilter = Boolean(\n options.headRef ||\n (options.changedFiles && options.changedFiles.length > 0) ||\n options.prTitle ||\n options.prBody\n );\n\n if (options.headRef) {\n const found = activeFolders.find((f) => matchesFolderOrPrefix(f, options.headRef!));\n if (found) return { changeId: found, source: 'branch', reason: `Coincidencia por rama origen '${options.headRef}'.` };\n }\n if (options.changedFiles && options.changedFiles.length > 0) {\n for (const file of options.changedFiles) {\n const match = file.replace(/\\\\/g, '/').match(/specs\\/changes\\/active\\/([^/]+)/);\n if (match && activeFolders.includes(match[1])) {\n return { changeId: match[1], source: 'files', reason: `Coincidencia por archivo modificado '${file}'.` };\n }\n }\n }\n if (options.prTitle) {\n const found = activeFolders.find((f) => matchesFolderOrPrefix(f, options.prTitle!));\n if (found) return { changeId: found, source: 'title', reason: `Coincidencia por título del PR '${options.prTitle}'.` };\n }\n if (options.prBody) {\n const found = activeFolders.find((f) => matchesFolderOrPrefix(f, options.prBody!));\n if (found) return { changeId: found, source: 'body', reason: `Coincidencia por mención en cuerpo del PR.` };\n }\n if (!hasSpecificFilter && activeFolders.length === 1) {\n return { changeId: activeFolders[0], source: 'single_active_completed', reason: `Único cambio activo disponible '${activeFolders[0]}'.` };\n }\n return {};\n}\n\n/**\n * Detect which active SDD change should be integrated in a CI/CD pipeline\n * upon PR merge to main or release branches.\n */\nexport function detectActiveChangeForIntegration(\n options: ChangeDetectionOptions = {}\n): ChangeDetectionResult {\n const rootDir = options.rootDir || process.cwd();\n const activeParent = path.join(rootDir, 'specs', 'changes', 'active');\n if (!fs.existsSync(activeParent)) {\n return { detected: false, reasons: [`No existe el directorio de cambios activos en '${activeParent}'.`] };\n }\n\n const entries = fs.readdirSync(activeParent, { withFileTypes: true });\n const activeFolders = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n if (activeFolders.length === 0) {\n return { detected: false, reasons: ['No se encontraron carpetas de cambios activos en specs/changes/active/.'] };\n }\n\n const match = resolveMatchFromMetadata(activeFolders, options);\n if (!match.changeId) {\n return {\n detected: false,\n reasons: [`No se correlacionó ningún cambio activo (${activeFolders.join(', ')}) con los metadatos suministrados.`],\n };\n }\n\n const changeDir = path.join(activeParent, match.changeId);\n const tasksFile = path.join(changeDir, 'tasks.md');\n const tasks = fs.existsSync(tasksFile) ? parseTasksFromContent(fs.readFileSync(tasksFile, 'utf-8')) : [];\n const completed = tasks.filter((t) => t.status === 'COMPLETED');\n const allCompleted = tasks.length > 0 && completed.length === tasks.length;\n\n return {\n detected: true,\n changeId: match.changeId,\n source: match.source,\n changeDir,\n allTasksCompleted: allCompleted,\n completedTasksCount: completed.length,\n totalTasksCount: tasks.length,\n reasons: match.reason ? [match.reason] : [],\n };\n}\n\n","/**\n * AI-SDLC: Product Definition as Code (PDaC) Graph & Cryptographic Drift Verifier\n */\n\nimport * as crypto from 'crypto';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {\n PdacDrift,\n PdacGraphOptions,\n PdacGraphResult,\n PdacNode,\n PdacSyncDetail,\n PdacSyncOptions,\n PdacSyncResult,\n} from '../types/index.js';\nimport { walkMdFiles } from '../utils/fs.js';\n\nexport function computeCanonicalSha256(content: string): string {\n // Normalize newlines to LF for deterministic hashing\n const normalized = content.replace(/\\r\\n/g, '\\n');\n return crypto.createHash('sha256').update(normalized, 'utf-8').digest('hex');\n}\n\nexport function parseFrontmatterId(content: string): { id?: string; type?: string; title?: string } {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return {};\n\n const lines = match[1].split('\\n');\n let id: string | undefined;\n let type: string | undefined;\n let title: string | undefined;\n\n for (const line of lines) {\n const parts = line.split(':');\n if (parts.length >= 2) {\n const key = parts[0].trim();\n const val = parts.slice(1).join(':').trim().replace(/^[\"']|[\"']$/g, '');\n if (key === 'id') id = val;\n if (key === 'type') type = val;\n if (key === 'title') title = val;\n }\n }\n\n return { id, type, title };\n}\n\ninterface CitationEntry {\n targetId: string;\n expectedDigest?: string;\n anchor?: string;\n sourceFile: string;\n}\n\nexport function extractCitations(content: string, sourceFile: string): CitationEntry[] {\n const citations: CitationEntry[] = [];\n const lines = content.split('\\n');\n\n let inCitations = false;\n let currentTarget: string | null = null;\n let currentDigest: string | undefined;\n let currentAnchor: string | undefined;\n\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (!line || line.startsWith('#')) continue;\n\n if (line.startsWith('citations:')) {\n inCitations = true;\n continue;\n }\n\n if (inCitations) {\n if (line.endsWith(':') && !line.startsWith('- ') && !line.startsWith('id:') && !line.startsWith('digest:') && !line.startsWith('anchor:') && !line.startsWith('comment:')) {\n inCitations = false;\n if (currentTarget) {\n citations.push({ targetId: currentTarget, expectedDigest: currentDigest, anchor: currentAnchor, sourceFile });\n currentTarget = null;\n currentDigest = undefined;\n currentAnchor = undefined;\n }\n continue;\n }\n\n if (line.startsWith('- id:')) {\n if (currentTarget) {\n citations.push({ targetId: currentTarget, expectedDigest: currentDigest, anchor: currentAnchor, sourceFile });\n }\n currentTarget = line.split(':')[1].replace(/['\"]/g, '').trim();\n currentDigest = undefined;\n currentAnchor = undefined;\n } else if (currentTarget) {\n if (line.startsWith('digest:')) {\n let dig = line.split(':').slice(1).join(':').replace(/['\"]/g, '').trim();\n if (dig.startsWith('sha256:')) dig = dig.substring(7);\n currentDigest = dig;\n } else if (line.startsWith('anchor:')) {\n currentAnchor = line.split(':')[1].replace(/['\"]/g, '').trim();\n }\n }\n }\n }\n\n if (currentTarget) {\n citations.push({ targetId: currentTarget, expectedDigest: currentDigest, anchor: currentAnchor, sourceFile });\n }\n\n return citations;\n}\n\n\n\nexport function generatePdacReportMarkdown(\n nodes: PdacNode[],\n drifts: PdacDrift[],\n unresolvedCount: number\n): string {\n const isOk = drifts.length === 0 && unresolvedCount === 0;\n const lines: string[] = [\n `# 🔒 PDaC Cryptographic Matrix and Drift Detection (Anti-Drift)`,\n ``,\n `> **Evaluation Date:** ${new Date().toISOString()}`,\n `> **Verdict:** ${isOk ? '✅ ALIGNED (0 Cryptographic drifts detected)' : `❌ DRIFT DETECTED (${drifts.length} Digest misalignments)`}`,\n ``,\n `---`,\n ``,\n `## 1. Canonical Baseline Nodes (${nodes.length})`,\n ``,\n `| Artifact ID | Type | Title | SHA-256 Digest (Baseline) |`,\n `| :--- | :--- | :--- | :--- |`,\n ];\n\n for (const n of nodes) {\n lines.push(`| **\\`${n.id}\\`** | \\`${n.type}\\` | ${n.title || 'Untitled'} | \\`sha256:${n.digest.substring(0, 16)}...\\` |`);\n }\n\n if (drifts.length > 0) {\n lines.push('');\n lines.push('---');\n lines.push('');\n lines.push('## 2. Cryptographic Drifts Detected (Status: STALE)');\n lines.push('');\n lines.push('| Consumer File | Cited ID | Expected Digest in Spec | Actual Digest in Baseline |');\n lines.push('| :--- | :--- | :--- | :--- |');\n for (const d of drifts) {\n lines.push(\n `| \\`${d.sourceFile}\\` | **\\`${d.targetId}\\`** | \\`sha256:${d.expectedDigest.substring(0, 12)}...\\` | \\`sha256:${d.actualDigest.substring(0, 12)}...\\` |`\n );\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function verifyPdacGraph(options: PdacGraphOptions = {}): PdacGraphResult {\n const rootDir = options.rootDir || process.cwd();\n const allMdFiles = walkMdFiles(rootDir);\n\n const baselineMap = new Map<string, PdacNode>();\n const allCitations: CitationEntry[] = [];\n\n for (const file of allMdFiles) {\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const { id, type, title } = parseFrontmatterId(content);\n const digest = computeCanonicalSha256(content);\n const relFile = path.relative(rootDir, file).replace(/\\\\/g, '/');\n\n if (id) {\n const citations = extractCitations(content, relFile);\n baselineMap.set(id, {\n id,\n type: type || 'artifact',\n filePath: relFile,\n title,\n digest,\n rawContent: content,\n citations: citations.map((c) => ({\n targetId: c.targetId,\n expectedDigest: c.expectedDigest,\n anchor: c.anchor,\n })),\n });\n }\n\n // Also collect citations from specs, sdd, delivery, and change directories (ignore templates/ and process/)\n const isDeliveryDoc =\n (relFile.startsWith('specs/') ||\n relFile.startsWith('sdd/') ||\n relFile.startsWith('delivery/') ||\n relFile.startsWith('changes/') ||\n relFile.includes('/specs/')) &&\n !relFile.includes('.template.');\n if (isDeliveryDoc) {\n const fileCitations = extractCitations(content, relFile);\n allCitations.push(...fileCitations);\n }\n } catch {\n // Ignore unparseable files\n }\n }\n\n const drifts: PdacDrift[] = [];\n let unresolvedCount = 0;\n\n for (const citation of allCitations) {\n const targetNode = baselineMap.get(citation.targetId);\n if (!targetNode) {\n unresolvedCount++;\n continue;\n }\n\n if (citation.expectedDigest) {\n if (citation.expectedDigest !== targetNode.digest) {\n drifts.push({\n sourceId: citation.sourceFile,\n targetId: citation.targetId,\n sourceFile: citation.sourceFile,\n expectedDigest: citation.expectedDigest,\n actualDigest: targetNode.digest,\n });\n }\n }\n }\n\n const nodes = Array.from(baselineMap.values());\n const reportMarkdown = generatePdacReportMarkdown(nodes, drifts, unresolvedCount);\n\n return {\n success: drifts.length === 0,\n totalNodes: nodes.length,\n totalEdges: allCitations.length,\n drifts,\n reportMarkdown,\n };\n}\n\nexport function updateCitationsInContent(\n content: string,\n baselineMap: Map<string, PdacNode>,\n sourceFile: string,\n details: PdacSyncDetail[]\n): { updatedContent: string; changed: boolean } {\n const lines = content.split(/\\r?\\n/);\n let changed = false;\n let inCitations = false;\n let currentTarget: string | null = null;\n const newLines: string[] = [];\n\n for (const rawLine of lines) {\n const trimmed = rawLine.trim();\n\n if (trimmed.startsWith('citations:')) {\n inCitations = true;\n newLines.push(rawLine);\n continue;\n }\n\n if (inCitations) {\n if (\n trimmed.endsWith(':') &&\n !trimmed.startsWith('- ') &&\n !trimmed.startsWith('id:') &&\n !trimmed.startsWith('digest:') &&\n !trimmed.startsWith('anchor:') &&\n !trimmed.startsWith('comment:')\n ) {\n inCitations = false;\n currentTarget = null;\n newLines.push(rawLine);\n continue;\n }\n\n if (trimmed.startsWith('- id:')) {\n currentTarget = trimmed.split(':')[1].replace(/['\"]/g, '').trim();\n newLines.push(rawLine);\n continue;\n }\n\n if (currentTarget && trimmed.startsWith('digest:')) {\n const targetNode = baselineMap.get(currentTarget);\n if (targetNode) {\n let currentDig = trimmed.split(':').slice(1).join(':').replace(/['\"]/g, '').trim();\n const hadShaPrefix = currentDig.startsWith('sha256:');\n if (hadShaPrefix) currentDig = currentDig.substring(7);\n const hasQuotes = trimmed.includes('\"') || trimmed.includes(\"'\");\n\n if (currentDig !== targetNode.digest) {\n const indent = rawLine.match(/^\\s*/)?.[0] || ' ';\n const prefix = hadShaPrefix ? 'sha256:' : '';\n const val = `${prefix}${targetNode.digest}`;\n const newLine = hasQuotes ? `${indent}digest: \"${val}\"` : `${indent}digest: ${val}`;\n newLines.push(newLine);\n changed = true;\n details.push({\n sourceFile,\n targetId: currentTarget,\n previousDigest: currentDig,\n newDigest: targetNode.digest,\n });\n continue;\n }\n }\n }\n }\n\n newLines.push(rawLine);\n }\n\n const eol = content.includes('\\r\\n') ? '\\r\\n' : '\\n';\n return { updatedContent: newLines.join(eol), changed };\n}\n\nexport function syncPdacDigests(options: PdacSyncOptions = {}): PdacSyncResult {\n const rootDir = options.rootDir || process.cwd();\n const allMdFiles = walkMdFiles(rootDir);\n const baselineMap = new Map<string, PdacNode>();\n\n for (const file of allMdFiles) {\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const { id, type, title } = parseFrontmatterId(content);\n if (id) {\n const digest = computeCanonicalSha256(content);\n const relFile = path.relative(rootDir, file).replace(/\\\\/g, '/');\n baselineMap.set(id, {\n id,\n type: type || 'artifact',\n filePath: relFile,\n title,\n digest,\n rawContent: content,\n citations: [],\n });\n }\n } catch {\n // Ignore unparseable files\n }\n }\n\n const details: PdacSyncDetail[] = [];\n const updatedFiles: string[] = [];\n const candidateFiles: string[] = [];\n\n if (options.targetPath) {\n const fullTarget = path.isAbsolute(options.targetPath) ? options.targetPath : path.join(rootDir, options.targetPath);\n if (fs.existsSync(fullTarget)) {\n if (fs.statSync(fullTarget).isDirectory()) candidateFiles.push(...walkMdFiles(fullTarget));\n else candidateFiles.push(fullTarget);\n }\n } else {\n for (const file of allMdFiles) {\n const relFile = path.relative(rootDir, file).replace(/\\\\/g, '/');\n const isDeliveryDoc =\n (relFile.startsWith('specs/') ||\n relFile.startsWith('sdd/') ||\n relFile.startsWith('delivery/') ||\n relFile.startsWith('changes/') ||\n relFile.includes('/specs/')) &&\n !relFile.includes('.template.');\n if (isDeliveryDoc) candidateFiles.push(file);\n }\n }\n\n for (const file of candidateFiles) {\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const relFile = path.relative(rootDir, file).replace(/\\\\/g, '/');\n const { updatedContent, changed } = updateCitationsInContent(content, baselineMap, relFile, details);\n if (changed) {\n fs.writeFileSync(file, updatedContent, 'utf-8');\n updatedFiles.push(relFile);\n }\n } catch {\n // Ignore unreadable or unwritable files\n }\n }\n\n return {\n success: true,\n syncedCount: details.length,\n updatedFiles,\n details,\n };\n}\n","/**\n * AI-SDLC: Deterministic Artifact Schema Verifier\n * Validates YAML frontmatters of product, security, architecture, manual, and safety artifacts\n * against canonical JSON Schema specifications (Draft 2020-12).\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n ArtifactSchemaOptions,\n ArtifactSchemaResult,\n ArtifactSchemaViolation,\n ArtifactValidationResult,\n} from '../types/index.js';\nimport { walkMdFiles } from '../utils/fs.js';\n\nexport const TYPE_TO_SCHEMA_MAP: Record<string, string> = {\n // Product\n actor: 'schemas/product/actor.schema.json',\n 'business-rule': 'schemas/product/business-rule.schema.json',\n journey: 'schemas/product/journey.schema.json',\n requirement: 'schemas/product/requirement.schema.json',\n term: 'schemas/product/term.schema.json',\n 'use-case': 'schemas/product/use-case.schema.json',\n\n // Security\n 'abuse-case': 'schemas/security/abuse-case.schema.json',\n 'security-enclave': 'schemas/security/enclave.schema.json',\n 'security-requirement': 'schemas/security/security-req.schema.json',\n 'threat-actor': 'schemas/security/threat-actor.schema.json',\n\n // Architecture\n 'architecture-decision-record': 'schemas/architecture/adr.schema.json',\n component: 'schemas/architecture/component.schema.json',\n\n // Safety\n hazard: 'schemas/safety/hazard.schema.json',\n 'safety-requirement': 'schemas/safety/safety-req.schema.json',\n\n // Manuals\n 'user-manual': 'schemas/manuals/user-manual.schema.json',\n 'production-manual': 'schemas/manuals/production-manual.schema.json',\n\n // SDD\n tasks: 'schemas/sdd/tasks.schema.json',\n handoff: 'schemas/sdd/handoff.schema.json',\n 'spec-change-proposal': 'schemas/sdd/proposal.schema.json',\n proposal: 'schemas/sdd/proposal.schema.json',\n 'spec-design': 'schemas/sdd/design.schema.json',\n 'spec-change-design': 'schemas/sdd/design.schema.json',\n design: 'schemas/sdd/design.schema.json',\n 'delivery-spec': 'schemas/sdd/spec.schema.json',\n spec: 'schemas/sdd/spec.schema.json',\n 'release-kpis': 'schemas/sdd/release-kpis.schema.json',\n 'session-telemetry': 'schemas/sdd/session-telemetry.schema.json',\n\n // Compliance\n 'license-manifest': 'schemas/compliance/license-manifest.schema.json',\n\n // Workflow\n 'agent-handoff': 'schemas/workflow/agent-handoff.schema.json',\n\n // IDE\n 'mcp-config': 'schemas/ide/mcp-config.schema.json',\n};\n\nconst PREFIX_TAXONOMY: Array<[string, string]> = [\n ['ACT-THREAT-', 'threat-actor'],\n ['ACT-', 'actor'],\n ['UC-', 'use-case'],\n ['BR-', 'business-rule'],\n ['FR-', 'requirement'],\n ['QR-', 'requirement'],\n ['CON-', 'requirement'],\n ['JRN-', 'journey'],\n ['TERM-', 'term'],\n ['ABUSE-', 'abuse-case'],\n ['SEC-ENC-', 'security-enclave'],\n ['SEC-REQ-', 'security-requirement'],\n ['HAZ-', 'hazard'],\n ['SAF-REQ-', 'safety-requirement'],\n ['SAF-', 'safety-requirement'],\n ['ADR-', 'architecture-decision-record'],\n ['CMP-', 'component'],\n ['MAN-USER-', 'user-manual'],\n ['MAN-PROD-', 'production-manual'],\n ['MAN-LIC-', 'license-manifest'],\n ['LIC-MAN-', 'license-manifest'],\n ['LIC-', 'license-manifest'],\n ['TSK-', 'tasks'],\n ['HOF-WORKFLOW-', 'agent-handoff'],\n ['AHOF-', 'agent-handoff'],\n ['HOF-', 'handoff'],\n ['SPEC-', 'delivery-spec'],\n ['DSG-', 'spec-design'],\n ['CHG-', 'spec-change-proposal'],\n ['PATCH-', 'spec-change-proposal'],\n ['PROP-', 'spec-change-proposal'],\n ['KPI-REL-', 'release-kpis'],\n ['REL-KPI-', 'release-kpis'],\n ['TEL-SES-', 'session-telemetry'],\n ['SES-TEL-', 'session-telemetry'],\n ['TEL-', 'session-telemetry'],\n ['MCP-CFG-', 'mcp-config'],\n ['IDE-MCP-', 'mcp-config'],\n ['MCP-', 'mcp-config'],\n];\n\nexport function inferArtifactTypeFromId(id: string): string | null {\n for (const [prefix, type] of PREFIX_TAXONOMY) {\n if (id.startsWith(prefix)) {\n return type;\n }\n }\n return null;\n}\n\nexport function extractFrontmatter(content: string): Record<string, unknown> | null {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return null;\n try {\n const parsed = yaml.load(match[1]);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport interface JsonSchemaRule {\n type?: string | string[];\n const?: unknown;\n enum?: unknown[];\n pattern?: string;\n minLength?: number;\n maxLength?: number;\n minimum?: number;\n maximum?: number;\n minItems?: number;\n maxItems?: number;\n items?: JsonSchemaRule;\n required?: string[];\n properties?: Record<string, JsonSchemaRule>;\n additionalProperties?: boolean | JsonSchemaRule;\n oneOf?: JsonSchemaRule[];\n anyOf?: JsonSchemaRule[];\n format?: string;\n [key: string]: unknown;\n}\n\n/**\n * Deterministic JSON Schema validator matching Draft 2020-12 core specifications\n */\nexport function validateAgainstSchema(\n value: unknown,\n schema: JsonSchemaRule,\n propPath = ''\n): string[] {\n const errors: string[] = [];\n const currentProp = propPath || 'root';\n\n // 1. const validation\n if (schema.const !== undefined && value !== schema.const) {\n errors.push(`'${currentProp}' must equal '${schema.const}', received '${String(value)}'`);\n return errors;\n }\n\n // 2. enum validation\n if (schema.enum !== undefined && !schema.enum.includes(value)) {\n errors.push(\n `'${currentProp}' must be one of [${schema.enum.join(', ')}], received '${String(value)}'`\n );\n return errors;\n }\n\n // 3. oneOf validation\n if (schema.oneOf) {\n let matchCount = 0;\n for (const sub of schema.oneOf) {\n if (validateAgainstSchema(value, sub, propPath).length === 0) {\n matchCount++;\n }\n }\n if (matchCount !== 1) {\n errors.push(`'${currentProp}' must match exactly one sub-schema in oneOf`);\n }\n return errors;\n }\n\n // 4. anyOf validation\n if (schema.anyOf) {\n const anyMatched = schema.anyOf.some(\n (sub) => validateAgainstSchema(value, sub, propPath).length === 0\n );\n if (!anyMatched) {\n errors.push(`'${currentProp}' did not match any allowed alternative in anyOf`);\n }\n return errors;\n }\n\n // 5. type validation\n if (schema.type !== undefined) {\n const allowedTypes = Array.isArray(schema.type) ? schema.type : [schema.type];\n let actualType: string = typeof value;\n if (value === null) actualType = 'null';\n else if (Array.isArray(value)) actualType = 'array';\n else if (actualType === 'number' && Number.isInteger(value)) actualType = 'integer';\n\n const matchesType = allowedTypes.some((t) => {\n if (t === actualType) return true;\n if (t === 'number' && actualType === 'integer') return true;\n return false;\n });\n\n if (!matchesType) {\n errors.push(\n `'${currentProp}' expected type [${allowedTypes.join('|')}], received '${actualType}'`\n );\n return errors;\n }\n }\n\n // If null and allowed, skip further string/number/object checks\n if (value === null) {\n return errors;\n }\n\n // 6. String validations\n if (typeof value === 'string') {\n if (schema.minLength !== undefined && value.length < schema.minLength) {\n errors.push(`'${currentProp}' length must be >= ${schema.minLength}`);\n }\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n errors.push(`'${currentProp}' length must be <= ${schema.maxLength}`);\n }\n if (schema.pattern !== undefined) {\n const regex = new RegExp(schema.pattern);\n if (!regex.test(value)) {\n errors.push(`'${currentProp}' value '${value}' does not match pattern ${schema.pattern}`);\n }\n }\n if (schema.format === 'date') {\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n if (!dateRegex.test(value) || isNaN(Date.parse(value))) {\n errors.push(`'${currentProp}' must be a valid ISO-8601 date string (YYYY-MM-DD)`);\n }\n }\n }\n\n // 7. Number validations\n if (typeof value === 'number') {\n if (schema.minimum !== undefined && value < schema.minimum) {\n errors.push(`'${currentProp}' must be >= ${schema.minimum}`);\n }\n if (schema.maximum !== undefined && value > schema.maximum) {\n errors.push(`'${currentProp}' must be <= ${schema.maximum}`);\n }\n }\n\n // 8. Array validations\n if (Array.isArray(value)) {\n if (schema.minItems !== undefined && value.length < schema.minItems) {\n errors.push(`'${currentProp}' items count must be >= ${schema.minItems}`);\n }\n if (schema.maxItems !== undefined && value.length > schema.maxItems) {\n errors.push(`'${currentProp}' items count must be <= ${schema.maxItems}`);\n }\n if (schema.items) {\n value.forEach((item, idx) => {\n errors.push(...validateAgainstSchema(item, schema.items!, `${currentProp}[${idx}]`));\n });\n }\n }\n\n // 9. Object validations\n if (typeof value === 'object' && !Array.isArray(value)) {\n const record = value as Record<string, unknown>;\n\n // Check required fields\n if (schema.required) {\n for (const reqKey of schema.required) {\n if (!(reqKey in record) || record[reqKey] === undefined) {\n errors.push(`'${currentProp}' missing required field '${reqKey}'`);\n }\n }\n }\n\n // Check properties\n const properties = schema.properties || {};\n for (const [key, propVal] of Object.entries(record)) {\n if (key in properties) {\n errors.push(\n ...validateAgainstSchema(\n propVal,\n properties[key],\n propPath ? `${propPath}.${key}` : key\n )\n );\n } else if (schema.additionalProperties === false) {\n errors.push(`'${currentProp}' contains disallowed extra property '${key}'`);\n } else if (typeof schema.additionalProperties === 'object') {\n errors.push(\n ...validateAgainstSchema(\n propVal,\n schema.additionalProperties as JsonSchemaRule,\n propPath ? `${propPath}.${key}` : key\n )\n );\n }\n }\n }\n\n return errors;\n}\n\nexport function resolveSchemaForArtifact(\n frontmatter: Record<string, unknown>,\n rootDir: string\n): { schemaPath: string; schema: JsonSchemaRule } | null {\n const type =\n (frontmatter.type as string) ||\n (typeof frontmatter.id === 'string' ? inferArtifactTypeFromId(frontmatter.id) : null);\n\n if (!type || !TYPE_TO_SCHEMA_MAP[type]) {\n return null;\n }\n\n const relSchemaPath = TYPE_TO_SCHEMA_MAP[type];\n let fullSchemaPath = path.join(rootDir, relSchemaPath);\n if (!fs.existsSync(fullSchemaPath)) {\n const fallbackPath = path.join(process.cwd(), relSchemaPath);\n if (fs.existsSync(fallbackPath)) {\n fullSchemaPath = fallbackPath;\n } else {\n return null;\n }\n }\n\n try {\n const raw = fs.readFileSync(fullSchemaPath, 'utf-8');\n const schema = JSON.parse(raw) as JsonSchemaRule;\n return { schemaPath: relSchemaPath, schema };\n } catch {\n return null;\n }\n}\n\nexport function validateArtifactSchema(\n frontmatter: Record<string, unknown>,\n schemaOrType: string | JsonSchemaRule,\n rootDir: string = process.cwd()\n): ArtifactValidationResult {\n let schema: JsonSchemaRule | null = null;\n let schemaId: string | undefined;\n\n if (typeof schemaOrType === 'string') {\n if (schemaOrType.endsWith('.json')) {\n let fullPath = path.isAbsolute(schemaOrType)\n ? schemaOrType\n : path.join(rootDir, schemaOrType);\n if (!fs.existsSync(fullPath)) {\n const fallbackPath = path.join(process.cwd(), schemaOrType);\n if (fs.existsSync(fallbackPath)) {\n fullPath = fallbackPath;\n }\n }\n if (fs.existsSync(fullPath)) {\n schema = JSON.parse(fs.readFileSync(fullPath, 'utf-8'));\n schemaId = schemaOrType;\n }\n } else if (TYPE_TO_SCHEMA_MAP[schemaOrType]) {\n const relPath = TYPE_TO_SCHEMA_MAP[schemaOrType];\n let fullPath = path.join(rootDir, relPath);\n if (!fs.existsSync(fullPath)) {\n const fallbackPath = path.join(process.cwd(), relPath);\n if (fs.existsSync(fallbackPath)) {\n fullPath = fallbackPath;\n }\n }\n if (fs.existsSync(fullPath)) {\n schema = JSON.parse(fs.readFileSync(fullPath, 'utf-8'));\n schemaId = relPath;\n }\n }\n }\n else {\n schema = schemaOrType;\n schemaId = (schema as { $id?: string }).$id;\n }\n\n if (!schema) {\n return {\n valid: false,\n filePath: '',\n id: frontmatter.id as string | undefined,\n type: frontmatter.type as string | undefined,\n errors: [`Schema could not be resolved for '${String(schemaOrType)}'`],\n };\n }\n\n const errors = validateAgainstSchema(frontmatter, schema);\n return {\n valid: errors.length === 0,\n filePath: '',\n id: frontmatter.id as string | undefined,\n type: frontmatter.type as string | undefined,\n schemaId,\n errors,\n };\n}\n\nexport function verifyArtifactsSchemas(\n options: ArtifactSchemaOptions = {}\n): ArtifactSchemaResult {\n const rootDir = options.rootDir || process.cwd();\n let filesToScan: string[] = [];\n\n if (options.targetPath) {\n const target = path.isAbsolute(options.targetPath)\n ? options.targetPath\n : path.join(rootDir, options.targetPath);\n if (fs.existsSync(target)) {\n if (fs.statSync(target).isDirectory()) {\n filesToScan = walkMdFiles(target);\n } else if (target.endsWith('.md')) {\n filesToScan = [target];\n }\n }\n } else {\n filesToScan = walkMdFiles(rootDir);\n }\n\n const violations: ArtifactSchemaViolation[] = [];\n const results: ArtifactValidationResult[] = [];\n let validCount = 0;\n let totalEvaluated = 0;\n\n for (const file of filesToScan) {\n const relPath = path.relative(rootDir, file).replace(/\\\\/g, '/');\n\n // Skip root-level markdown documents, process guides, reports, changesets, scratch, templates (unless explicitly targeted), and test temps\n if (\n relPath.startsWith('process/') ||\n relPath.startsWith('reports/') ||\n relPath.startsWith('.changeset/') ||\n relPath.startsWith('scratch/') ||\n relPath.startsWith('node_modules/') ||\n relPath.startsWith('dist/') ||\n (!options.targetPath && relPath.startsWith('templates/')) ||\n relPath.startsWith('temp-') ||\n relPath.startsWith('test-') ||\n !relPath.includes('/')\n ) {\n continue;\n }\n\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const frontmatter = extractFrontmatter(content);\n if (!frontmatter || !frontmatter.id) {\n continue;\n }\n\n const schemaInfo = resolveSchemaForArtifact(frontmatter, rootDir);\n if (!schemaInfo) {\n continue;\n }\n\n totalEvaluated++;\n const errors = validateAgainstSchema(frontmatter, schemaInfo.schema);\n const isValid = errors.length === 0;\n\n if (isValid) {\n validCount++;\n results.push({\n valid: true,\n filePath: relPath,\n id: String(frontmatter.id),\n type: String(frontmatter.type || ''),\n schemaId: schemaInfo.schemaPath,\n errors: [],\n });\n } else {\n results.push({\n valid: false,\n filePath: relPath,\n id: String(frontmatter.id),\n type: String(frontmatter.type || ''),\n schemaId: schemaInfo.schemaPath,\n errors,\n });\n\n for (const err of errors) {\n violations.push({\n filePath: relPath,\n id: String(frontmatter.id),\n type: String(frontmatter.type || ''),\n schemaId: schemaInfo.schemaPath,\n message: err,\n });\n }\n }\n } catch (err: unknown) {\n violations.push({\n filePath: relPath,\n message: `Failed to read or parse frontmatter: ${String(err)}`,\n });\n }\n }\n\n return {\n success: violations.length === 0,\n totalEvaluated,\n validCount,\n invalidCount: violations.length > 0 ? totalEvaluated - validCount : 0,\n violations,\n results,\n };\n}\n","/**\n * AI-SDLC: SDD Change Scaffolding Engine\n * Automates deterministic creation of active SDD workspaces, populating\n * proposal.md, spec.md, design.md, tasks.md, and depositing the HOF-* sidecar.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n ChangeProfile,\n ProductHandoff,\n SddChangeScaffoldOptions,\n SddChangeScaffoldResult,\n} from '../../types/index.js';\nimport { walkMdFiles } from '../../utils/fs.js';\nimport { extractGherkinBlock } from '../../verifiers/gherkin.js';\nimport { computeCanonicalSha256 } from '../../verifiers/pdac-graph.js';\nimport { validateArtifactSchema } from '../../verifiers/schemas.js';\nimport { parseFrontmatter } from '../../verifiers/traceability.js';\nimport { depositProductHandoffSidecar, getSddAdapter } from './index.js';\n\nexport function slugify(text: string): string {\n return text\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nexport function getNextCorrelativeNumber(rootDir: string): number {\n const candidateDirs = [\n path.join(rootDir, 'specs', 'changes', 'active'),\n path.join(rootDir, 'specs', 'changes', 'completed'),\n path.join(rootDir, 'specs'),\n path.join(rootDir, 'openspec', 'changes'),\n ];\n\n let maxNum = 0;\n\n for (const dir of candidateDirs) {\n if (!fs.existsSync(dir)) continue;\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const match = e.name.match(/^(?:chg|CHG|patch|PATCH)-(\\d+)/i);\n if (match) {\n const num = parseInt(match[1], 10);\n if (!isNaN(num) && num > maxNum) {\n maxNum = num;\n }\n }\n }\n } catch {\n // Ignore unreadable candidate dir\n }\n }\n\n return maxNum + 1;\n}\n\nexport function scaffoldSddChange(options: SddChangeScaffoldOptions): SddChangeScaffoldResult {\n const rootDir = options.rootDir || process.cwd();\n const framework = options.framework || 'openspec';\n const author = options.author || 'agent-developer / human-dev';\n const profile: ChangeProfile = options.profile || 'standard';\n const dateStr = new Date().toISOString().split('T')[0];\n const name = options.name.trim();\n\n const errors: string[] = [];\n const createdFiles: string[] = [];\n\n if (!name) {\n return {\n success: false,\n changeId: '',\n canonicalId: '',\n profile,\n changeDir: '',\n createdFiles: [],\n citedArtifacts: [],\n errors: ['El nombre del cambio no puede estar vacío.'],\n };\n }\n\n // 1. Generate normalized change-id\n let slug: string;\n let canonicalId: string;\n let padNum = '001';\n\n const targetChangeId = options.changeId || options.id;\n if (targetChangeId) {\n const rawId = targetChangeId.trim();\n slug = slugify(rawId);\n canonicalId = rawId.toUpperCase();\n const match = rawId.match(/^(?:chg|CHG|patch|PATCH)-(\\d+)/i);\n if (match) {\n padNum = match[1];\n }\n } else {\n const nextNum = getNextCorrelativeNumber(rootDir);\n padNum = String(nextNum).padStart(3, '0');\n const nameSlug = slugify(name);\n const prefix = profile === 'patch' ? 'patch' : 'chg';\n slug = `${prefix}-${padNum}-${nameSlug}`;\n canonicalId = `${prefix.toUpperCase()}-${padNum}-${nameSlug.toUpperCase()}`;\n }\n\n // 2. Determine target change workspace folder\n const adapter = getSddAdapter(framework);\n const changeDir = adapter.getChangeWorkspaceDir(rootDir, slug);\n\n if (fs.existsSync(changeDir)) {\n const existing = fs.readdirSync(changeDir);\n if (existing.length > 0) {\n return {\n success: false,\n changeId: slug,\n canonicalId,\n profile,\n changeDir,\n createdFiles: [],\n citedArtifacts: [],\n errors: [`El directorio del cambio '${changeDir}' ya existe y no está vacío.`],\n };\n }\n } else {\n fs.mkdirSync(changeDir, { recursive: true });\n }\n\n // 3. Scan canonical artifacts across repository for citations\n const allMdFiles = walkMdFiles(rootDir);\n const artifactMap = new Map<\n string,\n { id: string; file: string; frontmatter: any; title?: string; digest: string }\n >();\n\n for (const file of allMdFiles) {\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const { frontmatter } = parseFrontmatter(content);\n if (frontmatter && frontmatter.id) {\n const id = String(frontmatter.id);\n const digest = computeCanonicalSha256(content);\n const title = typeof frontmatter.title === 'string' ? frontmatter.title : undefined;\n artifactMap.set(id, { id, file, frontmatter, title, digest });\n }\n } catch {\n // Ignore unparseable\n }\n }\n\n // Parse --from input IDs\n const rawFrom = options.from;\n const inputFromIds: string[] = [];\n if (Array.isArray(rawFrom)) {\n for (const item of rawFrom) {\n if (typeof item === 'string') {\n inputFromIds.push(...item.split(',').map((s) => s.trim()).filter(Boolean));\n }\n }\n } else if (typeof rawFrom === 'string') {\n inputFromIds.push(...rawFrom.split(',').map((s) => s.trim()).filter(Boolean));\n }\n\n let productArtifactCreated: string | undefined;\n const citedArtifacts: Array<{ id: string; digest: string; title?: string; comment?: string }> = [];\n const subRequirements: string[] = [];\n const subUseCases: string[] = [];\n const subSecReqs: string[] = [];\n const subRules: string[] = [];\n\n // Patch profile shortcut: only spec.md with profile: patch is created\n if (profile === 'patch') {\n for (const id of inputFromIds) {\n const existing = artifactMap.get(id);\n if (existing) {\n citedArtifacts.push({\n id: existing.id,\n digest: `sha256:${existing.digest}`,\n title: existing.title,\n comment: `Citación de ${existing.frontmatter?.type || 'artefacto'} (${existing.title || existing.id})`,\n });\n }\n }\n\n const citationsSection =\n citedArtifacts.length > 0\n ? `citations:\\n${yaml\n .dump(\n citedArtifacts.map((c) => ({ id: c.id, digest: c.digest, comment: c.comment })),\n { indent: 2, lineWidth: -1 }\n )\n .trim()\n .split('\\n')\n .map((l) => ` ${l}`)\n .join('\\n')}\\n`\n : '';\n\n const specPath = path.join(changeDir, 'spec.md');\n const specFmObj = {\n id: `SPEC-${canonicalId}`,\n type: 'delivery-spec',\n 'change-id': canonicalId,\n profile: 'patch',\n 'acceptance-format': 'gherkin',\n 'cucumber-tags': [`@${canonicalId}`, '@patch', '@automated'],\n };\n const specContent = `---\nid: SPEC-${canonicalId}\ntype: delivery-spec\nchange-id: ${canonicalId}\nprofile: patch\nacceptance-format: gherkin\ncucumber-tags:\n - \"@${canonicalId}\"\n - \"@patch\"\n - \"@automated\"\n${citationsSection}verification:\n method: automated-test\n command: pnpm test\n---\n\n# Delivery Specification (Fast Patch): ${canonicalId}\n\n## 1. Patch Scope and Justification\n${name}\n\n## 2. Acceptance and Correction Criteria (BDD Gherkin)\n\n\\`\\`\\`gherkin\n@${canonicalId} @patch @automated\nFeature: Patch ${canonicalId} - ${name}\n Scenario: Defect fix verification\n Given the system exhibits the defect identified in \"${name}\"\n When the patch fix is applied\n Then the anomalous behavior is resolved and verification passes\n\\`\\`\\`\n\n## 3. Automated Verification\n- **Command**: \\`pnpm test\\`\n- **Criteria**: All unit and regression tests must pass.\n`;\n fs.writeFileSync(specPath, specContent, 'utf-8');\n createdFiles.push(specPath);\n\n const specGherkinBlocks = extractGherkinBlock(specContent);\n if (specGherkinBlocks.length === 0) {\n errors.push(\n `El archivo 'spec.md' de la entrega debe incluir obligatoriamente especificaciones en formato Gherkin (\\`\\`\\`gherkin ... \\`\\`\\`).`\n );\n }\n\n const wsValidation = adapter.validateWorkspace(changeDir);\n if (!wsValidation.valid) {\n errors.push(...wsValidation.errors);\n }\n\n const specValidation = validateArtifactSchema(specFmObj as any, 'delivery-spec', rootDir);\n if (!specValidation.valid) {\n errors.push(...specValidation.errors);\n }\n\n return {\n success: errors.length === 0,\n changeId: slug,\n canonicalId,\n profile,\n changeDir,\n createdFiles,\n citedArtifacts,\n errors,\n };\n }\n\n // 4. Handle Option A: Greenfield feature or explicit citations\n if (inputFromIds.length === 0) {\n // Greenfield feature: create draft canonical requirement in specs/product/\n const nameSlugUpper = slugify(name).toUpperCase();\n const reqId = `FR-${padNum}-${nameSlugUpper}-001`;\n const ucId = `UC-${padNum}-${nameSlugUpper}`;\n\n const productDir = path.join(rootDir, 'specs', 'product');\n if (!fs.existsSync(productDir)) {\n fs.mkdirSync(productDir, { recursive: true });\n }\n\n const reqFilePath = path.join(productDir, `${reqId}.md`);\n if (!fs.existsSync(reqFilePath)) {\n const reqContent = `---\nid: ${reqId}\ntype: requirement\ntitle: \"${name}\"\nstatus: draft\nversion: \"1.0.0\"\nschema-version: \"1.0\"\ncategory: functional\nderives-from:\n - ${ucId}\nverifiable-by: cucumber-bdd\nacceptance-format: gherkin\ncucumber-tags:\n - \"@${reqId}\"\n - \"@automated\"\nsupersedes: null\nsuperseded-by: null\n---\n\n# ${reqId}: ${name}\n\n## 1. Enunciado Normativo\nEl sistema DEBE implementar y soportar la capacidad de ${name}.\n\n---\n\n## 2. Criterios de Aceptación en Formato Gherkin (Cucumber)\n\n\\`\\`\\`gherkin\n@${reqId} @automated\nFeature: ${name}\n As a user or client system\n I want to execute the capability for ${name}\n So that the expected outcome and value are achieved\n\n Scenario: Nominal successful flow\n Given the system is in an operational state\n When the operation for \"${name}\" is executed\n Then the operation completes successfully\n\\`\\`\\`\n\n---\n\n## 3. Historial de Revisiones\n\n| Versión | Fecha | Autor / Agente | Descripción del Cambio | Referencia de Cambio (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | ${dateStr} | ${author} | Definición inicial de requerimiento para ${canonicalId} | ${canonicalId} |\n`;\n fs.writeFileSync(reqFilePath, reqContent, 'utf-8');\n productArtifactCreated = reqFilePath;\n createdFiles.push(reqFilePath);\n\n const digest = computeCanonicalSha256(reqContent);\n citedArtifacts.push({\n id: reqId,\n digest: `sha256:${digest}`,\n title: name,\n comment: `Requerimiento funcional canónico asociado (Génesis ${canonicalId})`,\n });\n subRequirements.push(reqId);\n subUseCases.push(ucId);\n }\n } else {\n // Process explicit --from IDs\n for (const id of inputFromIds) {\n const existing = artifactMap.get(id);\n if (existing) {\n citedArtifacts.push({\n id: existing.id,\n digest: `sha256:${existing.digest}`,\n title: existing.title,\n comment: `Citación de ${existing.frontmatter.type || 'artefacto'} (${existing.title || existing.id})`,\n });\n\n if (id.startsWith('FR-') || id.startsWith('QR-') || id.startsWith('CON-')) {\n if (!subRequirements.includes(id)) subRequirements.push(id);\n } else if (id.startsWith('UC-')) {\n if (!subUseCases.includes(id)) subUseCases.push(id);\n // Auto-discover derived requirements from this UC\n for (const [otherId, otherArt] of artifactMap.entries()) {\n const derives = otherArt.frontmatter['derives-from'];\n const derivesArr = Array.isArray(derives) ? derives : derives ? [derives] : [];\n if (derivesArr.includes(id)) {\n if (otherId.startsWith('FR-') || otherId.startsWith('QR-')) {\n if (!subRequirements.includes(otherId)) subRequirements.push(otherId);\n if (!citedArtifacts.some((c) => c.id === otherId)) {\n citedArtifacts.push({\n id: otherId,\n digest: `sha256:${otherArt.digest}`,\n title: otherArt.title,\n comment: `Requerimiento derivado de ${id}`,\n });\n }\n }\n }\n }\n } else if (id.startsWith('SEC-REQ-') || id.startsWith('SAF-REQ-')) {\n if (!subSecReqs.includes(id)) subSecReqs.push(id);\n } else if (id.startsWith('BR-')) {\n if (!subRules.includes(id)) subRules.push(id);\n }\n } else {\n // Artifact not found in repository: scaffold draft requirement in specs/product\n const productDir = path.join(rootDir, 'specs', 'product');\n if (!fs.existsSync(productDir)) {\n fs.mkdirSync(productDir, { recursive: true });\n }\n const reqFilePath = path.join(productDir, `${id}.md`);\n const reqContent = `---\nid: ${id}\ntype: ${id.startsWith('UC-') ? 'use-case' : id.startsWith('SEC-REQ-') ? 'security-requirement' : 'requirement'}\ntitle: \"${name}\"\nstatus: draft\nversion: \"1.0.0\"\nschema-version: \"1.0\"\ncategory: functional\nverifiable-by: cucumber-bdd\nacceptance-format: gherkin\ncucumber-tags:\n - \"@${id}\"\n - \"@automated\"\nsupersedes: null\nsuperseded-by: null\n---\n\n# ${id}: ${name}\n\n## 1. Enunciado\nDefinición de artefacto citado en ${canonicalId}.\n\n## 2. Criterios de Aceptación en Formato Gherkin (Cucumber)\n\n\\`\\`\\`gherkin\n@${id} @automated\nFeature: ${name}\n Scenario: Expected behavior verification\n Given the system is initialized for \"${name}\"\n When the request associated with ${id} is processed\n Then the response satisfies acceptance criteria\n\\`\\`\\`\n`;\n fs.writeFileSync(reqFilePath, reqContent, 'utf-8');\n createdFiles.push(reqFilePath);\n productArtifactCreated = reqFilePath;\n\n const digest = computeCanonicalSha256(reqContent);\n citedArtifacts.push({\n id,\n digest: `sha256:${digest}`,\n title: name,\n comment: `Artefacto citado en ${canonicalId}`,\n });\n\n if (id.startsWith('UC-')) {\n subUseCases.push(id);\n } else if (id.startsWith('SEC-REQ-')) {\n subSecReqs.push(id);\n } else {\n subRequirements.push(id);\n }\n }\n }\n }\n\n // Ensure at least 1 requirement in subRequirements for schema validity\n if (subRequirements.length === 0) {\n const fallbackReqId = `FR-${padNum}-${slugify(name).toUpperCase()}-001`;\n subRequirements.push(fallbackReqId);\n }\n\n // 5. Build citations YAML block for Markdown frontmatters\n const citationsYamlBlock = yaml\n .dump(\n citedArtifacts.map((c) => ({\n id: c.id,\n digest: c.digest,\n comment: c.comment,\n })),\n { indent: 2, lineWidth: -1 }\n )\n .trim()\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n\n // 6. Generate proposal.md\n const proposalPath = path.join(changeDir, 'proposal.md');\n const proposalContent = `---\nid: ${canonicalId}\ntype: spec-change-proposal\ntitle: \"${name}\"\nstatus: draft\nauthor: \"${author}\"\ncitations:\n${citationsYamlBlock}\n---\n\n# Propuesta de Cambio: ${canonicalId}\n\n## 1. Motivación y Alcance\n${name}\n\n## 2. Dependencias Externas Evaluadas\n- Lista de dependencias nuevas a incorporar y verificación de licencia según \\`license-policy.yaml\\`.\n`;\n fs.writeFileSync(proposalPath, proposalContent, 'utf-8');\n createdFiles.push(proposalPath);\n\n // 7. Generate spec.md with mandatory Gherkin formatting\n const specPath = path.join(changeDir, 'spec.md');\n const specFmObj = {\n id: `SPEC-${canonicalId}`,\n type: 'delivery-spec',\n 'change-id': canonicalId,\n profile,\n 'acceptance-format': 'gherkin',\n 'cucumber-tags': [`@${canonicalId}`, '@automated'],\n };\n const specContent = `---\nid: SPEC-${canonicalId}\ntype: delivery-spec\nchange-id: ${canonicalId}\nprofile: ${profile}\nacceptance-format: gherkin\ncucumber-tags:\n - \"@${canonicalId}\"\n - \"@automated\"\n---\n\n# Delivery Specification: ${canonicalId}\n\n## 1. Functional Behavior Scenarios (BDD Gherkin)\n\n\\`\\`\\`gherkin\n@${canonicalId} @functional @automated\nFeature: ${name}\n As a system component or user\n I want to process the operation for ${name}\n So that delivery criteria are satisfied\n\n Scenario: Nominal successful flow\n Given the system is in a nominal operational state\n When the operation for \"${name}\" is processed\n Then the operation completes successfully satisfying acceptance criteria\n\\`\\`\\`\n\n---\n\n## 2. Cybersecurity and Mitigation Scenarios (Abuse Scenarios)\n\n\\`\\`\\`gherkin\n@${canonicalId} @security @mitigation\nFeature: Security Mitigation for ${canonicalId}\n Scenario: Unauthorized access attempt or invalid payload\n Given an unauthenticated actor or invalid credentials\n When the request reaches protected enclaves\n Then the connection is rejected immediately and a security event is recorded\n\\`\\`\\`\n`;\n fs.writeFileSync(specPath, specContent, 'utf-8');\n createdFiles.push(specPath);\n\n const specGherkinBlocks = extractGherkinBlock(specContent);\n if (specGherkinBlocks.length === 0) {\n errors.push(\n `El archivo 'spec.md' de la entrega debe incluir obligatoriamente especificaciones en formato Gherkin (\\`\\`\\`gherkin ... \\`\\`\\`).`\n );\n }\n\n // 8. Generate design.md\n const designPath = path.join(changeDir, 'design.md');\n const designContent = `---\nid: DSG-${canonicalId}\ntype: spec-design\nchange-id: ${canonicalId}\ntitle: \"Diseño Técnico: ${name}\"\nversion: \"1.0.0\"\nschema-version: \"1.0\"\nhandoff: \"HOF-${canonicalId}\"\narchitecture-component: \"CMP-CORE\"\nenclave: \"SEC-ENC-DMZ\"\nstatus: draft\ncitations:\n${citationsYamlBlock}\n---\n\n# Diseño Técnico: ${canonicalId}\n\n## 1. Mapeo Arquitectónico y Enclave Zero Trust\nEl componente se despliega en el enclave perimetral y materializa el servicio correspondiente.\n\n## 2. Contratos de Datos e Interfaces\nDetalle de DTOs, interfaces de servicio y esquemas de datos asociados a ${name}.\n\n## 3. Protocolos de Manejo de Errores y Mitigación\nGestión de excepciones, reintentos y respuestas ante anomalías.\n\n## 4. Conformidad con la Política de Licencias (\\`license-policy.yaml\\`)\nTodas las librerías empleadas en la implementación deben cumplir con las categorías permitidas en \\`license-policy.yaml\\`.\n\n## 5. Historial de Revisiones\n\n| Versión | Fecha | Autor | Descripción del Cambio | Referencia |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | ${dateStr} | ${author} | Diseño técnico formal inicial | ${canonicalId} |\n`;\n fs.writeFileSync(designPath, designContent, 'utf-8');\n createdFiles.push(designPath);\n\n // 9. Generate tasks.md\n const tasksPath = path.join(changeDir, 'tasks.md');\n const tasksFm = {\n id: `TSK-PLAN-${canonicalId}`,\n type: 'task-plan',\n 'change-id': canonicalId,\n title: `Desglose de Tareas Verificables: ${name}`,\n version: '1.0.0',\n 'schema-version': '1.0',\n status: 'draft',\n 'governance-summary': {\n 'autonomous-tasks-count': 1,\n 'human-review-plan-count': 1,\n 'ambiguous-count': 0,\n 'high-risk-manual-count': 0,\n },\n tasks: [\n {\n id: 'TSK-001',\n title: 'Definición de Contratos, Interfaces y Tipos de Datos',\n complexity: 'LOW',\n 'risk-level': 'LOW',\n 'autonomy-mode': 'AUTONOMOUS',\n verification: {\n method: 'quality-gate',\n 'command-or-criteria': 'pnpm test',\n },\n 'assigned-to': 'agent-developer',\n status: 'PENDING',\n },\n {\n id: 'TSK-002',\n title: 'Implementación de Lógica y Pruebas Unitarias/BDD',\n complexity: 'MEDIUM',\n 'risk-level': 'MEDIUM',\n 'autonomy-mode': 'HUMAN_REVIEW_PLAN',\n verification: {\n method: 'automated-unit-test',\n 'command-or-criteria': 'pnpm test',\n },\n 'assigned-to': 'agent-developer',\n status: 'PENDING',\n },\n ],\n supersedes: null,\n 'superseded-by': null,\n };\n\n const tasksContent = `---\n${yaml.dump(tasksFm, { indent: 2, lineWidth: -1 }).trim()}\n---\n\n# Desglose de Tareas Verificables: ${canonicalId}\n\n## 1. Matriz de Clasificación de Autonomía y Supervisión Humana\n\n| Modo de Autonomía | Semáforo | Criterio de Activación | Comportamiento del Agente y del Humano |\n| :--- | :---: | :--- | :--- |\n| **\\`AUTONOMOUS\\`** | 🟢 | Riesgo bajo, tarea aislada y bien especificada con pruebas inmediatas. | **Plan + Ejecución Autónoma**. El agente genera el plan y escribe el código sin interrupción. |\n| **\\`HUMAN_REVIEW_PLAN\\`** | 🟡 | Riesgo medio, cambios en arquitectura, contratos de API o reglas críticas. | **Revisión Obligatoria de Plan**. El agente diseña el plan detallado y espera aprobación humana. |\n| **\\`AMBIGUOUS\\`** | 🟠 | Requisitos vagos, criterios incompletos o conflicto de lógica de negocio. | **Bloqueada para Implementación**. Requiere clarificación previa con el usuario. |\n| **\\`HIGH_RISK_MANUAL\\`** | 🔴 | Riesgo crítico (migraciones destructivas de DB, claves criptográficas, infra). | **Prohibida la Ejecución Autónoma**. Ejecución directa humana. |\n\n---\n\n## 2. Plan Detallado de Tareas y Criterios de Verificación\n\n### Fase 1: Tipos y Contratos (TSK-001)\n- **ID**: \\`TSK-001\\`\n- **Descripción**: Crear las interfaces y estructuras de datos estipuladas en \\`design.md\\`.\n- **Modo**: \\`AUTONOMOUS\\` 🟢\n- **Verificación**: \\`pnpm test\\`\n\n### Fase 2: Implementación y Pruebas (TSK-002)\n- **ID**: \\`TSK-002\\`\n- **Descripción**: Implementar la lógica y pruebas de ${name}.\n- **Modo**: \\`HUMAN_REVIEW_PLAN\\` 🟡\n- **Verificación**: \\`pnpm test\\`\n\n---\n\n## 3. Historial de Revisiones\n\n| Versión | Fecha | Autor / Agente | Descripción del Cambio | Referencia de Cambio (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | ${dateStr} | ${author} | Creación inicial del plan de tareas con gobernanza | ${canonicalId} |\n`;\n fs.writeFileSync(tasksPath, tasksContent, 'utf-8');\n createdFiles.push(tasksPath);\n\n // 10. Deposit handoff.yaml sidecar\n const subgraph: {\n requirements: string[];\n useCases?: string[];\n securityRequirements?: string[];\n businessRules?: string[];\n } = {\n requirements: subRequirements,\n };\n if (subUseCases.length > 0) subgraph.useCases = subUseCases;\n if (subSecReqs.length > 0) subgraph.securityRequirements = subSecReqs;\n if (subRules.length > 0) subgraph.businessRules = subRules;\n\n const handoff: ProductHandoff = {\n id: `HOF-${canonicalId}`,\n type: 'handoff',\n title: `Handoff Canónico de Producto para ${name}`,\n changeId: canonicalId,\n version: '1.0.0',\n createdAt: new Date().toISOString(),\n subgraph,\n citations: citedArtifacts.map((c) => ({\n id: c.id,\n digest: c.digest,\n comment: c.comment,\n })),\n };\n\n\n const depositedPath = depositProductHandoffSidecar({\n rootDir,\n changeId: slug,\n framework,\n handoff,\n });\n createdFiles.push(depositedPath);\n\n // 11. Post-creation Validation against Schemas & Workspace rules\n const wsValidation = adapter.validateWorkspace(changeDir);\n if (!wsValidation.valid) {\n errors.push(...wsValidation.errors);\n }\n\n const specValidation = validateArtifactSchema(specFmObj as any, 'delivery-spec', rootDir);\n if (!specValidation.valid) {\n errors.push(...specValidation.errors);\n }\n\n const tasksValidation = validateArtifactSchema(tasksFm as any, 'tasks', rootDir);\n if (!tasksValidation.valid) {\n errors.push(...tasksValidation.errors);\n }\n\n const handoffValidation = validateArtifactSchema(handoff as any, 'handoff', rootDir);\n if (!handoffValidation.valid) {\n errors.push(...handoffValidation.errors);\n }\n\n return {\n success: errors.length === 0,\n changeId: slug,\n canonicalId,\n profile,\n changeDir,\n createdFiles,\n productArtifactCreated,\n citedArtifacts,\n errors,\n };\n}\n","/**\n * AI-SDLC: CI/CD Environment Adapters & Multi-Platform Resolvers\n * Supports GitHub Actions, GitLab CI, Azure DevOps and Bitbucket Pipelines.\n */\n\nimport * as fs from 'fs';\n\nexport type CiProvider = 'github' | 'gitlab' | 'azure' | 'bitbucket' | 'generic';\n\nexport interface ResolvedCiEnv {\n provider: CiProvider;\n headRef?: string;\n prTitle?: string;\n prBody?: string;\n prId?: string;\n manualChangeId?: string;\n author: string;\n}\n\nexport function resolveCiEnvironment(env: NodeJS.ProcessEnv = process.env): ResolvedCiEnv {\n const manualChangeId = env.MANUAL_CHANGE_ID?.trim() || env.CHANGE_ID?.trim() || undefined;\n\n let provider: CiProvider = 'generic';\n if (env.GITLAB_CI === 'true') {\n provider = 'gitlab';\n } else if (env.TF_BUILD === 'true') {\n provider = 'azure';\n } else if (env.BITBUCKET_COMMIT !== undefined || env.BITBUCKET_BRANCH !== undefined) {\n provider = 'bitbucket';\n } else if (env.GITHUB_ACTIONS === 'true') {\n provider = 'github';\n }\n\n // Branch / Ref extraction\n let headRef: string | undefined = env.PR_HEAD_REF?.trim() || undefined;\n if (!headRef) {\n if (provider === 'gitlab') {\n headRef =\n env.CI_MERGE_REQUEST_SOURCE_BRANCH_NAME?.trim() ||\n env.CI_COMMIT_REF_NAME?.trim() ||\n env.CI_COMMIT_BRANCH?.trim() ||\n undefined;\n } else if (provider === 'azure') {\n const azureBranch =\n env.SYSTEM_PULLREQUEST_SOURCEBRANCH?.trim() ||\n env.BUILD_SOURCEBRANCH?.trim() ||\n env.BUILD_SOURCEBRANCHNAME?.trim();\n if (azureBranch) {\n headRef = azureBranch.replace(/^refs\\/heads\\//, '');\n }\n } else if (provider === 'bitbucket') {\n headRef =\n env.BITBUCKET_BRANCH?.trim() ||\n env.BITBUCKET_PR_DESTINATION_BRANCH?.trim() ||\n undefined;\n } else if (provider === 'github') {\n headRef =\n env.GITHUB_HEAD_REF?.trim() ||\n env.GITHUB_REF_NAME?.trim() ||\n undefined;\n }\n }\n\n // PR / MR Title\n const prTitle: string | undefined =\n env.PR_TITLE?.trim() ||\n env.CI_MERGE_REQUEST_TITLE?.trim() ||\n env.SYSTEM_PULLREQUEST_PULLREQUESTTITLE?.trim() ||\n undefined;\n\n // PR / MR Body / Description\n const prBody: string | undefined =\n env.PR_BODY?.trim() ||\n env.CI_MERGE_REQUEST_DESCRIPTION?.trim() ||\n undefined;\n\n // PR / MR ID\n const prId: string | undefined =\n env.PR_NUMBER?.trim() ||\n env.CI_MERGE_REQUEST_IID?.trim() ||\n env.SYSTEM_PULLREQUEST_PULLREQUESTID?.trim() ||\n env.BITBUCKET_PR_ID?.trim() ||\n undefined;\n\n // Provider author attribution\n let author = 'CI/CD Automated SDD Integration';\n if (provider === 'github') {\n author = 'GitHub Actions CI (Automated SDD Integration)';\n } else if (provider === 'gitlab') {\n author = 'GitLab CI (Automated SDD Integration)';\n } else if (provider === 'azure') {\n author = 'Azure DevOps CI (Automated SDD Integration)';\n } else if (provider === 'bitbucket') {\n author = 'Bitbucket Pipelines (Automated SDD Integration)';\n }\n\n return {\n provider,\n headRef,\n prTitle,\n prBody,\n prId,\n manualChangeId,\n author,\n };\n}\n\nexport function emitCiOutput(\n key: string,\n value: string,\n env: NodeJS.ProcessEnv = process.env\n): void {\n // 1. GitHub Actions output\n const outputFile = env.GITHUB_OUTPUT;\n if (outputFile && fs.existsSync(outputFile)) {\n fs.appendFileSync(outputFile, `${key}=${value}\\n`, 'utf-8');\n }\n\n // 2. Azure DevOps Logging Command\n if (env.TF_BUILD === 'true') {\n console.log(`##vso[task.setvariable variable=${key};isOutput=true]${value}`);\n }\n\n // 3. Dotenv output file (GitLab CI, Bitbucket, or explicit CI_OUTPUT_FILE)\n const envOutputFile =\n env.CI_OUTPUT_FILE ||\n env.GITLAB_ENV ||\n (env.GITLAB_CI === 'true' || env.BITBUCKET_COMMIT !== undefined\n ? 'sdd-integrate.env'\n : undefined);\n\n if (envOutputFile) {\n const uppercaseKey = key.toUpperCase();\n const envString = `${uppercaseKey}=${value}`;\n if (fs.existsSync(envOutputFile)) {\n const content = fs.readFileSync(envOutputFile, 'utf-8');\n const lines = content.split('\\n');\n let found = false;\n const newLines = lines.map(line => {\n if (line.startsWith(`${uppercaseKey}=`)) {\n found = true;\n return envString;\n }\n return line;\n });\n if (!found) {\n newLines.push(envString);\n }\n fs.writeFileSync(envOutputFile, newLines.filter(l => l.trim() !== '').join('\\n') + '\\n', 'utf-8');\n } else {\n fs.writeFileSync(envOutputFile, envString + '\\n', 'utf-8');\n }\n }\n}\n","/**\n * AI-SDLC: SDD Adapters Engine (OpenSpec & Spec Kit)\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { ProductHandoff, SddDepositOptions, SddFramework } from '../../types/index.js';\nimport { OpenSpecAdapter } from './openspec.js';\nimport { SpecKitAdapter } from './speckit.js';\nimport { SddAdapter } from './types.js';\n\nexport * from './types.js';\nexport * from './openspec.js';\nexport * from './speckit.js';\nexport * from './integration.js';\nexport * from './scaffold.js';\nexport * from './ci.js';\n\nexport function getSddAdapter(framework: SddFramework): SddAdapter {\n switch (framework) {\n case 'openspec':\n return new OpenSpecAdapter();\n case 'speckit':\n return new SpecKitAdapter();\n default:\n throw new Error(`Framework SDD no soportado: ${framework}`);\n }\n}\n\nexport function depositProductHandoffSidecar(options: SddDepositOptions): string {\n const adapter = getSddAdapter(options.framework);\n return adapter.depositSidecar({\n rootDir: options.rootDir || process.cwd(),\n changeId: options.changeId,\n handoff: options.handoff,\n });\n}\n\nexport function loadProductHandoffSidecar(changeDir: string): ProductHandoff | null {\n const openspec = new OpenSpecAdapter();\n const res = openspec.loadSidecar(changeDir);\n if (res) return res;\n\n const speckit = new SpecKitAdapter();\n return speckit.loadSidecar(changeDir);\n}\n\nexport function scanAllProductHandoffs(\n rootDir: string\n): Map<string, { handoff: ProductHandoff; changeDir: string }> {\n const handoffsMap = new Map<string, { handoff: ProductHandoff; changeDir: string }>();\n\n // Look across potential SDD change locations:\n // 1. specs/changes/active/*\n // 2. specs/changes/completed/*\n // 3. specs/*\n // 4. openspec/changes/*\n const candidateParentDirs = [\n path.join(rootDir, 'specs', 'changes', 'active'),\n path.join(rootDir, 'specs', 'changes', 'completed'),\n path.join(rootDir, 'specs'),\n path.join(rootDir, 'openspec', 'changes'),\n ];\n\n for (const parentDir of candidateParentDirs) {\n if (!fs.existsSync(parentDir)) continue;\n const entries = fs.readdirSync(parentDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n // Skip non-change directories\n if (entry.name === 'changes' || entry.name === 'active' || entry.name === 'node_modules') continue;\n\n const changeDir = path.join(parentDir, entry.name);\n if (handooffsHasDir(handoffsMap, changeDir)) continue;\n\n const handoff = loadProductHandoffSidecar(changeDir);\n if (handoff && handoff.id) {\n handoffsMap.set(changeDir, { handoff, changeDir });\n }\n }\n }\n\n return handoffsMap;\n}\n\nfunction handooffsHasDir(map: Map<string, any>, dir: string): boolean {\n const norm = path.resolve(dir);\n for (const key of map.keys()) {\n if (path.resolve(key) === norm) return true;\n }\n return false;\n}\n","/**\n * AI-SDLC: Automated 360° Traceability Engine (RTM Validator)\n * Verifies complete coverage across:\n * 1. PDaC Handoff (HOF-*) & Product Subgraph (Upstream: UC-*, BR-*, ABUSE-*)\n * 2. arc42 / NAF v4 Architecture Views (Midstream: CMP-*, ADR-*, SEC-ENC-*)\n * 3. BDD / Gherkin Executable Tests (Downstream: .feature files & scenario tags)\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport { scanAllProductHandoffs } from '../adapters/sdd/index.js';\nimport {\n ArtifactFrontmatter,\n ProductHandoff,\n TraceabilityOptions,\n TraceabilityResult,\n TraceabilityRow,\n} from '../types/index.js';\nimport { walkMdFiles } from '../utils/fs.js';\n\ninterface ArtifactEntry {\n file: string;\n type?: string;\n title?: string;\n frontmatter: ArtifactFrontmatter;\n rawBody: string;\n}\n\ninterface ComponentEntry {\n id: string;\n level?: number;\n parentComponent?: string;\n boundedContext?: string;\n implementationType?: string;\n satisfies: string[];\n}\n\nexport function parseFrontmatter(content: string): { frontmatter: ArtifactFrontmatter; body: string } {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return { frontmatter: {}, body: content };\n\n try {\n const parsed = yaml.load(match[1]);\n const frontmatter = parsed && typeof parsed === 'object' ? (parsed as ArtifactFrontmatter) : {};\n return { frontmatter, body: content.substring(match[0].length) };\n } catch {\n return { frontmatter: {}, body: content.substring(match[0].length) };\n }\n}\n\nexport function extractFeatureTags(featureContent: string): string[] {\n const tags: string[] = [];\n const lines = featureContent.split('\\n');\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (line.startsWith('@')) {\n const lineTags = line.split(/\\s+/).filter((t) => t.startsWith('@'));\n for (const t of lineTags) {\n tags.push(t.substring(1)); // strip '@'\n }\n }\n }\n return Array.from(new Set(tags));\n}\n\nexport function generateTraceabilityReportMarkdown(rows: TraceabilityRow[], errors: number): string {\n const isOk = errors === 0;\n const reportLines: string[] = [\n '# 360° Requirements Traceability Matrix (RTM)',\n '',\n `*Verification Date: ${new Date().toISOString()}*`,\n `*Overall Status: ${isOk ? '100% TRACEABLE (PASSED)' : `ERRORS DETECTED (${errors} gaps)`}*`,\n '',\n '## 1. End-to-End Coverage (PDaC Handoff ➔ arc42/NAF v4 ➔ BDD/Gherkin)',\n '',\n '| Requirement ID | PDaC Handoff | Title | Product (Upstream) | Architecture (Midstream) | Testing (Downstream) | Global Status |',\n '| :--- | :--- | :--- | :--- | :--- | :--- | :---: |',\n ];\n\n for (const r of rows) {\n const ok = (r.productStatus === 'COMPLIANT' || r.productStatus === 'CONFORME') &&\n (r.archStatus === 'COMPLIANT' || r.archStatus === 'CONFORME') &&\n (r.testStatus === 'COMPLIANT' || r.testStatus === 'CONFORME');\n reportLines.push(\n `| **\\`${r.id}\\`** | \\`${r.hofId || 'N/A'}\\` | ${r.title} | \\`${r.productTraces}\\` | \\`${r.archTraces}\\` | \\`${r.testTraces}\\` | ${\n ok ? '✅ COMPLIANT' : '❌ ORPHAN'\n } |`\n );\n }\n\n reportLines.push('');\n reportLines.push('## 2. Deterministic Validation Criteria');\n reportLines.push(\n '- **Product (Upstream)**: Requirement is issued in a formal PDaC Handoff (`HOF-*`) and derives from a Use Case (`UC-*`), Business Rule (`BR-*`), or Abuse Case (`ABUSE-*`).'\n );\n reportLines.push(\n '- **Architecture (Midstream)**: Requirement is assigned to at least one Component (`CMP-*`), Security Enclave (`SEC-ENC-*`), Decision (`ADR-*`), or arc42/NAF v4 Execution View.'\n );\n reportLines.push(\n '- **Testing (Downstream)**: Requirement has executable scenarios in BDD/Gherkin (`.feature`) test suites with matching tags or verified automated test cases.'\n );\n\n return reportLines.join('\\n');\n}\n\nconst SKIPPED_DIR_NAMES = new Set([\n 'node_modules',\n '.git',\n 'dist',\n 'scratch',\n 'fixtures',\n 'templates',\n 'examples',\n]);\n\nfunction shouldSkipDir(name: string): boolean {\n return SKIPPED_DIR_NAMES.has(name) || name.startsWith('temp-');\n}\n\nfunction isCodeTestFile(name: string): boolean {\n return (\n name.endsWith('.spec.ts') ||\n name.endsWith('.spec.js') ||\n name.endsWith('.test.ts') ||\n name.endsWith('.test.js') ||\n name.endsWith('_test.py') ||\n name.endsWith('_test.go')\n );\n}\n\nfunction indexFeatureFile(\n fullPath: string,\n rootDir: string,\n map: Map<string, string[]>\n): void {\n try {\n const content = fs.readFileSync(fullPath, 'utf-8');\n const tags = extractFeatureTags(content);\n const relFeature = path.relative(rootDir, fullPath).replace(/\\\\/g, '/');\n for (const tag of tags) {\n const existing = map.get(tag) || [];\n if (!existing.includes(relFeature)) existing.push(relFeature);\n map.set(tag, existing);\n }\n } catch {\n // Ignore read error\n }\n}\n\nfunction scanFeatureFiles(\n dir: string,\n rootDir: string,\n map: Map<string, string[]>\n): void {\n if (!fs.existsSync(dir)) return;\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const e of entries) {\n const fullPath = path.join(dir, e.name);\n if (e.isDirectory() && !shouldSkipDir(e.name)) {\n scanFeatureFiles(fullPath, rootDir, map);\n } else if (e.name.endsWith('.feature')) {\n indexFeatureFile(fullPath, rootDir, map);\n }\n }\n } catch {\n // Ignore directory error\n }\n}\n\nfunction indexCodeTestFile(\n fullPath: string,\n rootDir: string,\n reqIds: string[],\n map: Map<string, string[]>\n): void {\n try {\n const content = fs.readFileSync(fullPath, 'utf-8');\n const relTest = path.relative(rootDir, fullPath).replace(/\\\\/g, '/');\n for (const artId of reqIds) {\n if (content.includes(artId)) {\n const existing = map.get(artId) || [];\n if (!existing.includes(relTest)) existing.push(relTest);\n map.set(artId, existing);\n }\n }\n } catch {\n // Ignore read error\n }\n}\n\nfunction scanCodeTestFiles(\n dir: string,\n rootDir: string,\n reqIds: string[],\n map: Map<string, string[]>\n): void {\n if (!fs.existsSync(dir)) return;\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const e of entries) {\n const fullPath = path.join(dir, e.name);\n if (e.isDirectory() && !shouldSkipDir(e.name)) {\n scanCodeTestFiles(fullPath, rootDir, reqIds, map);\n } else if (isCodeTestFile(e.name)) {\n indexCodeTestFile(fullPath, rootDir, reqIds, map);\n }\n }\n } catch {\n // Ignore directory error\n }\n}\n\nexport function verifyTraceability(options: TraceabilityOptions = {}): TraceabilityResult {\n const rootDir = options.rootDir || process.cwd();\n const allMdFiles = walkMdFiles(rootDir);\n\n // 1. Index all markdown artifacts\n const artifactMap = new Map<string, ArtifactEntry>();\n const componentsList: ComponentEntry[] = [];\n const architectureViews: { file: string; content: string }[] = [];\n\n for (const file of allMdFiles) {\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const { frontmatter, body } = parseFrontmatter(content);\n const relFile = path.relative(rootDir, file).replace(/\\\\/g, '/');\n\n if (frontmatter.id) {\n artifactMap.set(frontmatter.id, {\n file: relFile,\n type: typeof frontmatter.type === 'string' ? frontmatter.type : undefined,\n title: typeof frontmatter.title === 'string' ? frontmatter.title : undefined,\n frontmatter,\n rawBody: body,\n });\n\n if (frontmatter.type === 'component' || String(frontmatter.id).startsWith('CMP-')) {\n const satisfies: string[] = [];\n if (Array.isArray(frontmatter['satisfies-requirements'])) {\n satisfies.push(...(frontmatter['satisfies-requirements'] as string[]));\n }\n if (Array.isArray(frontmatter['satisfies'])) {\n satisfies.push(...(frontmatter['satisfies'] as string[]));\n }\n componentsList.push({\n id: String(frontmatter.id),\n level: typeof frontmatter.level === 'number' ? frontmatter.level : undefined,\n parentComponent:\n typeof frontmatter['parent-component'] === 'string'\n ? frontmatter['parent-component']\n : undefined,\n boundedContext:\n typeof frontmatter['bounded-context'] === 'string'\n ? frontmatter['bounded-context']\n : undefined,\n implementationType:\n typeof frontmatter['implementation-type'] === 'string'\n ? frontmatter['implementation-type']\n : undefined,\n satisfies,\n });\n }\n }\n\n // Collect arc42 / NAF v4 architecture views\n if (\n relFile.includes('architecture/') ||\n relFile.includes('06_runtime_view') ||\n relFile.includes('08_security_concept') ||\n relFile.includes('09_decisions')\n ) {\n architectureViews.push({ file: relFile, content });\n }\n } catch {\n // Ignore unparseable files\n }\n }\n\n // 2. Scan PDaC Handoffs (HOF-*)\n const handoffsMap = scanAllProductHandoffs(rootDir);\n const handoffList: ProductHandoff[] = Array.from(handoffsMap.values()).map((v) => v.handoff);\n\n // Also collect any handoffs declared in artifactMap (e.g. from markdown files with id: HOF-*)\n for (const [id, entry] of artifactMap.entries()) {\n if (id.startsWith('HOF-') && !handoffsMap.has(id)) {\n const fm = entry.frontmatter;\n const subgraph = (fm.subgraph as any) || {\n requirements: Array.isArray(fm.requirements) ? (fm.requirements as string[]) : [],\n };\n handoffList.push({\n id,\n type: 'handoff',\n title: entry.title,\n changeId: String(fm['change-id'] || fm.changeId || id),\n subgraph,\n });\n }\n }\n\n // Index requirement to handoff\n const reqToHandoffMap = new Map<string, ProductHandoff>();\n for (const hof of handoffList) {\n if (hof.subgraph && Array.isArray(hof.subgraph.requirements)) {\n for (const reqId of hof.subgraph.requirements) {\n reqToHandoffMap.set(reqId, hof);\n }\n }\n if (hof.subgraph && Array.isArray(hof.subgraph.securityRequirements)) {\n for (const reqId of hof.subgraph.securityRequirements) {\n reqToHandoffMap.set(reqId, hof);\n }\n }\n }\n\n // 3. Scan Downstream Tests (BDD / Gherkin .feature & Code-level tests)\n const featureTagMap = new Map<string, string[]>(); // reqId -> featureFiles[]\n const codeTestMap = new Map<string, string[]>(); // reqId -> testFiles[]\n\n const targetReqIds: string[] = [];\n for (const [artId] of artifactMap.entries()) {\n if (\n artId.startsWith('FR-') ||\n artId.startsWith('QR-') ||\n artId.startsWith('SEC-REQ-') ||\n artId.startsWith('CON-')\n ) {\n targetReqIds.push(artId);\n }\n }\n\n scanFeatureFiles(rootDir, rootDir, featureTagMap);\n scanCodeTestFiles(rootDir, rootDir, targetReqIds, codeTestMap);\n\n // 4. Identify all requirements to verify (excluding templates and process docs)\n const requirements: ArtifactEntry[] = [];\n for (const [id, data] of artifactMap.entries()) {\n if (data.file.includes('templates/') || data.file.includes('.template.') || data.file.includes('process/')) {\n continue;\n }\n\n if (\n data.type === 'requirement' ||\n data.type === 'security-requirement' ||\n id.startsWith('FR-') ||\n id.startsWith('QR-') ||\n id.startsWith('CON-') ||\n id.startsWith('SEC-REQ-')\n ) {\n requirements.push(data);\n }\n }\n\n let errorCount = 0;\n const matrixRows: TraceabilityRow[] = [];\n const orphans: TraceabilityRow[] = [];\n\n for (const req of requirements) {\n const fm = req.frontmatter;\n const reqId = fm.id || '';\n const associatedHandoff = reqToHandoffMap.get(reqId);\n\n // --- A. UPSTREAM: PRODUCT TRACEABILITY (PDaC Handoff & Subgraph) ---\n const productTraces: string[] = [];\n\n // From frontmatter\n if (Array.isArray(fm['derives-from'])) {\n productTraces.push(...(fm['derives-from'] as string[]));\n } else if (typeof fm['derives-from'] === 'string') {\n productTraces.push(fm['derives-from']);\n }\n\n if (Array.isArray(fm['mitigates-abuse-case'])) {\n productTraces.push(...(fm['mitigates-abuse-case'] as string[]));\n } else if (typeof fm['mitigates-abuse-case'] === 'string') {\n productTraces.push(fm['mitigates-abuse-case']);\n }\n\n // From PDaC Handoff subgraph\n if (associatedHandoff) {\n if (associatedHandoff.subgraph?.useCases) {\n productTraces.push(...associatedHandoff.subgraph.useCases);\n }\n if (associatedHandoff.subgraph?.businessRules) {\n productTraces.push(...associatedHandoff.subgraph.businessRules);\n }\n if (associatedHandoff.subgraph?.abuseCases) {\n productTraces.push(...associatedHandoff.subgraph.abuseCases);\n }\n }\n\n // Keep unique valid traces that exist in the artifact base\n const validProductTraces = Array.from(\n new Set(productTraces.filter((id) => artifactMap.has(id)))\n );\n\n const isProductConforme =\n validProductTraces.length > 0 || (associatedHandoff !== undefined && (associatedHandoff.subgraph?.requirements?.includes(reqId) ?? false));\n\n const productStatus: 'COMPLIANT' | 'ORPHAN' = isProductConforme ? 'COMPLIANT' : 'ORPHAN';\n if (!isProductConforme) errorCount++;\n\n // --- B. MIDSTREAM: ARCHITECTURE TRACEABILITY (arc42 / NAF v4 - Reverse Lookup) ---\n const archTraces: string[] = [];\n\n // Component reverse mapping (components declaring satisfies-requirements / satisfies)\n for (const cmp of componentsList) {\n if (cmp.satisfies.includes(reqId)) {\n if (!archTraces.includes(cmp.id)) archTraces.push(cmp.id);\n if (cmp.parentComponent && !archTraces.includes(cmp.parentComponent)) {\n archTraces.push(cmp.parentComponent);\n }\n }\n }\n\n if (typeof fm['enforced-in-enclave'] === 'string') {\n archTraces.push(fm['enforced-in-enclave']);\n }\n\n // Check arc42 / NAF v4 views for direct citations\n for (const view of architectureViews) {\n if (view.content.includes(reqId)) {\n const viewName = path.basename(view.file);\n if (!archTraces.includes(viewName)) archTraces.push(viewName);\n }\n }\n\n const uniqueArchTraces = Array.from(new Set(archTraces));\n const archStatus: 'COMPLIANT' | 'ORPHAN' = uniqueArchTraces.length > 0 ? 'COMPLIANT' : 'ORPHAN';\n if (uniqueArchTraces.length === 0) errorCount++;\n\n // --- C. DOWNSTREAM: TEST TRACEABILITY (BDD / Gherkin & Code Tests - Reverse Lookup) ---\n const testTraces: string[] = [];\n\n // Tagged .feature files (reverse lookup)\n const matchingFeatures = featureTagMap.get(reqId) || [];\n testTraces.push(...matchingFeatures);\n\n if (associatedHandoff) {\n const handoffFeatures = featureTagMap.get(associatedHandoff.id) || [];\n testTraces.push(...handoffFeatures);\n }\n\n // Code-based test files (reverse lookup)\n const matchingCodeTests = codeTestMap.get(reqId) || [];\n testTraces.push(...matchingCodeTests);\n\n const uniqueTestTraces = Array.from(new Set(testTraces));\n const testStatus: 'COMPLIANT' | 'ORPHAN' = uniqueTestTraces.length > 0 ? 'COMPLIANT' : 'ORPHAN';\n if (uniqueTestTraces.length === 0) errorCount++;\n\n const row: TraceabilityRow = {\n id: reqId,\n title: (fm.title as string) || 'Untitled',\n type: req.type,\n hofId: associatedHandoff?.id,\n productTraces: validProductTraces.join(', ') || (associatedHandoff ? associatedHandoff.id : 'NONE'),\n productStatus,\n archTraces: uniqueArchTraces.join(', ') || 'NONE',\n archStatus,\n testTraces: uniqueTestTraces.join(', ') || 'NONE',\n testStatus,\n content: req.rawBody ? req.rawBody.trim() : undefined,\n filePath: req.file,\n };\n\n matrixRows.push(row);\n if (productStatus === 'ORPHAN' || archStatus === 'ORPHAN' || testStatus === 'ORPHAN') {\n orphans.push(row);\n }\n }\n\n const reportMarkdown = generateTraceabilityReportMarkdown(matrixRows, errorCount);\n\n return {\n success: errorCount === 0,\n rows: matrixRows,\n orphans,\n orphanCount: orphans.length,\n totalRequirements: requirements.length,\n reportMarkdown,\n };\n}\n","/**\n * AI-SDLC: Tasks Governance and Autonomy Classification Verifier\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n AutonomyMode,\n GovernanceOptions,\n GovernanceResult,\n TaskItem,\n TaskSummary,\n VALID_AUTONOMY_MODES,\n} from '../types/index.js';\n\ninterface TasksFrontmatter {\n tasks: TaskItem[];\n [key: string]: unknown;\n}\n\nexport function parseTasksDoc(content: string): { frontmatter: TasksFrontmatter; body: string } {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return { frontmatter: { tasks: [] }, body: content };\n\n let parsed: unknown;\n try {\n parsed = yaml.load(match[1]);\n } catch {\n return { frontmatter: { tasks: [] }, body: content };\n }\n\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return { frontmatter: { tasks: [] }, body: content };\n }\n\n const raw = parsed as Record<string, unknown>;\n const rawTasks = Array.isArray(raw['tasks']) ? (raw['tasks'] as Record<string, unknown>[]) : [];\n\n const tasks: TaskItem[] = rawTasks.map((t) => {\n const verification: TaskItem['verification'] = {};\n if (t['verification'] && typeof t['verification'] === 'object') {\n const v = t['verification'] as Record<string, unknown>;\n if (typeof v['method'] === 'string') verification.method = v['method'];\n if (typeof v['command-or-criteria'] === 'string') verification.criteria = v['command-or-criteria'];\n }\n return {\n id: typeof t['id'] === 'string' ? t['id'] : String(t['id'] ?? ''),\n title: typeof t['title'] === 'string' ? t['title'] : undefined,\n complexity: typeof t['complexity'] === 'string' ? t['complexity'] : undefined,\n riskLevel: typeof t['risk-level'] === 'string' ? t['risk-level'] : undefined,\n autonomyMode: typeof t['autonomy-mode'] === 'string' ? t['autonomy-mode'] : undefined,\n assignedTo: typeof t['assigned-to'] === 'string' ? t['assigned-to'] : undefined,\n status: typeof t['status'] === 'string' ? t['status'] : undefined,\n blockingReason: typeof t['blocking-reason'] === 'string' ? t['blocking-reason'] : undefined,\n verification,\n };\n });\n\n const frontmatter: TasksFrontmatter = { ...raw, tasks };\n return { frontmatter, body: content.substring(match[0].length) };\n}\n\nexport function walkTaskFiles(\n dir: string,\n fileList: string[] = [],\n excludeDirs: string[] = [\n 'node_modules',\n '.git',\n 'dist',\n '.changeset',\n 'scratch',\n 'test-scaffold',\n 'fixtures',\n 'templates',\n 'examples',\n ]\n): string[] {\n try {\n if (!fs.existsSync(dir)) return fileList;\n const files = fs.readdirSync(dir);\n for (const file of files) {\n const fullPath = path.join(dir, file);\n try {\n if (fs.statSync(fullPath).isDirectory()) {\n if (!excludeDirs.includes(file)) {\n walkTaskFiles(fullPath, fileList, excludeDirs);\n }\n } else if (\n (file.toLowerCase() === 'tasks.md' || file.endsWith('.tasks.md')) &&\n !file.includes('.template.')\n ) {\n fileList.push(fullPath);\n }\n } catch {\n // Ignore files unlinked concurrently\n }\n }\n } catch {\n // Ignore directories removed concurrently\n }\n return fileList;\n}\n\n\nexport function generateGovernanceReportMarkdown(\n summaries: TaskSummary[],\n violationsCount: number,\n modeCounts: Record<string, number>,\n totalTasks: number\n): string {\n const countAutonomous = modeCounts['AUTONOMOUS'] || 0;\n const countHumanReviewPlan = modeCounts['HUMAN_REVIEW_PLAN'] || 0;\n const countAmbiguous = modeCounts['AMBIGUOUS'] || 0;\n const countHighRiskManual = modeCounts['HIGH_RISK_MANUAL'] || 0;\n\n const reportContent: string[] = [\n `# 📋 Task Governance and Human Autonomy Classification Report`,\n ``,\n `> **Audit Date:** ${new Date().toISOString()}`,\n `> **Overall Verdict:** ${\n violationsCount === 0\n ? 'COMPLIANT (0 Governance Violations)'\n : `NON-COMPLIANT (${violationsCount} Violations detected)`\n }`,\n ``,\n `---`,\n ``,\n `## 1. Project Autonomy Modes Distribution`,\n ``,\n `| Autonomy Mode | Status | Count | Percentage | AI Agent Role | Human Intervention Required |`,\n `| :--- | :---: | :---: | :---: | :--- | :--- |`,\n `| **\\`AUTONOMOUS\\`** | 🟢 | **${countAutonomous}** | ${\n Math.round((countAutonomous / (totalTasks || 1)) * 100)\n }% | Autonomous planning and coding | Asynchronous final PR review |`,\n `| **\\`HUMAN_REVIEW_PLAN\\`** | 🟡 | **${countHumanReviewPlan}** | ${\n Math.round((countHumanReviewPlan / (totalTasks || 1)) * 100)\n }% | Detailed plan elaboration | **Explicit plan approval BEFORE coding** |`,\n `| **\\`AMBIGUOUS\\`** | 🟠 | **${countAmbiguous}** | ${\n Math.round((countAmbiguous / (totalTasks || 1)) * 100)\n }% | **HALTED**: Coding prohibited | Refinement and clarification with Product Owner |`,\n `| **\\`HIGH_RISK_MANUAL\\`** | 🔴 | **${countHighRiskManual}** | ${\n Math.round((countHighRiskManual / (totalTasks || 1)) * 100)\n }% | Pair-programming assistance only | **Direct execution by human engineers** |`,\n ``,\n `---`,\n ``,\n `## 2. Verifiable Tasks Detail and Acceptance Criteria`,\n ``,\n `| Task ID | Source File | Title | Risk | Autonomy | Concrete Verification Criterion | Assigned To | Status |`,\n `| :--- | :--- | :--- | :---: | :---: | :--- | :--- | :---: |`,\n ];\n\n for (const t of summaries) {\n const isConform = !t.riskAnomaly && t.hasVerification && t.validAutonomy;\n const icon = isConform ? '✅ OK' : '❌ GAP';\n const criteria = t.task.verification?.criteria || 'MISSING';\n reportContent.push(\n `| **\\`${t.task.id}\\`** | \\`${t.file}\\` | ${t.task.title || 'Untitled'} | \\`${\n t.task.riskLevel || 'MEDIUM'\n }\\` | \\`${t.task.autonomyMode || 'UNKNOWN'}\\` | \\`${criteria}\\` | \\`${\n t.task.assignedTo || 'agent-developer'\n }\\` | ${icon} |`\n );\n }\n\n reportContent.push('');\n reportContent.push('---');\n reportContent.push('');\n reportContent.push('## 3. Compliance Guidelines');\n reportContent.push(\n '1. No agent may start a task marked as `HUMAN_REVIEW_PLAN` without explicit human approval/comment in the issue/PR.'\n );\n reportContent.push(\n '2. Tasks marked as `AMBIGUOUS` require a Q&A session or refinement of the SDD specification.'\n );\n reportContent.push(\n '3. Every completed task must be accompanied by execution evidence of the specified verification command.'\n );\n\n return reportContent.join('\\n');\n}\n\nexport function verifyTasksGovernance(options: GovernanceOptions = {}): GovernanceResult {\n const rootDir = options.rootDir || process.cwd();\n const searchDir = options.specsDir || rootDir;\n const taskFiles = walkTaskFiles(searchDir);\n\n let totalTasks = 0;\n let unverifiedCount = 0;\n const taskSummaries: TaskSummary[] = [];\n const violationsList: string[] = [];\n\n const modeCounts: Record<string, number> = {\n AUTONOMOUS: 0,\n HUMAN_REVIEW_PLAN: 0,\n AMBIGUOUS: 0,\n HIGH_RISK_MANUAL: 0,\n };\n const riskCounts: Record<string, number> = {\n LOW: 0,\n MEDIUM: 0,\n HIGH: 0,\n CRITICAL: 0,\n };\n\n for (const file of taskFiles) {\n if (!fs.existsSync(file)) continue;\n let content: string;\n try {\n content = fs.readFileSync(file, 'utf-8');\n } catch {\n continue;\n }\n const { frontmatter } = parseTasksDoc(content);\n\n if (!frontmatter.tasks || frontmatter.tasks.length === 0) {\n continue;\n }\n\n const relPath = path.relative(rootDir, file).replace(/\\\\/g, '/');\n\n for (const t of frontmatter.tasks) {\n totalTasks++;\n\n const isModeValid = VALID_AUTONOMY_MODES.includes(t.autonomyMode as AutonomyMode);\n const hasVerification = Boolean(\n t.verification && t.verification.criteria && t.verification.criteria.length > 3\n );\n\n let safetyViolation: string | null = null;\n if (\n t.autonomyMode === 'HIGH_RISK_MANUAL' &&\n t.assignedTo &&\n t.assignedTo.startsWith('agent-') &&\n t.assignedTo !== 'pair-human-agent'\n ) {\n safetyViolation = `[${t.id}] HIGH RISK task assigned to autonomous agent without human supervisor.`;\n }\n if (t.autonomyMode === 'AMBIGUOUS' && t.status === 'IN_PROGRESS') {\n safetyViolation = `[${t.id}] AMBIGUOUS task in progress: Must halt until clarification.`;\n }\n if (!hasVerification) {\n safetyViolation = `[${t.id}] Missing concrete verification criterion or command.`;\n unverifiedCount++;\n }\n if (!isModeValid) {\n safetyViolation = `[${t.id}] Invalid autonomy mode: \"${t.autonomyMode}\".`;\n }\n\n if (safetyViolation) {\n violationsList.push(safetyViolation);\n }\n\n if (t.autonomyMode && modeCounts[t.autonomyMode] !== undefined) {\n modeCounts[t.autonomyMode]++;\n }\n const risk = (t.riskLevel || 'MEDIUM').toUpperCase();\n if (riskCounts[risk] !== undefined) {\n riskCounts[risk]++;\n }\n\n taskSummaries.push({\n file: relPath,\n task: t,\n hasVerification,\n validAutonomy: isModeValid,\n riskAnomaly: Boolean(safetyViolation),\n });\n }\n }\n\n const reportMarkdown = generateGovernanceReportMarkdown(\n taskSummaries,\n violationsList.length,\n modeCounts,\n totalTasks\n );\n\n return {\n success: violationsList.length === 0,\n totalTasks,\n verifiedCount: totalTasks - unverifiedCount,\n unverifiedCount,\n riskCounts,\n modeCounts,\n tasks: taskSummaries,\n violations: violationsList,\n reportMarkdown,\n };\n}\n","/**\n * AI-SDLC: Test Linkage and Coverage Auditor for Requirements and Tasks\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n RequirementAuditItem,\n TaskAuditItem,\n TestingCoverageOptions,\n TestingCoverageResult,\n} from '../types/index.js';\nimport { walkMdFiles } from '../utils/fs.js';\n\ninterface ParsedTaskItem {\n id: string;\n title?: string;\n verification?: {\n method?: string;\n criteria?: string;\n };\n}\n\ninterface GenericFrontmatter {\n id?: string;\n title?: string;\n type?: string;\n 'cucumber-feature-file'?: string;\n 'verified-by-tests'?: string[];\n 'verifiable-by'?: string;\n 'acceptance-format'?: string;\n tasks?: ParsedTaskItem[];\n [key: string]: unknown;\n}\n\nexport function parseGenericDoc(content: string): { frontmatter: GenericFrontmatter; body: string } {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return { frontmatter: {}, body: content };\n\n let parsed: unknown;\n try {\n parsed = yaml.load(match[1]);\n } catch {\n return { frontmatter: {}, body: content };\n }\n\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return { frontmatter: {}, body: content };\n }\n\n const raw = parsed as Record<string, unknown>;\n\n const rawTasks = Array.isArray(raw['tasks']) ? (raw['tasks'] as Record<string, unknown>[]) : [];\n const tasks: ParsedTaskItem[] = rawTasks.map((t) => {\n const verification: ParsedTaskItem['verification'] = {};\n if (t['verification'] && typeof t['verification'] === 'object') {\n const v = t['verification'] as Record<string, unknown>;\n if (typeof v['method'] === 'string') verification.method = v['method'];\n if (typeof v['command-or-criteria'] === 'string') verification.criteria = v['command-or-criteria'];\n }\n return {\n id: typeof t['id'] === 'string' ? t['id'] : String(t['id'] ?? ''),\n title: typeof t['title'] === 'string' ? t['title'] : undefined,\n verification,\n };\n });\n\n const verifiedBy = raw['verified-by-tests'];\n const frontmatter: GenericFrontmatter = {\n ...raw,\n tasks,\n 'verified-by-tests': Array.isArray(verifiedBy)\n ? (verifiedBy as unknown[]).map(String)\n : typeof verifiedBy === 'string'\n ? [verifiedBy]\n : undefined,\n };\n\n return { frontmatter, body: content.substring(match[0].length) };\n}\n\n\n\nexport function generateTestingCoverageReportMarkdown(\n reqAudit: RequirementAuditItem[],\n taskAudit: TaskAuditItem[],\n reqErrors: number,\n taskErrors: number\n): string {\n const totalErrors = reqErrors + taskErrors;\n const reportLines: string[] = [\n `# 🧪 Deterministic Test Coverage Audit for Requirements and Tasks`,\n ``,\n `> **Audit Date:** ${new Date().toISOString()}`,\n `> **Overall Verdict:** ${\n totalErrors === 0\n ? '100% VERIFIED WITH TESTS (PASSED)'\n : `BLOCKED: Detected ${totalErrors} items without tests (${reqErrors} Requirements, ${taskErrors} Tasks)`\n }`,\n ``,\n `---`,\n ``,\n `## 1. Requirements Audit (Product, Quality, and Security)`,\n ``,\n `| Requirement ID | Title | Source File | Declared Method | Linked Test Files | Status |`,\n `| :--- | :--- | :--- | :---: | :--- | :---: |`,\n ];\n\n for (const r of reqAudit) {\n const icon = r.status === 'VERIFICADO_CON_PRUEBA' ? '✅ VERIFIED' : '❌ NO TESTS';\n reportLines.push(\n `| **\\`${r.id}\\`** | ${r.title} | \\`${r.file}\\` | \\`${r.method}\\` | \\`${r.testRefs}\\` | ${icon} |`\n );\n }\n\n reportLines.push('');\n reportLines.push('---');\n reportLines.push('');\n reportLines.push('## 2. Tasks Audit (SDD Delivery Engineering)');\n reportLines.push('');\n reportLines.push(\n '| Task ID | Title | tasks.md File | Method | Verification Command / Criterion | Status |'\n );\n reportLines.push('| :--- | :--- | :--- | :---: | :--- | :---: |');\n\n for (const t of taskAudit) {\n const icon = t.status === 'VERIFICADO_CON_PRUEBA' ? '✅ VERIFIED' : '❌ NO TESTS';\n reportLines.push(\n `| **\\`${t.id}\\`** | ${t.title} | \\`${t.file}\\` | \\`${t.method}\\` | \\`${t.commandOrCriteria}\\` | ${icon} |`\n );\n }\n\n return reportLines.join('\\n');\n}\n\nexport function scanAllTestArtifacts(rootDir: string): Map<string, string[]> {\n const reqToTestsMap = new Map<string, string[]>();\n\n function walk(dir: string) {\n if (!fs.existsSync(dir)) return;\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const e of entries) {\n const fullPath = path.join(dir, e.name);\n if (e.isDirectory()) {\n if (!['node_modules', '.git', 'dist', '.changeset', 'scratch', 'fixtures', 'templates', 'examples'].includes(e.name)) {\n walk(fullPath);\n }\n } else {\n const isFeature = e.name.endsWith('.feature');\n const isCodeTest =\n e.name.endsWith('.spec.ts') ||\n e.name.endsWith('.spec.js') ||\n e.name.endsWith('.test.ts') ||\n e.name.endsWith('.test.js') ||\n e.name.endsWith('_test.py') ||\n e.name.endsWith('_test.go');\n\n if (isFeature || isCodeTest) {\n try {\n const content = fs.readFileSync(fullPath, 'utf-8');\n const relTest = path.relative(rootDir, fullPath).replace(/\\\\/g, '/');\n\n if (isFeature) {\n const lines = content.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.startsWith('@')) {\n const tags = trimmed.split(/\\s+/).filter((t) => t.startsWith('@'));\n for (const t of tags) {\n const reqId = t.substring(1);\n const existing = reqToTestsMap.get(reqId) || [];\n if (!existing.includes(relTest)) existing.push(relTest);\n reqToTestsMap.set(reqId, existing);\n }\n }\n }\n }\n\n const idMatches = content.match(/\\b(FR|QR|CON|SEC-REQ)-[A-Z0-9]+(-[A-Z0-9]+)*\\b/g);\n if (idMatches) {\n for (const reqId of idMatches) {\n const existing = reqToTestsMap.get(reqId) || [];\n if (!existing.includes(relTest)) existing.push(relTest);\n reqToTestsMap.set(reqId, existing);\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n }\n }\n\n walk(rootDir);\n return reqToTestsMap;\n}\n\nexport function verifyTestingCoverage(options: TestingCoverageOptions = {}): TestingCoverageResult {\n const rootDir = options.rootDir || process.cwd();\n const allMdFiles = walkMdFiles(rootDir);\n const reqToTestsMap = scanAllTestArtifacts(rootDir);\n\n const reqAudit: RequirementAuditItem[] = [];\n const taskAudit: TaskAuditItem[] = [];\n\n let reqErrors = 0;\n let taskErrors = 0;\n\n for (const file of allMdFiles) {\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const { frontmatter } = parseGenericDoc(content);\n const relPath = path.relative(rootDir, file).replace(/\\\\/g, '/');\n const isTemplate = relPath.includes('templates/');\n\n const id = frontmatter.id || '';\n const isRequirement =\n frontmatter.type === 'requirement' ||\n frontmatter.type === 'security-requirement' ||\n id.startsWith('FR-') ||\n id.startsWith('QR-') ||\n id.startsWith('CON-') ||\n id.startsWith('SEC-REQ-');\n\n if (isRequirement) {\n const matchingTests = reqToTestsMap.get(id) || [];\n const isVerified = isTemplate || matchingTests.length > 0;\n\n if (!isVerified) reqErrors++;\n\n reqAudit.push({\n id: id || 'SIN-ID',\n title: frontmatter.title || 'Sin título',\n file: relPath,\n isTemplate,\n method:\n (frontmatter['verifiable-by'] as string) ||\n (matchingTests.some((t) => t.endsWith('.feature')) ? 'BDD_CUCUMBER' : 'TEST_EXECUTION'),\n testRefs: matchingTests.join(', ') || 'NINGUNA DETECTADA',\n existingCount: matchingTests.length,\n status: isVerified ? 'VERIFICADO_CON_PRUEBA' : 'FALLO_SIN_PRUEBA',\n });\n }\n\n if (Array.isArray(frontmatter.tasks) && frontmatter.tasks.length > 0) {\n for (const t of frontmatter.tasks) {\n const crit = t.verification?.criteria || '';\n const meth = t.verification?.method || 'TEST_EXECUTION';\n const hasProof = isTemplate || (crit.length > 4 && !crit.includes('TODO') && !crit.includes('TBD'));\n\n if (!hasProof) taskErrors++;\n\n taskAudit.push({\n id: t.id,\n title: t.title || 'Sin título',\n file: relPath,\n method: meth,\n commandOrCriteria: crit || 'AUSENTE',\n status: hasProof ? 'VERIFICADO_CON_PRUEBA' : 'FALLO_SIN_PRUEBA',\n });\n }\n }\n } catch {\n // Ignore unparseable files\n }\n }\n\n const reportMarkdown = generateTestingCoverageReportMarkdown(reqAudit, taskAudit, reqErrors, taskErrors);\n\n return {\n success: reqErrors === 0 && taskErrors === 0,\n totalRequirements: reqAudit.length,\n passedRequirements: reqAudit.length - reqErrors,\n failedRequirements: reqErrors,\n totalTasks: taskAudit.length,\n passedTasks: taskAudit.length - taskErrors,\n failedTasks: taskErrors,\n requirements: reqAudit,\n tasks: taskAudit,\n reportMarkdown,\n };\n}\n","/**\n * AI-SDLC: Dynamic Software Composition Analysis (SCA) Scanner\n * Inspects installed dependencies in node_modules, lockfiles, or external SCA tools (Trivy, Syft).\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as child_process from 'child_process';\nimport { ScannedDependency, ScaTool } from '../../types/index.js';\n\nexport interface ScanOptions {\n depth?: 'direct' | 'transitive';\n tool?: ScaTool;\n productionOnly?: boolean;\n}\n\nexport function isToolAvailable(toolName: string): boolean {\n try {\n const cmd = process.platform === 'win32' ? 'where' : 'which';\n child_process.execFileSync(cmd, [toolName], { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function normalizeSpdxLicense(raw: any): string {\n if (!raw) return 'UNKNOWN';\n if (typeof raw === 'string') {\n const trimmed = raw.trim();\n return trimmed.length > 0 ? trimmed : 'UNKNOWN';\n }\n if (Array.isArray(raw)) {\n const parts = raw.map((item) => normalizeSpdxLicense(item)).filter((id) => id !== 'UNKNOWN');\n if (parts.length === 0) return 'UNKNOWN';\n if (parts.length === 1) return parts[0];\n return `(${parts.join(' OR ')})`;\n }\n if (typeof raw === 'object') {\n if (raw.type && typeof raw.type === 'string') return raw.type.trim();\n if (raw.name && typeof raw.name === 'string') return raw.name.trim();\n if (raw.license && typeof raw.license === 'string') return raw.license.trim();\n }\n return 'UNKNOWN';\n}\n\nexport function findLicenseFile(pkgDir: string): string | undefined {\n const candidates = [\n 'LICENSE',\n 'LICENSE.md',\n 'LICENSE.txt',\n 'LICENCE',\n 'LICENCE.md',\n 'LICENCE.txt',\n 'license',\n 'license.md',\n 'license.txt',\n ];\n for (const c of candidates) {\n const full = path.join(pkgDir, c);\n if (fs.existsSync(full)) {\n return full;\n }\n }\n return undefined;\n}\n\nexport function resolveLicenseFromFile(licenseFilePath?: string): string | undefined {\n if (!licenseFilePath || !fs.existsSync(licenseFilePath)) return undefined;\n try {\n const text = fs.readFileSync(licenseFilePath, 'utf-8');\n if (text.includes('Apache License') && text.includes('Version 2.0')) {\n return 'Apache-2.0';\n }\n if (text.includes('MIT License') || text.includes('Permission is hereby granted, free of charge')) {\n return 'MIT';\n }\n if (text.includes('Blue Oak Model License 1.0.0')) {\n return 'BlueOak-1.0.0';\n }\n if (text.includes('Python Software Foundation License') || text.includes('PSF LICENSE AGREEMENT')) {\n return 'Python-2.0';\n }\n if (text.includes('Redistribution and use in source and binary forms') && text.includes('Neither the name')) {\n return 'BSD-3-Clause';\n }\n if (text.includes('ISC License')) {\n return 'ISC';\n }\n if (text.includes('Microsoft Public License') || text.includes('MS-PL')) {\n return 'MS-PL';\n }\n if (text.includes('Microsoft Reciprocal License') || text.includes('MS-RL')) {\n return 'MS-RL';\n }\n } catch {\n // Ignore read error\n }\n return undefined;\n}\n\nexport function readPackageJson(filePath: string): any | null {\n if (!fs.existsSync(filePath)) return null;\n try {\n return JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function extractDirectDepNames(rootDir: string, productionOnly?: boolean): Set<string> {\n const names = new Set<string>();\n const pkgPath = path.join(rootDir, 'package.json');\n const pkg = readPackageJson(pkgPath);\n if (!pkg) return names;\n\n if (pkg.dependencies && typeof pkg.dependencies === 'object') {\n Object.keys(pkg.dependencies).forEach((d) => names.add(d));\n }\n if (!productionOnly && pkg.devDependencies && typeof pkg.devDependencies === 'object') {\n Object.keys(pkg.devDependencies).forEach((d) => names.add(d));\n }\n return names;\n}\n\nexport function processPackageDir(pkgDir: string, directNames: Set<string>, seen: Map<string, ScannedDependency>): void {\n const pkgJsonPath = path.join(pkgDir, 'package.json');\n const pkg = readPackageJson(pkgJsonPath);\n if (!pkg || !pkg.name || !pkg.version) return;\n\n const key = `${pkg.name}@${pkg.version}`;\n if (seen.has(key)) return;\n\n const licFile = findLicenseFile(pkgDir);\n let spdx = normalizeSpdxLicense(pkg.license || pkg.licenses);\n\n if (spdx === 'UNKNOWN' || spdx.toUpperCase().includes('SEE LICENSE')) {\n const inferred = resolveLicenseFromFile(licFile);\n if (inferred) spdx = inferred;\n }\n\n const repoUrl = typeof pkg.repository === 'string' ? pkg.repository : pkg.repository?.url;\n const authorStr = typeof pkg.author === 'string' ? pkg.author : pkg.author?.name;\n\n seen.set(key, {\n name: pkg.name,\n version: pkg.version,\n spdxLicense: spdx,\n purl: `pkg:npm/${pkg.name}@${pkg.version}`,\n path: pkgDir,\n licenseFile: licFile,\n repository: repoUrl,\n author: authorStr,\n isDirect: directNames.has(pkg.name),\n });\n}\n\nexport function scanSubdirectories(baseDir: string, directNames: Set<string>, seen: Map<string, ScannedDependency>): void {\n if (!fs.existsSync(baseDir)) return;\n const entries = fs.readdirSync(baseDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (entry.name.startsWith('@')) {\n const scopeDir = path.join(baseDir, entry.name);\n const scopedEntries = fs.readdirSync(scopeDir, { withFileTypes: true });\n for (const scoped of scopedEntries) {\n if (scoped.isDirectory()) {\n processPackageDir(path.join(scopeDir, scoped.name), directNames, seen);\n }\n }\n } else if (entry.name !== '.bin' && entry.name !== '.pnpm') {\n processPackageDir(path.join(baseDir, entry.name), directNames, seen);\n }\n }\n}\n\nexport function scanPnpmStore(pnpmDir: string, directNames: Set<string>, seen: Map<string, ScannedDependency>): void {\n if (!fs.existsSync(pnpmDir)) return;\n const entries = fs.readdirSync(pnpmDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const candidateModules = path.join(pnpmDir, entry.name, 'node_modules');\n if (fs.existsSync(candidateModules)) {\n scanSubdirectories(candidateModules, directNames, seen);\n }\n }\n}\n\nexport function scanWithNativeFs(rootDir: string, options: ScanOptions = {}): ScannedDependency[] {\n const directNames = extractDirectDepNames(rootDir, options.productionOnly);\n const seen = new Map<string, ScannedDependency>();\n const nmDir = path.join(rootDir, 'node_modules');\n\n if (fs.existsSync(nmDir)) {\n scanSubdirectories(nmDir, directNames, seen);\n if (options.depth !== 'direct') {\n scanPnpmStore(path.join(nmDir, '.pnpm'), directNames, seen);\n }\n }\n\n const allDeps = Array.from(seen.values());\n if (options.depth === 'direct') {\n return allDeps.filter((d) => d.isDirect);\n }\n return allDeps.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function scanWithTrivy(rootDir: string): { dependencies: ScannedDependency[]; executed: boolean } {\n if (!isToolAvailable('trivy')) {\n return { dependencies: [], executed: false };\n }\n try {\n const res = child_process.spawnSync(\n 'trivy',\n ['fs', '--format', 'json', '--security-checks', 'license', rootDir],\n { encoding: 'utf-8', timeout: 30000 }\n );\n if (res.status !== 0 || !res.stdout) {\n return { dependencies: [], executed: false };\n }\n const data = JSON.parse(res.stdout);\n const deps: ScannedDependency[] = [];\n if (Array.isArray(data.Results)) {\n for (const r of data.Results) {\n if (Array.isArray(r.Packages)) {\n for (const p of r.Packages) {\n deps.push({\n name: p.Name,\n version: p.Version || 'unknown',\n spdxLicense: normalizeSpdxLicense(p.Licenses?.[0] || 'UNKNOWN'),\n purl: p.Identifier?.PURL || `pkg:npm/${p.Name}@${p.Version || 'unknown'}`,\n });\n }\n }\n }\n }\n return { dependencies: deps, executed: true };\n } catch {\n return { dependencies: [], executed: false };\n }\n}\n\nexport function scanWithSyft(rootDir: string): { dependencies: ScannedDependency[]; executed: boolean } {\n if (!isToolAvailable('syft')) {\n return { dependencies: [], executed: false };\n }\n try {\n const res = child_process.spawnSync('syft', [`dir:${rootDir}`, '-o', 'json'], {\n encoding: 'utf-8',\n timeout: 30000,\n });\n if (res.status !== 0 || !res.stdout) {\n return { dependencies: [], executed: false };\n }\n const data = JSON.parse(res.stdout);\n const deps: ScannedDependency[] = [];\n if (Array.isArray(data.artifacts)) {\n for (const a of data.artifacts) {\n const lic = a.licenses?.[0]?.value || 'UNKNOWN';\n deps.push({\n name: a.name,\n version: a.version || 'unknown',\n spdxLicense: normalizeSpdxLicense(lic),\n purl: a.purl || `pkg:npm/${a.name}@${a.version || 'unknown'}`,\n author: a.metadata?.author,\n });\n }\n }\n return { dependencies: deps, executed: true };\n } catch {\n return { dependencies: [], executed: false };\n }\n}\n\nexport function scanInstalledLicenses(rootDir: string, options: ScanOptions = {}): ScannedDependency[] {\n const selectedTool = options.tool || 'native';\n\n if (selectedTool === 'trivy') {\n const trivyResult = scanWithTrivy(rootDir);\n if (trivyResult.executed && trivyResult.dependencies.length > 0) {\n return trivyResult.dependencies;\n }\n }\n\n if (selectedTool === 'syft') {\n const syftResult = scanWithSyft(rootDir);\n if (syftResult.executed && syftResult.dependencies.length > 0) {\n return syftResult.dependencies;\n }\n }\n\n return scanWithNativeFs(rootDir, {\n depth: options.depth || 'transitive',\n productionOnly: options.productionOnly,\n });\n}\n","/**\n * AI-SDLC: CycloneDX 1.5 JSON SBOM & Third-Party Notices Generator\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport { CycloneDxBom, CycloneDxComponent, ScannedDependency } from '../../types/index.js';\n\nexport interface SbomGenerateOptions {\n rootDir?: string;\n projectName?: string;\n projectVersion?: string;\n}\n\nexport function buildCycloneDxComponent(dep: ScannedDependency): CycloneDxComponent {\n const comp: CycloneDxComponent = {\n type: 'library',\n name: dep.name,\n version: dep.version,\n purl: dep.purl || `pkg:npm/${dep.name}@${dep.version}`,\n author: dep.author,\n };\n\n if (dep.spdxLicense && dep.spdxLicense !== 'UNKNOWN') {\n comp.licenses = [\n {\n license: {\n id: dep.spdxLicense,\n },\n },\n ];\n } else {\n comp.licenses = [\n {\n license: {\n name: 'NOASSERTION',\n },\n },\n ];\n }\n\n return comp;\n}\n\nexport function generateCycloneDxSbom(\n dependencies: ScannedDependency[],\n options: SbomGenerateOptions = {}\n): CycloneDxBom {\n let name = options.projectName || 'ai-sdlc-project';\n let version = options.projectVersion || '1.0.0';\n\n if (options.rootDir) {\n const pkgPath = path.join(options.rootDir, 'package.json');\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n if (pkg.name) name = pkg.name;\n if (pkg.version) version = pkg.version;\n } catch {\n // Ignore read error\n }\n }\n }\n\n const components = dependencies.map(buildCycloneDxComponent);\n\n return {\n bomFormat: 'CycloneDX',\n specVersion: '1.5',\n version: 1,\n serialNumber: `urn:uuid:${crypto.randomUUID()}`,\n metadata: {\n timestamp: new Date().toISOString(),\n tools: [\n {\n vendor: 'AI-SDLC',\n name: '@aisdlc/core',\n version: '1.0.0',\n },\n ],\n component: {\n type: 'application',\n name,\n version,\n },\n },\n components,\n };\n}\n\nfunction safeWriteFileSync(filePath: string, content: string): void {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n let attempts = 10;\n while (attempts > 0) {\n try {\n const tempPath = `${filePath}.${process.pid}.${Math.random().toString(36).substring(2)}.tmp`;\n fs.writeFileSync(tempPath, content, 'utf-8');\n try {\n if (fs.existsSync(filePath)) {\n fs.rmSync(filePath, { force: true });\n }\n fs.renameSync(tempPath, filePath);\n } catch {\n try {\n fs.copyFileSync(tempPath, filePath);\n fs.unlinkSync(tempPath);\n } catch {\n // ignore fallback error\n }\n }\n return;\n } catch {\n attempts--;\n if (attempts === 0) {\n try {\n fs.writeFileSync(filePath, content, 'utf-8');\n } catch {\n // Ignore transient lock error if another worker already wrote the report\n }\n return;\n }\n const delay = Math.floor(Math.random() * 50) + 50;\n const start = Date.now();\n while (Date.now() - start < delay) {\n // wait\n }\n }\n }\n}\n\nexport function writeCycloneDxSbom(sbom: CycloneDxBom, outputPath: string): void {\n safeWriteFileSync(outputPath, JSON.stringify(sbom, null, 2));\n}\n\nexport function generateThirdPartyNotices(\n dependencies: ScannedDependency[],\n projectName = 'AI-SDLC'\n): string {\n const lines = [\n `# 📜 Third-Party Software Notices and Information`,\n ``,\n `> **Proyecto:** ${projectName}`,\n `> **Fecha:** ${new Date().toISOString().split('T')[0]}`,\n `> **Total Componentes:** ${dependencies.length}`,\n ``,\n `Este documento contiene los avisos de copyright y términos de licencia aplicables a los componentes de terceros utilizados en este proyecto.`,\n ``,\n `---`,\n ``,\n `## Resumen de Licencias de Terceros`,\n ``,\n `| Paquete | Versión | Licencia SPDX |`,\n `| :--- | :--- | :---: |`,\n ];\n\n for (const dep of dependencies) {\n lines.push(`| **\\`${dep.name}\\`** | \\`${dep.version}\\` | \\`${dep.spdxLicense}\\` |`);\n }\n\n lines.push('');\n lines.push('---');\n lines.push('');\n lines.push('## Textos de Licencia y Atribuciones');\n lines.push('');\n\n for (const dep of dependencies) {\n lines.push(`### ${dep.name}@${dep.version}`);\n lines.push(`- **Licencia:** \\`${dep.spdxLicense}\\``);\n if (dep.author) lines.push(`- **Autor:** ${dep.author}`);\n if (dep.repository) lines.push(`- **Repositorio:** ${dep.repository}`);\n\n if (dep.licenseFile && fs.existsSync(dep.licenseFile)) {\n try {\n const text = fs.readFileSync(dep.licenseFile, 'utf-8').trim();\n lines.push('');\n lines.push('```');\n lines.push(text.slice(0, 1000) + (text.length > 1000 ? '\\n... (texto truncado)' : ''));\n lines.push('```');\n } catch {\n // Ignore read error\n }\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nexport function writeThirdPartyNotices(content: string, outputPath: string): void {\n safeWriteFileSync(outputPath, content);\n}\n","/**\n * AI-SDLC: Open Source License Compliance & Governance Verifier\n * Supports dynamic Software Composition Analysis (SCA) with CycloneDX SBOM generation.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n LicensePolicy,\n LicenseVerificationOptions,\n LicenseVerificationResult,\n LicenseViolation,\n ScannedDependency,\n} from '../types/index.js';\nimport { scanInstalledLicenses } from './sca/scanner.js';\nimport {\n generateCycloneDxSbom,\n generateThirdPartyNotices,\n writeCycloneDxSbom,\n writeThirdPartyNotices,\n} from './sca/sbom.js';\n\ninterface RawPolicyCategory {\n action: 'ALLOW' | 'REVIEW_REQUIRED' | 'DENY' | 'COMMERCIAL_APPROVAL_REQUIRED' | string;\n description?: string;\n spdx_identifiers: string[];\n}\n\ninterface RawLicensePolicy {\n version?: string;\n categories?: Record<string, RawPolicyCategory>;\n exceptions?: {\n approved_commercial_packages?: { package: string; license: string; reason?: string }[];\n };\n ci_gates?: {\n generate_sbom?: boolean;\n sbom_format?: string;\n output_notices_file?: string;\n allowed_depth?: 'DIRECT' | 'TRANSITIVE' | string;\n };\n}\n\ninterface ManifestDependency {\n package: string;\n version?: string;\n spdx_license: string;\n category?: string;\n status: string;\n usage?: string;\n commercial_payment_required?: boolean;\n rejection_reason?: string;\n}\n\ninterface ManifestFile {\n evaluated_dependencies?: ManifestDependency[];\n}\n\nconst DEFAULT_PERMITTED = [\n 'MIT',\n 'Apache-2.0',\n 'BSD-2-Clause',\n 'BSD-3-Clause',\n 'ISC',\n 'Unlicense',\n 'CC0-1.0',\n '0BSD',\n 'Zlib',\n 'BlueOak-1.0.0',\n 'Python-2.0',\n 'CC-BY-3.0',\n 'CC-BY-4.0',\n 'MS-PL',\n];\n\nconst DEFAULT_RESTRICTED = [\n 'LGPL-2.1-only',\n 'LGPL-2.1-or-later',\n 'LGPL-3.0-only',\n 'LGPL-3.0-or-later',\n 'MPL-2.0',\n 'EPL-2.0',\n 'CDDL-1.0',\n 'MS-RL',\n 'MS-LPL',\n 'MS-LRL',\n 'SSPL-1.0',\n 'BSL-1.1',\n 'Elastic-2.0',\n 'Redis-Source-Available-1.0',\n 'CockroachDB-BSL',\n 'Commons-Clause',\n];\n\nconst DEFAULT_BLOCKED = [\n 'GPL-2.0-only',\n 'GPL-2.0-or-later',\n 'GPL-3.0-only',\n 'GPL-3.0-or-later',\n 'AGPL-3.0-only',\n 'AGPL-3.0-or-later',\n 'EUPL-1.2',\n 'OSL-3.0',\n];\n\nexport function parseLicensePolicy(content: string): LicensePolicy & { rawPolicy?: RawLicensePolicy } {\n try {\n const doc = yaml.load(content) as RawLicensePolicy;\n const permitted: string[] = [];\n const restricted: string[] = [];\n const blocked: string[] = [];\n const exception_packages: Record<string, string> = {};\n\n if (doc?.categories) {\n for (const [, cat] of Object.entries(doc.categories)) {\n if (cat.action === 'ALLOW') {\n permitted.push(...(cat.spdx_identifiers || []));\n } else if (cat.action === 'REVIEW_REQUIRED' || cat.action === 'COMMERCIAL_APPROVAL_REQUIRED') {\n restricted.push(...(cat.spdx_identifiers || []));\n } else if (cat.action === 'DENY') {\n blocked.push(...(cat.spdx_identifiers || []));\n }\n }\n }\n\n if (doc?.exceptions?.approved_commercial_packages) {\n for (const exp of doc.exceptions.approved_commercial_packages) {\n exception_packages[exp.package] = exp.reason || 'APPROVED';\n }\n }\n\n return {\n version: doc?.version || '1.0',\n permitted: permitted.length > 0 ? permitted : DEFAULT_PERMITTED,\n restricted: restricted.length > 0 ? restricted : DEFAULT_RESTRICTED,\n blocked: blocked.length > 0 ? blocked : DEFAULT_BLOCKED,\n exception_packages,\n rawPolicy: doc,\n };\n } catch {\n return {\n version: '1.0',\n permitted: DEFAULT_PERMITTED,\n restricted: DEFAULT_RESTRICTED,\n blocked: DEFAULT_BLOCKED,\n exception_packages: {},\n };\n }\n}\n\nexport function evaluateCompoundLicense(\n lic: string,\n policy: LicensePolicy\n): { isPermitted: boolean; isBlocked: boolean; isRestricted: boolean } {\n const cleanLic = lic.replace(/[()]/g, '').trim();\n\n if (cleanLic.includes(' OR ')) {\n const parts = cleanLic.split(' OR ').map((p) => p.trim());\n const anyPermitted = parts.some((p) => policy.permitted.includes(p));\n const allBlocked = parts.every((p) => policy.blocked.includes(p));\n return { isPermitted: anyPermitted, isBlocked: allBlocked && !anyPermitted, isRestricted: false };\n }\n\n if (cleanLic.includes(' AND ')) {\n const parts = cleanLic.split(' AND ').map((p) => p.trim());\n const anyBlocked = parts.some((p) => policy.blocked.includes(p));\n const allPermitted = parts.every((p) => policy.permitted.includes(p));\n return { isPermitted: allPermitted, isBlocked: anyBlocked, isRestricted: false };\n }\n\n return {\n isPermitted: policy.permitted.includes(cleanLic),\n isBlocked: policy.blocked.includes(cleanLic),\n isRestricted: policy.restricted.includes(cleanLic),\n };\n}\n\nexport function evaluateSingleDependency(dep: ScannedDependency, policy: LicensePolicy): LicenseViolation | null {\n const lic = dep.spdxLicense;\n if (lic === 'UNKNOWN' || !lic) {\n return {\n packageName: dep.name,\n version: dep.version,\n license: 'UNKNOWN',\n category: 'UNRECOGNIZED',\n reason: `Unknown or unidentified license for \"${dep.name}\". Formal license resolution required.`,\n };\n }\n\n const evalResult = evaluateCompoundLicense(lic, policy);\n\n if (evalResult.isBlocked) {\n return {\n packageName: dep.name,\n version: dep.version,\n license: lic,\n category: 'BLOCKED',\n reason: `License \"${lic}\" is classified as Strong Copyleft / Viral. Prohibited in commercial code or SaaS.`,\n };\n }\n\n if (evalResult.isRestricted) {\n if (policy.exception_packages?.[dep.name]) {\n return null;\n }\n return {\n packageName: dep.name,\n version: dep.version,\n license: lic,\n category: 'RESTRICTED',\n reason: `License \"${lic}\" requires explicit commercial or architecture approval in license-policy.yaml.`,\n };\n }\n\n if (evalResult.isPermitted) {\n return null;\n }\n\n return {\n packageName: dep.name,\n version: dep.version,\n license: lic,\n category: 'UNRECOGNIZED',\n reason: `License \"${lic}\" is not registered in the permitted categories of license-policy.yaml.`,\n };\n}\n\nexport function generateLicenseReportMarkdown(\n dependencies: ScannedDependency[],\n violations: LicenseViolation[],\n policy: LicensePolicy,\n sbomPath?: string\n): string {\n const isOk = violations.length === 0;\n const lines: string[] = [\n `# 📜 Open Source License Compliance Audit (Dynamic SCA)`,\n ``,\n `> **Verification Date:** ${new Date().toISOString()}`,\n `> **Status:** ${isOk ? '✅ COMPLIANT (100% Permitted / Authorized Licenses)' : `❌ NON-COMPLIANT (${violations.length} Violations Detected)`}`,\n `> **Total Audited Dependencies:** ${dependencies.length}`,\n sbomPath ? `> **Generated CycloneDX SBOM:** \\`${sbomPath}\\`` : '',\n ``,\n `---`,\n ``,\n `## 1. Evaluated Dependencies Summary`,\n ``,\n `| Package | Version | SPDX License | Type | AI-SDLC Verdict |`,\n `| :--- | :--- | :---: | :---: | :---: |`,\n ];\n\n for (const dep of dependencies) {\n const violation = violations.find((v) => v.packageName === dep.name);\n const verdict = violation ? `❌ ${violation.category}` : '✅ PERMITTED';\n const depType = dep.isDirect ? 'Direct' : 'Transitive';\n lines.push(`| **\\`${dep.name}\\`** | \\`${dep.version}\\` | \\`${dep.spdxLicense}\\` | ${depType} | ${verdict} |`);\n }\n\n if (violations.length > 0) {\n lines.push('', '---', '', '## 2. License Violations and Alerts', '');\n lines.push('| Package | License | Category | Violation Details |');\n lines.push('| :--- | :---: | :---: | :--- |');\n for (const v of violations) {\n lines.push(`| **\\`${v.packageName}\\`** | \\`${v.license}\\` | \\`${v.category}\\` | ${v.reason} |`);\n }\n }\n\n lines.push('', '---', '', '## 3. Active SPDX Policies');\n lines.push(`- **Permissive (${policy.permitted.length}):** \\`${policy.permitted.slice(0, 8).join('`, `')}${policy.permitted.length > 8 ? '...' : ''}\\``);\n lines.push(`- **Restricted (${policy.restricted.length}):** \\`${policy.restricted.join('`, `')}\\``);\n lines.push(`- **Blocked/Viral (${policy.blocked.length}):** \\`${policy.blocked.join('`, `')}\\``);\n\n return lines.filter(Boolean).join('\\n');\n}\n\nfunction verifyStaticManifest(\n manifestFile: string,\n policy: LicensePolicy\n): { dependencies: ScannedDependency[]; violations: LicenseViolation[]; permittedCount: number } {\n const scanned: ScannedDependency[] = [];\n const violations: LicenseViolation[] = [];\n let permittedCount = 0;\n\n if (fs.existsSync(manifestFile)) {\n try {\n const doc = yaml.load(fs.readFileSync(manifestFile, 'utf-8')) as ManifestFile;\n if (Array.isArray(doc?.evaluated_dependencies)) {\n for (const dep of doc.evaluated_dependencies) {\n const item: ScannedDependency = {\n name: dep.package,\n version: dep.version || 'unknown',\n spdxLicense: dep.spdx_license,\n isDirect: true,\n };\n scanned.push(item);\n\n if (dep.status !== 'APPROVED') {\n continue;\n }\n\n const v = evaluateSingleDependency(item, policy);\n if (v) {\n violations.push(v);\n } else {\n permittedCount++;\n }\n }\n }\n } catch {\n // Ignore unparseable manifest\n }\n }\n\n return { dependencies: scanned, violations, permittedCount };\n}\n\nexport function verifyLicenses(options: LicenseVerificationOptions = {}): LicenseVerificationResult {\n const rootDir = options.rootDir || process.cwd();\n const policyFile = options.policyPath || path.join(rootDir, 'license-policy.yaml');\n\n let policyWithRaw = fs.existsSync(policyFile)\n ? parseLicensePolicy(fs.readFileSync(policyFile, 'utf-8'))\n : parseLicensePolicy('');\n\n const policy: LicensePolicy = {\n version: policyWithRaw.version,\n permitted: policyWithRaw.permitted,\n restricted: policyWithRaw.restricted,\n blocked: policyWithRaw.blocked,\n exception_packages: policyWithRaw.exception_packages,\n };\n\n const isExplicitManifest = Boolean(options.manifestPath || options.dynamic === false);\n\n if (isExplicitManifest) {\n let manifestFile = options.manifestPath;\n if (!manifestFile) {\n const candidatePaths = [\n path.join(rootDir, 'compliance', 'license-manifest.yaml'),\n path.join(rootDir, 'license-manifest.yaml'),\n ];\n manifestFile = candidatePaths.find((p) => fs.existsSync(p)) || candidatePaths[0];\n }\n\n const { dependencies, violations, permittedCount } = verifyStaticManifest(manifestFile, policy);\n const reportMarkdown = generateLicenseReportMarkdown(dependencies, violations, policy);\n\n return {\n success: violations.length === 0,\n totalEvaluated: dependencies.length,\n permittedCount,\n violations,\n reportMarkdown,\n scannedDependencies: dependencies,\n };\n }\n\n // Dynamic SCA Execution\n const depth = options.depth || (policyWithRaw.rawPolicy?.ci_gates?.allowed_depth?.toLowerCase() === 'direct' ? 'direct' : 'transitive');\n const dependencies = scanInstalledLicenses(rootDir, {\n tool: options.tool || 'native',\n depth,\n productionOnly: options.productionOnly,\n });\n\n const violations: LicenseViolation[] = [];\n let permittedCount = 0;\n\n for (const dep of dependencies) {\n const violation = evaluateSingleDependency(dep, policy);\n if (violation) {\n violations.push(violation);\n } else {\n permittedCount++;\n }\n }\n\n // SBOM Generation\n let sbomPath: string | undefined;\n const shouldGenSbom = options.generateSbom !== false && (options.generateSbom === true || Boolean(options.sbomPath) || policyWithRaw.rawPolicy?.ci_gates?.generate_sbom === true);\n if (shouldGenSbom) {\n sbomPath = options.sbomPath || path.join(rootDir, 'reports', 'sbom.cdx.json');\n const sbom = generateCycloneDxSbom(dependencies, { rootDir });\n writeCycloneDxSbom(sbom, sbomPath);\n }\n\n // Notices Generation\n let noticesPath: string | undefined;\n const shouldGenNotices = options.generateNotices === true || Boolean(options.noticesPath) || Boolean(policyWithRaw.rawPolicy?.ci_gates?.output_notices_file);\n if (shouldGenNotices) {\n const noticesFileName = policyWithRaw.rawPolicy?.ci_gates?.output_notices_file || 'THIRD_PARTY_NOTICES.md';\n noticesPath = options.noticesPath || path.join(rootDir, noticesFileName);\n const noticesContent = generateThirdPartyNotices(dependencies);\n writeThirdPartyNotices(noticesContent, noticesPath);\n }\n\n const reportMarkdown = generateLicenseReportMarkdown(dependencies, violations, policy, sbomPath);\n\n return {\n success: violations.length === 0,\n totalEvaluated: dependencies.length,\n permittedCount,\n violations,\n reportMarkdown,\n sbomPath,\n noticesPath,\n scannedDependencies: dependencies,\n };\n}\n","/**\n * AI-SDLC: Progressive Friction & Anti-Bypass Verifier\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n ChangeProfile,\n ProgressiveFrictionOptions,\n ProgressiveFrictionResult,\n} from '../types/index.js';\n\nexport const PROTECTED_BYPASS_PATTERNS: RegExp[] = [\n /^schemas[\\\\/]/i,\n /^examples[\\\\/]security[\\\\/]/i,\n /^specs[\\\\/]security[\\\\/]/i,\n /enclaves?[\\\\/]/i,\n /SEC-ENC-/i,\n /quality-policy\\.ya?ml$/i,\n /license-policy\\.ya?ml$/i,\n /08_security_concept\\.md$/i,\n /09_decisions[\\\\/]/i,\n /migrations?[\\\\/]/i,\n];\n\nexport function detectProfileFromChange(changeDir: string): ChangeProfile {\n if (!fs.existsSync(changeDir)) return 'standard';\n\n const specFile = path.join(changeDir, 'spec.md');\n if (fs.existsSync(specFile)) {\n try {\n const rawSpec = fs.readFileSync(specFile, 'utf-8').replace(/^\\uFEFF/, '');\n const match = rawSpec.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (match) {\n const parsedFm = yaml.load(match[1]) as any;\n if (\n parsedFm &&\n parsedFm.profile &&\n ['patch', 'standard', 'critical'].includes(parsedFm.profile)\n ) {\n return parsedFm.profile as ChangeProfile;\n }\n }\n } catch {\n // Ignore parse failure, fallback\n }\n }\n\n return 'standard';\n}\n\nexport function isPathProtectedFromPatch(filePath: string): boolean {\n const normalized = filePath.replace(/\\\\/g, '/');\n return PROTECTED_BYPASS_PATTERNS.some((pattern) => pattern.test(normalized));\n}\n\nexport function verifyProgressiveFriction(\n options: ProgressiveFrictionOptions = {}\n): ProgressiveFrictionResult {\n const rootDir = options.rootDir || process.cwd();\n let changeDir = options.changeDir;\n\n if (!changeDir && options.changeId) {\n const candidates = [\n path.join(rootDir, 'specs', options.changeId),\n path.join(rootDir, 'specs', 'changes', 'active', options.changeId),\n path.join(rootDir, 'examples', 'specs', options.changeId),\n path.join(rootDir, 'specs', 'changes', 'completed', options.changeId),\n ];\n for (const c of candidates) {\n if (fs.existsSync(c)) {\n changeDir = c;\n break;\n }\n }\n }\n\n const modifiedFiles = options.diffFiles || options.modifiedFiles || [];\n\n const profile: ChangeProfile = changeDir\n ? detectProfileFromChange(changeDir)\n : 'standard';\n\n const violations: string[] = [];\n\n if (profile === 'patch') {\n for (const rawFile of modifiedFiles) {\n const relPath = path.isAbsolute(rawFile)\n ? path.relative(rootDir, rawFile)\n : rawFile;\n\n if (isPathProtectedFromPatch(relPath)) {\n violations.push(\n `[ANTI-PATCH-BYPASS] File '${relPath}' is a protected path (security, schemas, architectural decisions, or master policies). Changes with 'patch' profile are strictly prohibited from modifying these paths. Must be reclassified to 'standard' or 'critical'.`\n );\n }\n }\n }\n\n const bypassed = violations.length > 0;\n const success = !bypassed;\n\n const reportMarkdown = [\n `# 🛡️ Progressive Friction and Anti-Bypass Verification Report`,\n ``,\n `> **Date:** ${new Date().toISOString()}`,\n `> **Evaluated Profile:** \\`${profile.toUpperCase()}\\``,\n `> **Verdict:** ${success ? 'COMPLIANT ✅' : 'BLOCKED ❌'}`,\n ``,\n `---`,\n ``,\n `## 1. Evaluation of Modified Paths (${modifiedFiles.length} files)`,\n ``,\n ];\n\n if (violations.length === 0) {\n reportMarkdown.push(`✔ No Anti-Patch Bypass guardrail violations detected.`);\n } else {\n reportMarkdown.push(`### Detected Violations:`);\n for (const v of violations) {\n reportMarkdown.push(`- ❌ ${v}`);\n }\n }\n\n return {\n success,\n profile,\n bypassed,\n violations,\n bypassedRules: violations,\n evaluatedFiles: modifiedFiles,\n errors: [],\n reportMarkdown: reportMarkdown.join('\\n'),\n };\n}\n","/**\n * AI-SDLC: Deterministic Duplicate Requirements Verifier (Shift-Left Pre-Implementation Gate)\n *\n * Verifies that requirements do not collide or duplicate before coding starts:\n * 1. ID Collisions: Different files declaring the same canonical ID (ERROR)\n * 2. Exact Content / Hash Collisions: Different IDs with identical body / SHA-256 (ERROR)\n * 3. Title Redundancy: High lexical similarity (>= 85%) on normalized titles (ERROR)\n * 4. BDD Tag Collisions: Distinct requirements claiming the same specific cucumber-tags (ERROR)\n * 5. Shared Business Rules: Distinct requirements governing the same atomic BR-* (WARNING)\n *\n * NOTE: Multiple requirements under the same Use Case (UC-*) are EXPLICITLY VALID (SRP).\n */\n\nimport * as crypto from 'crypto';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport {\n ArtifactFrontmatter,\n DuplicateIssue,\n DuplicateVerifierOptions,\n DuplicateVerifierResult,\n} from '../types/index.js';\nimport { walkMdFiles } from '../utils/fs.js';\n\nconst STOP_WORDS = new Set([\n // Spanish\n 'el', 'la', 'los', 'las', 'un', 'una', 'unos', 'unas', 'de', 'del', 'al', 'en',\n 'y', 'o', 'e', 'u', 'a', 'para', 'con', 'por', 'que', 'se', 'su', 'sus',\n // English\n 'the', 'a', 'an', 'and', 'or', 'in', 'on', 'at', 'to', 'for', 'with', 'by',\n 'of', 'is', 'are', 'that', 'this', 'it',\n]);\n\nconst GENERIC_BDD_TAGS = new Set([\n 'automated',\n 'bdd',\n 'manual',\n 'wip',\n 'ignore',\n 'skip',\n 'smoke',\n 'regression',\n 'unit',\n 'e2e',\n 'integration',\n]);\n\nexport interface ScannedRequirement {\n id: string;\n file: string;\n relFile: string;\n title: string;\n version: string;\n type?: string;\n category?: string;\n derivesFrom: string[];\n cucumberTags: string[];\n canonicalHash: string;\n normalizedNormativeText: string;\n}\n\nexport function computeSha256(content: string): string {\n const normalized = content.replace(/\\r\\n/g, '\\n');\n return crypto.createHash('sha256').update(normalized, 'utf-8').digest('hex');\n}\n\nexport function tokenizeTitle(title: string): Set<string> {\n const words = title\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '') // strip accents\n .replace(/[^a-z0-9\\s]/g, ' ')\n .split(/\\s+/)\n .filter((w) => w.length > 2 && !STOP_WORDS.has(w));\n return new Set(words);\n}\n\nexport function calculateJaccardSimilarity(setA: Set<string>, setB: Set<string>): number {\n if (setA.size === 0 && setB.size === 0) return 0;\n let intersectionSize = 0;\n for (const item of setA) {\n if (setB.has(item)) {\n intersectionSize++;\n }\n }\n const unionSize = setA.size + setB.size - intersectionSize;\n return unionSize === 0 ? 0 : intersectionSize / unionSize;\n}\n\nexport function extractNormativeText(body: string): string {\n const secMatch = body.match(/##\\s+1\\.\\s+([^\\n]+)\\r?\\n([\\s\\S]*?)(?=\\r?\\n---|\\r?\\n##|$)/);\n if (secMatch) {\n return secMatch[2].trim().toLowerCase().replace(/\\s+/g, ' ');\n }\n const paragraphs = body\n .split(/\\r?\\n\\r?\\n/)\n .filter((p) => !p.startsWith('#') && p.trim().length > 0);\n return (paragraphs[0] || '').trim().toLowerCase().replace(/\\s+/g, ' ');\n}\n\nexport function isRequirementArtifact(frontmatter: ArtifactFrontmatter): boolean {\n const id = String(frontmatter.id || '');\n const type = String(frontmatter.type || '').toLowerCase();\n const category = String((frontmatter as Record<string, unknown>).category || '').toLowerCase();\n\n return (\n id.startsWith('FR-') ||\n id.startsWith('QR-') ||\n id.startsWith('CON-') ||\n id.startsWith('SEC-REQ-') ||\n id.startsWith('SAF-REQ-') ||\n type === 'requirement' ||\n type === 'security-requirement' ||\n type === 'safety-requirement' ||\n category === 'functional' ||\n category === 'quality' ||\n category === 'constraint' ||\n category === 'security' ||\n category === 'safety'\n );\n}\n\nexport function parseRequirementFile(filePath: string, rootDir: string): ScannedRequirement | null {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return null;\n\n const parsed = yaml.load(match[1]);\n if (!parsed || typeof parsed !== 'object') return null;\n\n const frontmatter = parsed as ArtifactFrontmatter;\n if (!frontmatter.id || !isRequirementArtifact(frontmatter)) {\n return null;\n }\n\n const body = content.substring(match[0].length);\n const relFile = path.relative(rootDir, filePath).replace(/\\\\/g, '/');\n\n const derivesRaw = frontmatter['derives-from'];\n const derivesFrom: string[] = Array.isArray(derivesRaw)\n ? derivesRaw.map(String)\n : derivesRaw\n ? [String(derivesRaw)]\n : [];\n\n const tagsRaw = frontmatter['cucumber-tags'];\n const cucumberTags: string[] = Array.isArray(tagsRaw)\n ? tagsRaw.map((t) => String(t).replace(/^@/, '').toLowerCase().trim())\n : [];\n\n return {\n id: String(frontmatter.id).trim(),\n file: filePath,\n relFile,\n title: String(frontmatter.title || '').trim(),\n version: String(frontmatter.version || '1.0.0').trim(),\n type: frontmatter.type ? String(frontmatter.type) : undefined,\n category: frontmatter.category ? String(frontmatter.category) : undefined,\n derivesFrom,\n cucumberTags,\n canonicalHash: computeSha256(content),\n normalizedNormativeText: extractNormativeText(body),\n };\n } catch {\n return null;\n }\n}\n\nexport function verifyArtifactDuplicates(\n options: DuplicateVerifierOptions = {}\n): DuplicateVerifierResult {\n const rootDir = options.rootDir || process.cwd();\n const threshold = options.titleSimilarityThreshold ?? 0.85;\n\n const allMdFiles = walkMdFiles(rootDir);\n const requirements: ScannedRequirement[] = [];\n\n for (const file of allMdFiles) {\n const relFile = path.relative(rootDir, file).replace(/\\\\/g, '/');\n\n // Skip templates, node_modules, dist, and process documentation\n if (\n relFile.includes('node_modules/') ||\n relFile.includes('dist/') ||\n relFile.includes('.template.') ||\n relFile.startsWith('templates/') ||\n relFile.startsWith('process/') ||\n relFile.startsWith('reports/') ||\n relFile.startsWith('.changeset/')\n ) {\n continue;\n }\n\n const req = parseRequirementFile(file, rootDir);\n if (req) {\n requirements.push(req);\n }\n }\n\n const issues: DuplicateIssue[] = [];\n\n // 1. Check ID collisions across different files\n const idMap = new Map<string, ScannedRequirement>();\n for (const req of requirements) {\n const existing = idMap.get(req.id);\n if (existing) {\n if (existing.relFile !== req.relFile) {\n issues.push({\n type: 'ID_COLLISION',\n severity: 'ERROR',\n id: req.id,\n file: req.relFile,\n conflictingId: existing.id,\n conflictingFile: existing.relFile,\n message: `Identificador duplicado '${req.id}' presente en dos archivos distintos: '${req.relFile}' y '${existing.relFile}'.`,\n });\n }\n } else {\n idMap.set(req.id, req);\n }\n }\n\n // 2. Cross-comparisons between different requirements\n for (let i = 0; i < requirements.length; i++) {\n const a = requirements[i];\n const tokensA = tokenizeTitle(a.title);\n\n for (let j = i + 1; j < requirements.length; j++) {\n const b = requirements[j];\n\n // If they have the same ID, it was already reported as ID_COLLISION\n if (a.id === b.id) continue;\n\n // Check Exact Content / SHA-256 / identical normative text\n if (\n (a.canonicalHash === b.canonicalHash && a.canonicalHash.length > 0) ||\n (a.normalizedNormativeText.length > 20 &&\n a.normalizedNormativeText === b.normalizedNormativeText)\n ) {\n issues.push({\n type: 'EXACT_CONTENT',\n severity: 'ERROR',\n id: a.id,\n file: a.relFile,\n conflictingId: b.id,\n conflictingFile: b.relFile,\n message: `Cuerpo normativo idéntico (copia-pega) detectado entre '${a.id}' (${a.relFile}) y '${b.id}' (${b.relFile}).`,\n });\n continue;\n }\n\n // Check Title Lexical Similarity\n const tokensB = tokenizeTitle(b.title);\n const similarity = calculateJaccardSimilarity(tokensA, tokensB);\n\n if (similarity >= threshold && tokensA.size > 0 && tokensB.size > 0) {\n issues.push({\n type: 'TITLE_SIMILARITY',\n severity: 'ERROR',\n id: a.id,\n file: a.relFile,\n conflictingId: b.id,\n conflictingFile: b.relFile,\n similarityScore: Math.round(similarity * 100) / 100,\n message: `Titles with high lexical redundancy (${Math.round(similarity * 100)}% similarity) between '${a.id}' (\"${a.title}\") and '${b.id}' (\"${b.title}\").`,\n });\n }\n\n // Check BDD tag collision (excluding generic and self tags)\n const specificTagsA = new Set(\n a.cucumberTags.filter((t) => !GENERIC_BDD_TAGS.has(t) && t !== a.id.toLowerCase())\n );\n const specificTagsB = new Set(\n b.cucumberTags.filter((t) => !GENERIC_BDD_TAGS.has(t) && t !== b.id.toLowerCase())\n );\n\n if (specificTagsA.size > 0 && specificTagsB.size > 0 && specificTagsA.size === specificTagsB.size) {\n let allMatch = true;\n for (const tag of specificTagsA) {\n if (!specificTagsB.has(tag)) {\n allMatch = false;\n break;\n }\n }\n if (allMatch) {\n issues.push({\n type: 'BDD_TAG_COLLISION',\n severity: 'ERROR',\n id: a.id,\n file: a.relFile,\n conflictingId: b.id,\n conflictingFile: b.relFile,\n message: `BDD test tag collision: '${a.id}' and '${b.id}' claim the same specific tags: @${Array.from(specificTagsA).join(' @')}.`,\n });\n }\n }\n\n // Check Shared Business Rule (WARNING only)\n const brA = a.derivesFrom.filter((r) => r.startsWith('BR-'));\n const brB = new Set(b.derivesFrom.filter((r) => r.startsWith('BR-')));\n for (const br of brA) {\n if (brB.has(br)) {\n issues.push({\n type: 'SHARED_BUSINESS_RULE',\n severity: 'WARNING',\n id: a.id,\n file: a.relFile,\n conflictingId: b.id,\n conflictingFile: b.relFile,\n message: `Potential logic overlap: both '${a.id}' and '${b.id}' govern the same atomic business rule '${br}'.`,\n });\n }\n }\n }\n }\n\n const errorCount = issues.filter((i) => i.severity === 'ERROR').length;\n const warningCount = issues.filter((i) => i.severity === 'WARNING').length;\n\n const result: DuplicateVerifierResult = {\n success: errorCount === 0,\n totalRequirements: requirements.length,\n errorCount,\n warningCount,\n issues,\n };\n\n result.reportMarkdown = generateDuplicatesReportMarkdown(result);\n return result;\n}\n\nexport function generateDuplicatesReportMarkdown(result: DuplicateVerifierResult): string {\n const isOk = result.success;\n const lines: string[] = [\n `# 🛡️ Duplicate Requirements and Redundancy Audit (Shift-Left Pre-Flight)`,\n ``,\n `> **Evaluation Date:** ${new Date().toISOString()}`,\n `> **Verdict:** ${isOk ? '✅ COMPLIANT (No blocking duplicates)' : `❌ BLOCKED (${result.errorCount} duplicate errors detected)`}`,\n `> **Audited Requirements:** ${result.totalRequirements} | **Errors:** ${result.errorCount} | **Warnings:** ${result.warningCount}`,\n ``,\n `---`,\n ];\n\n if (result.issues.length === 0) {\n lines.push(\n ``,\n `## Compliance Summary`,\n ``,\n `All analyzed requirements respect the unique identifier principle, distinguish titles and normative statements, and present decoupled BDD test scenarios.`,\n `The breakdown of multiple atomic requirements per Use Case (SRP) is compliant.`\n );\n } else {\n lines.push(\n ``,\n `## Violations and Warnings Detail`,\n ``,\n `| Severity | Collision Type | Requirement A | Requirement B | Message |`,\n `| :---: | :--- | :--- | :--- | :--- |`\n );\n\n for (const issue of result.issues) {\n const badge = issue.severity === 'ERROR' ? '🛑 ERROR' : '⚠️ WARNING';\n lines.push(\n `| **${badge}** | \\`${issue.type}\\` | **\\`${issue.id}\\`** (\\`${issue.file}\\`) | ${\n issue.conflictingId ? `\\`${issue.conflictingId}\\` (\\`${issue.conflictingFile}\\`)` : 'N/A'\n } | ${issue.message} |`\n );\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * AI-SDLC: Deterministic Secret Scanning & Credential Leak Verifier (Gitleaks Gate)\n *\n * Implements deterministic secret scanning for:\n * 1. Cloud & SaaS API Keys (AWS, GitHub, Slack, Google, OpenAI, Stripe)\n * 2. Private Keys (RSA, DSA, EC, OPENSSH PEM blocks)\n * 3. JSON Web Tokens (JWT)\n * 4. Generic High-Entropy Tokens & Credentials\n * 5. Git Diff analysis against base branches (shift-left task verification)\n * 6. Seamless delegation/augmentation with native Gitleaks CLI if available.\n */\n\nimport { execFileSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {\n SecretFindingType,\n SecretVerifierOptions,\n SecretVerifierResult,\n SecretViolation,\n} from '../types/index.js';\n\nexport interface SecretRule {\n id: string;\n type: SecretFindingType;\n description: string;\n regex: RegExp;\n minEntropy?: number;\n captureIndex?: number;\n}\n\nexport const SECRET_RULES: readonly SecretRule[] = [\n {\n id: 'SEC-001-PRIVATE-KEY',\n type: 'PRIVATE_KEY',\n description: 'Bloque de clave privada detectado (PEM / RSA / DSA / EC / OPENSSH)',\n regex: /-----BEGIN (?:[A-Z0-9_-]+ )?PRIVATE KEY-----/g,\n },\n {\n id: 'SEC-002-AWS-ACCESS-KEY',\n type: 'AWS_CREDENTIAL',\n description: 'Identificador de clave de acceso AWS (AKIA...)',\n regex: /\\b(AKIA[0-9A-Z]{16})\\b/g,\n captureIndex: 1,\n },\n {\n id: 'SEC-003-AWS-SECRET-KEY',\n type: 'AWS_CREDENTIAL',\n description: 'Clave secreta de acceso AWS asignada en código',\n regex: /(?:aws_secret_access_key|aws_secret_key|secret_key)\\s*[:=]\\s*['\"]([0-9a-zA-Z/+=]{40})['\"]/gi,\n captureIndex: 1,\n minEntropy: 4.2,\n },\n {\n id: 'SEC-004-GITHUB-TOKEN',\n type: 'GITHUB_TOKEN',\n description: 'Token de autenticación personal o de aplicación de GitHub (ghp_, github_pat_, etc.)',\n regex: /\\b(gh[pousr]_[A-Za-z0-9_]{36,255}|github_pat_[0-9a-zA-Z_]{82})\\b/g,\n captureIndex: 1,\n },\n {\n id: 'SEC-005-SLACK-TOKEN',\n type: 'SLACK_TOKEN',\n description: 'Token de bot o webhook de Slack (xox[baprs]-...)',\n regex: /\\b(xox[baprs]-[0-9]{10,13}-[0-9]{10,13}[a-zA-Z0-9-]*)\\b/g,\n captureIndex: 1,\n },\n {\n id: 'SEC-006-GOOGLE-API-KEY',\n type: 'GOOGLE_API_KEY',\n description: 'Clave de API de Google Cloud Platform (AIza...)',\n regex: /\\b(AIza[0-9A-Za-z_-]{35,36})\\b/g,\n captureIndex: 1,\n },\n {\n id: 'SEC-007-OPENAI-API-KEY',\n type: 'OPENAI_API_KEY',\n description: 'Clave de API de OpenAI / Azure OpenAI (sk-...)',\n regex: /\\b(sk-(?:proj-|live-)?[a-zA-Z0-9_-]{32,})\\b/g,\n captureIndex: 1,\n },\n {\n id: 'SEC-008-STRIPE-API-KEY',\n type: 'STRIPE_API_KEY',\n description: 'Clave secreta de API de Stripe (sk_live_... / rk_live_...)',\n regex: /\\b((?:sk|rk)_(?:live|test)_[0-9a-zA-Z]{24,99})\\b/g,\n captureIndex: 1,\n },\n {\n id: 'SEC-009-JWT-TOKEN',\n type: 'JWT_TOKEN',\n description: 'Token JSON Web Token (JWT) con firma criptográfica en texto plano',\n regex: /\\b(eyJ[A-Za-z0-9_-]{10,}\\.eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,})\\b/g,\n captureIndex: 1,\n minEntropy: 4.0,\n },\n {\n id: 'SEC-010-GENERIC-SECRET',\n type: 'GENERIC_HIGH_ENTROPY_SECRET',\n description: 'Asignación de credencial o contraseña genérica con alta entropía de Shannon',\n regex: /(?:api[_-]?key|secret|token|password|auth[_-]?token|access[_-]?token)\\s*[:=]\\s*['\"]([a-zA-Z0-9_\\-=+]{16,})['\"]/gi,\n captureIndex: 1,\n minEntropy: 4.3,\n },\n] as const;\n\nexport const DEFAULT_EXCLUDED_PATTERNS = [\n 'node_modules/',\n 'dist/',\n '.git/',\n '.changeset/',\n 'reports/',\n 'coverage/',\n 'pnpm-lock.yaml',\n 'package-lock.json',\n 'yarn.lock',\n 'tests/secrets.spec.ts',\n];\n\nconst PLACEHOLDER_KEYWORDS = new Set([\n 'placeholder',\n 'your-api-key',\n 'your_secret_key',\n 'test-secret',\n 'sample-token',\n 'dummy_token',\n 'xxxx',\n 'changeme',\n]);\n\n/**\n * Calculates Shannon entropy of a string: H(X) = - sum(p(x) * log2(p(x)))\n */\nexport function calculateShannonEntropy(str: string): number {\n if (!str || str.length === 0) return 0;\n\n const freqMap = new Map<string, number>();\n for (let i = 0; i < str.length; i++) {\n const char = str[i];\n freqMap.set(char, (freqMap.get(char) || 0) + 1);\n }\n\n let entropy = 0;\n const len = str.length;\n for (const count of freqMap.values()) {\n const p = count / len;\n entropy -= p * Math.log2(p);\n }\n\n return Math.round(entropy * 100) / 100;\n}\n\n/**\n * Masks a secret string for safe display and logging (e.g. ghp_1234...5678)\n */\nexport function maskSecret(secret: string): string {\n if (secret.length <= 8) {\n return '***[REDACTED]***';\n }\n const prefixLen = Math.min(6, Math.floor(secret.length / 4));\n const suffixLen = Math.min(4, Math.floor(secret.length / 6));\n const prefix = secret.slice(0, prefixLen);\n const suffix = secret.slice(-suffixLen);\n return `${prefix}****${suffix}`;\n}\n\nexport function isPlaceholderOrIgnored(secret: string, line: string): boolean {\n const lowerSecret = secret.toLowerCase();\n for (const placeholder of PLACEHOLDER_KEYWORDS) {\n if (lowerSecret.includes(placeholder)) return true;\n }\n\n // Check inline suppression comments\n if (\n line.includes('ai-sdlc:allow-secret') ||\n line.includes('gitleaks:allow') ||\n line.includes('pragma: allowlist secret')\n ) {\n return true;\n }\n\n return false;\n}\n\nexport interface DiffLineItem {\n file: string;\n lineNumber: number;\n content: string;\n}\n\nexport function getGitDiffLines(rootDir: string, baseBranch?: string): DiffLineItem[] {\n const lines: DiffLineItem[] = [];\n try {\n const targetBase = baseBranch || 'origin/main';\n let diffOutput = '';\n\n // Check if targetBase exists\n try {\n diffOutput = execFileSync('git', ['diff', '-U0', `${targetBase}...HEAD`], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n });\n } catch {\n // Fallback to diff against HEAD or working tree\n try {\n diffOutput = execFileSync('git', ['diff', '-U0', 'HEAD'], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n });\n } catch {\n diffOutput = '';\n }\n }\n\n if (!diffOutput) {\n // Check unstaged changes as fallback\n diffOutput = execFileSync('git', ['diff', '-U0'], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n });\n }\n\n let currentFile = '';\n let currentLine = 1;\n\n for (const rawLine of diffOutput.split('\\n')) {\n if (rawLine.startsWith('+++ b/')) {\n currentFile = rawLine.substring(6).trim();\n } else if (rawLine.startsWith('@@ ')) {\n // Parse hunk header: @@ -1,1 +15,3 @@\n const match = rawLine.match(/@@ -\\d+(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/);\n if (match) {\n currentLine = parseInt(match[1], 10);\n }\n } else if (rawLine.startsWith('+') && !rawLine.startsWith('+++')) {\n const content = rawLine.substring(1);\n if (currentFile) {\n lines.push({\n file: currentFile,\n lineNumber: currentLine,\n content,\n });\n }\n currentLine++;\n }\n }\n } catch {\n // Git diff failure fallback\n }\n\n return lines;\n}\n\nexport function walkProjectFiles(\n dir: string,\n rootDir: string,\n excludedPatterns: string[] = DEFAULT_EXCLUDED_PATTERNS\n): string[] {\n const results: string[] = [];\n\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relPath = path.relative(rootDir, fullPath).replace(/\\\\/g, '/');\n\n let isExcluded = false;\n for (const pat of excludedPatterns) {\n if (relPath.includes(pat) || relPath.startsWith(pat)) {\n isExcluded = true;\n break;\n }\n }\n\n if (isExcluded) continue;\n\n if (entry.isDirectory()) {\n results.push(...walkProjectFiles(fullPath, rootDir, excludedPatterns));\n } else if (entry.isFile()) {\n results.push(fullPath);\n }\n }\n } catch {\n // Skip inaccessible folders\n }\n\n return results;\n}\n\nexport function isGitleaksInstalled(): boolean {\n try {\n const cmd = process.platform === 'win32' ? 'where' : 'which';\n execFileSync(cmd, ['gitleaks'], { stdio: ['pipe', 'pipe', 'ignore'] });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function runGitleaksCli(rootDir: string): SecretViolation[] {\n const violations: SecretViolation[] = [];\n try {\n const output = execFileSync(\n 'gitleaks',\n ['detect', '--no-git', '--report-format', 'json', '--report-path', 'stdout'],\n {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n }\n );\n\n if (output) {\n const parsed = JSON.parse(output);\n if (Array.isArray(parsed)) {\n for (const item of parsed) {\n const filePath = path.resolve(rootDir, item.File || item.file);\n const relPath = path.relative(rootDir, filePath).replace(/\\\\/g, '/');\n violations.push({\n filePath,\n relPath,\n lineNumber: item.StartLine || item.line || 1,\n type: 'GITLEAKS_FINDING',\n ruleId: item.RuleID || item.ruleID || 'GITLEAKS-MATCH',\n maskedMatch: maskSecret(item.Secret || item.secret || item.Match || ''),\n entropy: item.Entropy || item.entropy,\n message: `Gitleaks detectó credencial [${item.RuleID || 'SECRET'}]: ${item.Description || ''}`,\n });\n }\n }\n }\n } catch {\n // If gitleaks exits with code > 0 it typically means secrets were found or syntax error\n }\n return violations;\n}\n\nexport function scanContentForSecrets(\n content: string,\n filePath: string,\n rootDir: string,\n entropyThreshold = 4.3\n): SecretViolation[] {\n const violations: SecretViolation[] = [];\n const lines = content.split(/\\r?\\n/);\n const relPath = path.relative(rootDir, filePath).replace(/\\\\/g, '/');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line || line.trim().length === 0) continue;\n\n for (const rule of SECRET_RULES) {\n rule.regex.lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = rule.regex.exec(line)) !== null) {\n const rawMatch = rule.captureIndex ? match[rule.captureIndex] : match[0];\n if (!rawMatch || rawMatch.length < 8) continue;\n\n if (isPlaceholderOrIgnored(rawMatch, line)) continue;\n\n const entropy = calculateShannonEntropy(rawMatch);\n if (rule.minEntropy && entropy < (entropyThreshold || rule.minEntropy)) {\n continue;\n }\n\n violations.push({\n filePath,\n relPath,\n lineNumber: i + 1,\n type: rule.type,\n ruleId: rule.id,\n maskedMatch: maskSecret(rawMatch),\n entropy,\n message: `${rule.description} (Entropía: ${entropy})`,\n });\n }\n }\n }\n\n return violations;\n}\n\nexport function verifySecrets(options: SecretVerifierOptions = {}): SecretVerifierResult {\n const rootDir = options.rootDir || process.cwd();\n const entropyThreshold = options.entropyThreshold ?? 4.3;\n const excludePatterns = options.excludePatterns || DEFAULT_EXCLUDED_PATTERNS;\n\n const findings: SecretViolation[] = [];\n let totalFilesScanned = 0;\n let scannedWithGitleaks = false;\n\n // 1. If diff mode is requested, scan git diff lines\n if (options.diff) {\n const diffLines = getGitDiffLines(rootDir, options.baseBranch);\n const fileGroups = new Map<string, DiffLineItem[]>();\n\n for (const item of diffLines) {\n const list = fileGroups.get(item.file) || [];\n list.push(item);\n fileGroups.set(item.file, list);\n }\n\n totalFilesScanned = fileGroups.size;\n\n for (const [relFile, items] of fileGroups) {\n let isExcluded = false;\n for (const pat of excludePatterns) {\n if (relFile.includes(pat) || relFile.startsWith(pat)) {\n isExcluded = true;\n break;\n }\n }\n if (isExcluded) continue;\n\n for (const item of items) {\n const line = item.content;\n for (const rule of SECRET_RULES) {\n rule.regex.lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = rule.regex.exec(line)) !== null) {\n const rawMatch = rule.captureIndex ? match[rule.captureIndex] : match[0];\n if (!rawMatch || rawMatch.length < 8) continue;\n\n if (isPlaceholderOrIgnored(rawMatch, line)) continue;\n\n const entropy = calculateShannonEntropy(rawMatch);\n if (rule.minEntropy && entropy < (entropyThreshold || rule.minEntropy)) {\n continue;\n }\n\n findings.push({\n filePath: path.resolve(rootDir, item.file),\n relPath: item.file,\n lineNumber: item.lineNumber,\n type: rule.type,\n ruleId: rule.id,\n maskedMatch: maskSecret(rawMatch),\n entropy,\n message: `[DIFF] ${rule.description} (Entropía: ${entropy})`,\n });\n }\n }\n }\n }\n } else {\n // 2. Full project scan\n const allFiles = walkProjectFiles(rootDir, rootDir, excludePatterns);\n totalFilesScanned = allFiles.length;\n\n for (const file of allFiles) {\n try {\n const content = fs.readFileSync(file, 'utf-8');\n const fileViolations = scanContentForSecrets(content, file, rootDir, entropyThreshold);\n findings.push(...fileViolations);\n } catch {\n // Skip unreadable files\n }\n }\n }\n\n // 3. Delegate to Gitleaks CLI if requested or available\n if (options.gitleaks || (options.gitleaks === undefined && isGitleaksInstalled())) {\n try {\n const gitleaksFindings = runGitleaksCli(rootDir);\n if (gitleaksFindings.length > 0) {\n scannedWithGitleaks = true;\n // Merge without duplicating same file and line\n for (const gf of gitleaksFindings) {\n const exists = findings.some(\n (f) => f.relPath === gf.relPath && Math.abs(f.lineNumber - gf.lineNumber) <= 1\n );\n if (!exists) {\n findings.push(gf);\n }\n }\n }\n } catch {\n // Gitleaks failure fallback\n }\n }\n\n const result: SecretVerifierResult = {\n success: findings.length === 0,\n totalFilesScanned,\n findingsCount: findings.length,\n findings,\n scannedWithGitleaks,\n };\n\n result.reportMarkdown = generateSecretsReportMarkdown(result);\n return result;\n}\n\nexport function generateSecretsReportMarkdown(result: SecretVerifierResult): string {\n const isOk = result.success;\n const lines: string[] = [\n `# 🔐 Deterministic Secrets and Credentials Audit (Gitleaks Gate)`,\n ``,\n `> **Evaluation Date:** ${new Date().toISOString()}`,\n `> **Verdict:** ${isOk ? '✅ COMPLIANT (No exposed secrets or credentials)' : `❌ BLOCKED (${result.findingsCount} exposed credentials detected)`}`,\n `> **Audited Files:** ${result.totalFilesScanned} | **Security Violations:** ${result.findingsCount}`,\n `> **Native Gitleaks Engine:** ${result.scannedWithGitleaks ? '🟢 Active / Integrated' : '⚪ Deterministic Native Scanner (@aisdlc/core)'}`,\n ``,\n `---`,\n ];\n\n if (result.findings.length === 0) {\n lines.push(\n ``,\n `## Compliance Summary`,\n ``,\n `The repository and analyzed diffs are free of private keys, Cloud/SaaS provider API tokens (AWS, GitHub, Google, OpenAI, Slack, Stripe), plaintext JWTs, or high-entropy secrets.`,\n `Credentials security Quality Gate is APPROVED (EXIT 0).`\n );\n } else {\n lines.push(\n ``,\n `## Detected Secret Leaks Detail`,\n ``,\n `| Severity | Rule | Type | File:Line | Token (Masked) | Details |`,\n `| :---: | :--- | :--- | :--- | :--- | :--- |`\n );\n\n for (const f of result.findings) {\n lines.push(\n `| 🛑 **CRITICAL** | \\`${f.ruleId}\\` | \\`${f.type}\\` | \\`${f.relPath}:${f.lineNumber}\\` | \\`${f.maskedMatch}\\` | ${f.message} |`\n );\n }\n\n lines.push(\n ``,\n `## 🚨 Mandatory Remediation Protocol (Exit Code 4)`,\n ``,\n `1. **Immediate Revocation**: Any credential or token detected above must be considered compromised and immediately revoked at the respective provider.`,\n `2. **Rotation and Secure Storage**: Migrate credentials to protected environment variables or secrets management vaults (Vault, AWS Secrets Manager, GitHub Secrets).`,\n `3. **Git History Purge**: If the secret was committed, purge it from Git history with \\`git filter-repo\\` or BFG before merging.`,\n `4. **False Positives**: For legitimate test fixtures or non-secret strings, add \\`// ai-sdlc:allow-secret\\` on the offending line or add the path to \\`.secretsignore\\`.`\n );\n }\n\n return lines.join('\\n');\n}\n","/**\n * AI-SDLC: Shift-Left SAST (Static Application Security Testing) Verifier\n *\n * Deterministic semantic analysis for AI-generated vulnerability hotspots:\n * 1. SQL Injection via dynamic string concatenation / interpolation\n * 2. OS Command Injection (eval, exec, spawn with shell: true)\n * 3. Server-Side Request Forgery (SSRF) via unvalidated external fetches\n * 4. Path Traversal in filesystem operations\n * 5. Optional delegation to Semgrep CLI if installed.\n */\n\nimport { execFileSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {\n PromptInjectionFinding,\n SastFindingType,\n SastSeverity,\n SastVerifierOptions,\n SastVerifierResult,\n SastViolation,\n} from '../types/index.js';\n\nexport const GENERAL_SOURCE_EXTENSIONS: readonly string[] = [\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs',\n '.py',\n '.cs',\n '.java',\n '.kt',\n '.scala',\n '.c',\n '.cpp',\n '.cc',\n '.cxx',\n '.h',\n '.hpp',\n '.go',\n '.rs',\n '.php',\n '.rb',\n '.swift',\n '.prompt',\n];\n\nexport interface SastRule {\n id: string;\n type: SastFindingType;\n severity: SastSeverity;\n description: string;\n pattern: RegExp;\n fileExtensions?: readonly string[];\n}\n\nexport const SAST_RULES: readonly SastRule[] = [\n {\n id: 'SAST-001-SQL-INJECTION',\n type: 'SQL_INJECTION',\n severity: 'CRITICAL',\n description: 'Concatenación o interpolación directa de variables en consulta SQL dinámica',\n pattern: /(?:\\.query|\\.execute|\\.raw)\\s*\\(\\s*(?:`[^`]*(?:SELECT|INSERT|UPDATE|DELETE|DROP|ALTER)[^`]*\\$\\{[^}]+\\}[^`]*`|['\"][^'\"]*(?:SELECT|INSERT|UPDATE|DELETE|DROP|ALTER)[^'\"]*['\"]\\s*\\+)/i,\n fileExtensions: ['.ts', '.js', '.tsx', '.jsx', '.py', '.go', '.java', '.kt', '.cs', '.php', '.rb', '.cpp', '.c'],\n },\n {\n id: 'SAST-002-COMMAND-INJECTION',\n type: 'COMMAND_INJECTION',\n severity: 'CRITICAL',\n description: 'Ejecución dinámica de comandos del sistema operativo con argumentos variables',\n pattern: /(?:child_process\\.(?:exec|execSync)|(?<!\\.)\\b(?:exec|execSync))\\s*\\(\\s*(?:`[^`]*\\$\\{[^}]+\\}[^`]*`|[a-zA-Z0-9_]+\\s*\\+|[a-zA-Z0-9_]+\\))/i,\n fileExtensions: ['.ts', '.js', '.mjs', '.cjs', '.py', '.go', '.java', '.cs', '.php', '.rb'],\n },\n {\n id: 'SAST-003-UNSAFE-EVAL',\n type: 'UNSAFE_EVAL',\n severity: 'CRITICAL',\n description: 'Uso de evaluación dinámica de código (eval o Function constructor)',\n pattern: /(?<!\\.)\\b(?:eval\\s*\\(|new\\s+Function\\s*\\()/g,\n fileExtensions: ['.ts', '.js', '.py', '.php', '.rb', '.cs'],\n },\n {\n id: 'SAST-004-SSRF-UNVALIDATED-FETCH',\n type: 'SSRF',\n severity: 'HIGH',\n description: 'Petición de red saliente (fetch/http/axios) con URL dinámica sin validación previa',\n pattern: /(?:fetch|axios\\.(?:get|post|put|delete)|http\\.(?:get|request))\\s*\\(\\s*(?:req\\.(?:query|params|body)|urlParam|targetUrl|userInput|remoteUrl)\\b/i,\n fileExtensions: ['.ts', '.js', '.py', '.go', '.java', '.cs', '.php', '.rb'],\n },\n {\n id: 'SAST-005-PATH-TRAVERSAL',\n type: 'PATH_TRAVERSAL',\n severity: 'HIGH',\n description: 'Lectura o escritura en sistema de archivos construida directamente desde parámetros no saneados',\n pattern: /fs\\.(?:readFileSync|readFile|createReadStream|writeFileSync)\\s*\\(\\s*(?:path\\.join\\([^)]*req\\.(?:query|params|body)|req\\.(?:query|params|body))/i,\n fileExtensions: ['.ts', '.js', '.py', '.go', '.java', '.cs'],\n },\n {\n id: 'SAST-006-PROMPT-INJECTION-CONCAT',\n type: 'PROMPT_INJECTION_RISK',\n severity: 'HIGH',\n description: 'Interpolación o concatenación directa de entradas de usuario en llamadas a LLM o plantillas de prompts sin delimitación defensiva (OWASP LLM01)',\n pattern: /(?:(?:(?:\\b(?:prompt|system_?prompt|user_?prompt|prompt_?template|prompt_?text|llm_?prompt)\\b\\s*(?::=|\\+=|\\+|=))|(?:messages\\s*:\\s*\\[[^\\n]*content\\s*:\\s*)|(?:generateContent|chat\\.completions\\.create)\\s*\\()\\s*(?:`[^`]*\\$\\{[^}]*(?:req\\.|user_?input|raw_?input|client_?input)[^}]*\\}`|f[\"'][^\"']*\\{[^}]*(?:req|user_?input|raw_?input|client_?input)[^}]*\\}[\"']|\\$[\"'][^\"']*\\{[^}]*(?:req|user_?input|raw_?input|client_?input)[^}]*\\}[\"']|format!\\s*\\([^)]*(?:user_?input|raw_?input|req)[^)]*\\)|(?:fmt\\.)?Sprintf\\s*\\([^)]*(?:user_?input|raw_?input|req)[^)]*\\)|(?:[\"'][^\"']*[\"']\\s*\\+\\s*|\\+\\s*[\"'][^\"']*[\"']\\s*\\+?\\s*|\\s*\\+=\\s*)(?:req\\.(?:body|query|params|getParameter)|user_?input|raw_?input|client_?input)))/i,\n fileExtensions: GENERAL_SOURCE_EXTENSIONS,\n },\n {\n id: 'SAST-007-PROMPT-INJECTION-JAILBREAK',\n type: 'PROMPT_INJECTION_RISK',\n severity: 'CRITICAL',\n description:\n 'Firma o vector adversarial de inyección de prompt o anulación de directivas de sistema (Jailbreak / Inyección LLM01)', // ai-sdlc:allow-prompt-injection\n pattern: /(?:\\b(?:ignore|disregard|forget)\\s+(?:all\\s+)?(?:previous|prior|above)\\s+(?:instructions|prompts|directions|rules)\\b|\\b(?:system\\s+(?:prompt\\s+)?override|override\\s+system\\s+prompt|developer\\s+mode\\s+enabled|dan\\s+mode(?:\\s+enabled)?|unfiltered\\s+(?:ai\\s+)?mode)\\b|\\b(?:reveal|print|output)\\s+(?:your\\s+)?(?:system\\s+prompt|initial\\s+instructions)\\b|<\\/(?:system|instructions)>\\s*(?:new\\s+instructions|you\\s+are\\s+now|system:)|\\[(?:SYSTEM|SYSTEM_OVERRIDE)\\])/i,\n fileExtensions: GENERAL_SOURCE_EXTENSIONS,\n },\n] as const;\n\nexport const DEFAULT_SAST_EXCLUDES = [\n 'node_modules/',\n 'dist/',\n '.git/',\n 'reports/',\n 'coverage/',\n 'templates/',\n 'fixtures/',\n 'tests/',\n];\n\nexport function isSemgrepInstalled(): boolean {\n try {\n const cmd = process.platform === 'win32' ? 'where' : 'which';\n execFileSync(cmd, ['semgrep'], { stdio: ['pipe', 'pipe', 'ignore'] });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function runSemgrepCli(rootDir: string): SastViolation[] {\n const violations: SastViolation[] = [];\n try {\n const output = execFileSync(\n 'semgrep',\n ['scan', '--config', 'auto', '--json', '--quiet'],\n {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n }\n );\n\n if (output) {\n const parsed = JSON.parse(output);\n if (Array.isArray(parsed.results)) {\n for (const item of parsed.results) {\n const filePath = path.resolve(rootDir, item.path);\n const relPath = path.relative(rootDir, filePath).replace(/\\\\/g, '/');\n violations.push({\n filePath,\n relPath,\n lineNumber: item.start?.line || 1,\n ruleId: item.check_id || 'SEMGREP-RULE',\n type: 'SEMGREP_FINDING',\n severity: (item.extra?.severity?.toUpperCase() || 'HIGH') as SastSeverity,\n snippet: (item.extra?.lines || '').trim(),\n message: `Semgrep [${item.check_id}]: ${item.extra?.message || ''}`,\n });\n }\n }\n }\n } catch {\n // Semgrep CLI failure fallback\n }\n return violations;\n}\n\nexport function walkSourceFiles(\n dir: string,\n rootDir: string,\n excludes: string[] = DEFAULT_SAST_EXCLUDES\n): string[] {\n const files: string[] = [];\n\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relPath = path.relative(rootDir, fullPath).replace(/\\\\/g, '/');\n\n let isExcluded = false;\n for (const exc of excludes) {\n if (relPath.includes(exc) || relPath.startsWith(exc)) {\n isExcluded = true;\n break;\n }\n }\n if (isExcluded) continue;\n\n if (entry.isDirectory()) {\n files.push(...walkSourceFiles(fullPath, rootDir, excludes));\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name).toLowerCase();\n if (GENERAL_SOURCE_EXTENSIONS.includes(ext)) {\n files.push(fullPath);\n }\n }\n }\n } catch {\n // Skip\n }\n\n return files;\n}\n\nexport function scanFileForSast(\n filePath: string,\n rootDir: string,\n minSeverity: SastSeverity = 'HIGH'\n): SastViolation[] {\n const violations: SastViolation[] = [];\n const ext = path.extname(filePath).toLowerCase();\n\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const lines = content.split(/\\r?\\n/);\n const relPath = path.relative(rootDir, filePath).replace(/\\\\/g, '/');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (\n line.includes('ai-sdlc:allow-sast') ||\n line.includes('ai-sdlc:allow-prompt-injection') ||\n line.includes('nosec')\n )\n continue;\n\n for (const rule of SAST_RULES) {\n if (rule.fileExtensions && !rule.fileExtensions.includes(ext)) continue;\n\n if (minSeverity === 'CRITICAL' && rule.severity !== 'CRITICAL') continue;\n\n rule.pattern.lastIndex = 0;\n if (rule.pattern.test(line)) {\n violations.push({\n filePath,\n relPath,\n lineNumber: i + 1,\n ruleId: rule.id,\n type: rule.type,\n severity: rule.severity,\n snippet: line.trim(),\n message: rule.description,\n });\n }\n }\n }\n } catch {\n // Skip\n }\n\n return violations;\n}\n\nexport function verifySast(options: SastVerifierOptions = {}): SastVerifierResult {\n const rootDir = options.rootDir || process.cwd();\n const minSeverity = options.minSeverity || 'HIGH';\n const targetDirs = options.targetDirectories || ['src', 'packages', 'prompts'];\n\n const filesToScan: string[] = [];\n for (const tDir of targetDirs) {\n const fullDir = path.join(rootDir, tDir);\n if (fs.existsSync(fullDir)) {\n filesToScan.push(...walkSourceFiles(fullDir, rootDir));\n }\n }\n\n const violations: SastViolation[] = [];\n for (const file of filesToScan) {\n violations.push(...scanFileForSast(file, rootDir, minSeverity));\n }\n\n // Delegate to Semgrep if requested or available\n if (options.semgrep || (options.semgrep === undefined && isSemgrepInstalled())) {\n try {\n const semgrepFindings = runSemgrepCli(rootDir);\n violations.push(...semgrepFindings);\n } catch {\n // Semgrep failure fallback\n }\n }\n\n const result: SastVerifierResult = {\n success: violations.length === 0,\n totalFilesScanned: filesToScan.length,\n violationsCount: violations.length,\n violations,\n };\n\n result.reportMarkdown = generateSastReportMarkdown(result);\n return result;\n}\n\nexport function generateSastReportMarkdown(result: SastVerifierResult): string {\n const isOk = result.success;\n const lines: string[] = [\n `# 🛡️ Shift-Left SAST Audit (Static Application Security Testing)`,\n ``,\n `> **Evaluation Date:** ${new Date().toISOString()}`,\n `> **Verdict:** ${isOk ? '✅ COMPLIANT (No vulnerable patterns detected)' : `❌ BLOCKED (${result.violationsCount} vulnerabilities detected)`}`,\n `> **Audited Code Files:** ${result.totalFilesScanned} | **SAST Violations:** ${result.violationsCount}`,\n ``,\n `---`,\n ];\n\n if (result.violations.length === 0) {\n lines.push(\n ``,\n `## Compliance Summary`,\n ``,\n `No SQL injection, arbitrary dynamic command execution (eval/exec), SSRF, path traversal, or prompt injection (OWASP LLM01) patterns detected in analyzed code modules.`,\n `Code generated by humans and agents complies with OWASP Top 10 and OWASP Top 10 for LLMs secure coding standards.`\n );\n } else {\n lines.push(\n ``,\n `## Detected Security Findings Detail`,\n ``,\n `| Severity | Rule | Type | File:Line | Snippet | Details |`,\n `| :---: | :--- | :--- | :--- | :--- | :--- |`\n );\n\n for (const v of result.violations) {\n const badge = v.severity === 'CRITICAL' ? '🛑 CRITICAL' : '⚠️ HIGH';\n lines.push(\n `| **${badge}** | \\`${v.ruleId}\\` | \\`${v.type}\\` | \\`${v.relPath}:${v.lineNumber}\\` | \\`${v.snippet.replace(/\\|/g, '\\\\|')}\\` | ${v.message} |`\n );\n }\n }\n\n return lines.join('\\n');\n}\n\nexport const PROMPT_INJECTION_SIGNATURES: readonly {\n ruleId: string;\n severity: SastSeverity;\n regex: RegExp;\n message: string;\n}[] = [\n {\n ruleId: 'PROMPT-INJ-JAILBREAK',\n severity: 'CRITICAL',\n regex: /(?:\\b(?:ignore|disregard|forget)\\s+(?:all\\s+)?(?:previous|prior|above)\\s+(?:instructions|prompts|directions|rules)\\b)/i,\n message: 'Attempted bypass or disregard of prior system instructions',\n },\n {\n ruleId: 'PROMPT-INJ-MODE-OVERRIDE',\n severity: 'CRITICAL',\n regex: /(?:\\b(?:system\\s+(?:prompt\\s+)?override|override\\s+system\\s+prompt|developer\\s+mode\\s+enabled|dan\\s+mode(?:\\s+enabled)?|unfiltered\\s+(?:ai\\s+)?mode)\\b)/i,\n message: 'Attempted system prompt override, developer mode, or unrestricted mode activation', // ai-sdlc:allow-prompt-injection\n },\n {\n ruleId: 'PROMPT-INJ-LEAK',\n severity: 'HIGH',\n regex: /(?:\\b(?:reveal|print|output|display)\\s+(?:your\\s+)?(?:system\\s+prompt|initial\\s+instructions|base\\s+prompt)\\b)/i,\n message: 'Attempted extraction or exfiltration of system prompt or instructions (Prompt Leaking)',\n },\n {\n ruleId: 'PROMPT-INJ-DELIMITER-ESCAPE',\n severity: 'CRITICAL',\n regex: /(?:<\\/(?:system|instructions|prompt|context)>\\s*(?:new\\s+instructions|you\\s+are\\s+now|system:)|\\[(?:SYSTEM|SYSTEM_OVERRIDE|ADMIN)\\])/i,\n message: 'Delimiter injection attempt to escape context boundaries or inject roles',\n },\n {\n ruleId: 'PROMPT-INJ-ROLE-SPOOFING',\n severity: 'HIGH',\n regex: /(?:\\r?\\n|^)\\s*(?:System|Admin|Root):\\s*(?:You\\s+are|Override|Ignore|Execute)/i,\n message: 'Attempted role spoofing or privileged role impersonation',\n },\n];\n\nexport function detectPromptInjection(content: string): PromptInjectionFinding[] {\n const findings: PromptInjectionFinding[] = [];\n if (!content) return findings;\n\n const lines = content.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line.includes('ai-sdlc:allow-prompt-injection') || line.includes('nosec')) continue;\n\n for (const sig of PROMPT_INJECTION_SIGNATURES) {\n sig.regex.lastIndex = 0;\n if (sig.regex.test(line)) {\n findings.push({\n ruleId: sig.ruleId,\n severity: sig.severity,\n pattern: sig.regex.source,\n snippet: line.trim(),\n lineNumber: i + 1,\n message: sig.message,\n });\n }\n }\n }\n\n // Multiline checks\n for (const sig of PROMPT_INJECTION_SIGNATURES) {\n if (sig.ruleId === 'PROMPT-INJ-ROLE-SPOOFING') {\n sig.regex.lastIndex = 0;\n if (sig.regex.test(content)) {\n const alreadyFound = findings.some((f) => f.ruleId === sig.ruleId);\n if (!alreadyFound) {\n findings.push({\n ruleId: sig.ruleId,\n severity: sig.severity,\n pattern: sig.regex.source,\n snippet: content.slice(0, 100).trim(),\n message: sig.message,\n });\n }\n }\n }\n }\n\n return findings;\n}\n\n","/**\n * AI-SDLC: Automated Formal Quality Report Generator (Polyglot)\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {\n CodeCoverageSummary,\n QualityPolicy,\n QualityReportOptions,\n QualityReportResult,\n} from '../types/index.js';\nimport { verifyQualityGate } from '../verifiers/quality-gate.js';\n\nexport function calculateRating(mi: number, cc: number): 'A' | 'B' | 'C' | 'D' | 'F' {\n if (mi >= 75 && cc <= 5) return 'A';\n if (mi >= 60 && cc <= 10) return 'B';\n if (mi >= 50 && cc <= 15) return 'C';\n if (mi >= 40 && cc <= 20) return 'D';\n return 'F';\n}\n\nexport function detectLanguage(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n switch (ext) {\n case '.ts':\n return 'TypeScript';\n case '.js':\n return 'JavaScript';\n case '.py':\n return 'Python';\n case '.java':\n return 'Java';\n case '.go':\n return 'Go';\n case '.cs':\n return 'C#';\n case '.rs':\n return 'Rust';\n case '.cpp':\n case '.c':\n return 'C/C++';\n default:\n return 'Unknown';\n }\n}\n\nfunction parseJsonSummaryFile(filePath: string, relSource: string): CodeCoverageSummary | null {\n try {\n const raw = JSON.parse(fs.readFileSync(filePath, 'utf-8')) as Record<string, unknown>;\n const total = raw.total as Record<string, Record<string, unknown>> | undefined;\n if (!total || typeof total !== 'object') return null;\n const linesPct = Number(total.lines?.pct);\n const branchesPct = Number(total.branches?.pct);\n const functionsPct = Number(total.functions?.pct);\n if (Number.isNaN(linesPct) || Number.isNaN(branchesPct) || Number.isNaN(functionsPct)) return null;\n const statementsPct = total.statements?.pct !== undefined ? Number(total.statements.pct) : undefined;\n return { linesPct, branchesPct, functionsPct, statementsPct, source: relSource };\n } catch {\n return null;\n }\n}\n\nfunction parseLcovFile(filePath: string, relSource: string): CodeCoverageSummary | null {\n try {\n const lines = fs.readFileSync(filePath, 'utf-8').split(/\\r?\\n/);\n let lf = 0, lh = 0, brf = 0, brh = 0, fnf = 0, fnh = 0;\n for (const line of lines) {\n if (line.startsWith('LF:')) lf += parseInt(line.slice(3), 10) || 0;\n else if (line.startsWith('LH:')) lh += parseInt(line.slice(3), 10) || 0;\n else if (line.startsWith('BRF:')) brf += parseInt(line.slice(4), 10) || 0;\n else if (line.startsWith('BRH:')) brh += parseInt(line.slice(4), 10) || 0;\n else if (line.startsWith('FNF:')) fnf += parseInt(line.slice(4), 10) || 0;\n else if (line.startsWith('FNH:')) fnh += parseInt(line.slice(4), 10) || 0;\n }\n if (lf === 0 && fnf === 0 && brf === 0) return null;\n const pct = (hit: number, found: number): number =>\n found > 0 ? Math.round((hit / found) * 1000) / 10 : 100;\n return {\n linesPct: pct(lh, lf),\n branchesPct: pct(brh, brf),\n functionsPct: pct(fnh, fnf),\n source: relSource,\n };\n } catch {\n return null;\n }\n}\n\nexport function readCodeCoverageSummary(rootDir: string = process.cwd()): CodeCoverageSummary | null {\n const jsonCandidates = ['coverage/coverage-summary.json', 'reports/coverage-summary.json'];\n for (const rel of jsonCandidates) {\n const full = path.join(rootDir, rel);\n if (fs.existsSync(full)) {\n const parsed = parseJsonSummaryFile(full, rel);\n if (parsed) return parsed;\n }\n }\n const lcovCandidates = ['coverage/lcov.info', 'lcov.info', 'reports/lcov.info'];\n for (const rel of lcovCandidates) {\n const full = path.join(rootDir, rel);\n if (fs.existsSync(full)) {\n const parsed = parseLcovFile(full, rel);\n if (parsed) return parsed;\n }\n }\n return null;\n}\n\nfunction formatCoverageRow(label: string, measured: number | undefined, minThreshold: number): string {\n if (measured === undefined) {\n return `| **${label}** | \\`N/A (Run test:coverage)\\` | $\\\\ge ${minThreshold}\\\\%$ | ℹ️ NOT MEASURED |`;\n }\n const status = measured >= minThreshold ? '✅ COMPLIANT' : '⚠️ BELOW THRESHOLD';\n return `| **${label}** | \\`${measured}%\\` | $\\\\ge ${minThreshold}\\\\%$ | ${status} |`;\n}\n\nfunction buildCoverageRows(coverage: CodeCoverageSummary | null, policy: QualityPolicy): string[] {\n return [\n formatCoverageRow('Line Coverage', coverage?.linesPct, policy.min_line_coverage),\n formatCoverageRow('Branch Coverage', coverage?.branchesPct, policy.min_branch_coverage),\n formatCoverageRow('Function Coverage', coverage?.functionsPct, policy.min_function_coverage),\n ];\n}\n\nexport function generateQualityReport(options: QualityReportOptions = {}): QualityReportResult {\n const rootDir = options.rootDir || process.cwd();\n const gateResult = verifyQualityGate({\n rootDir,\n policyPath: options.policyPath,\n thresholds: options.thresholds,\n });\n const coverage = readCodeCoverageSummary(rootDir);\n\n const totalFiles = gateResult.totalFiles;\n const totalFunctions = gateResult.totalFunctions;\n\n let totalMi = 0;\n let totalCc = 0;\n let totalCognitive = 0;\n let totalLoc = 0;\n\n const langMap = new Map<string, { fns: number; loc: number; miSum: number; ccSum: number }>();\n const violationsList: string[] = [];\n\n for (const fn of gateResult.results) {\n totalMi += fn.maintainability;\n totalCc += fn.cyclomatic;\n totalCognitive += fn.cognitive;\n totalLoc += fn.loc;\n\n const lang = detectLanguage(fn.filePath);\n const existing = langMap.get(lang) || { fns: 0, loc: 0, miSum: 0, ccSum: 0 };\n existing.fns++;\n existing.loc += fn.loc;\n existing.miSum += fn.maintainability;\n existing.ccSum += fn.cyclomatic;\n langMap.set(lang, existing);\n\n if (fn.violations.length > 0) {\n violationsList.push(`- **\\`${fn.relPath}\\`** [\\`${fn.functionName}\\`]: ${fn.violations.join(', ')}`);\n }\n }\n\n const avgMaintainability = totalFunctions > 0 ? Math.round((totalMi / totalFunctions) * 10) / 10 : 100;\n const avgCyclomatic = totalFunctions > 0 ? Math.round((totalCc / totalFunctions) * 10) / 10 : 1;\n const avgCognitive = totalFunctions > 0 ? Math.round((totalCognitive / totalFunctions) * 10) / 10 : 0;\n const globalRating = calculateRating(avgMaintainability, avgCyclomatic);\n const verdict = gateResult.success ? 'PASS' : 'FAIL';\n\n const lines: string[] = [\n `# 📊 Formal Quality and Release Gate Report (AI-SDLC)`,\n ``,\n `> **Generation Date:** ${new Date().toISOString()}`,\n `> **Release Gate Verdict:** ${verdict === 'PASS' ? '🟢 APPROVED (RELEASE READY)' : '🔴 BLOCKED (VIOLATIONS DETECTED)'}`,\n `> **Global Rating:** **\\`${globalRating}\\`** (MI Index: ${avgMaintainability}/100, Average CC: ${avgCyclomatic})`,\n ``,\n `---`,\n ``,\n `## 1. Executive Metric Summary`,\n ``,\n `| Key Metric | Measured Value | Policy Threshold | Compliance |`,\n `| :--- | :---: | :---: | :---: |`,\n `| **Analyzed Files** | \\`${totalFiles}\\` | N/A | ℹ️ |`,\n `| **Evaluated Functions** | \\`${totalFunctions}\\` | N/A | ℹ️ |`,\n `| **Lines of Code (LOC)** | \\`${totalLoc}\\` | N/A | ℹ️ |`,\n `| **Cyclomatic Complexity (Average)** | \\`${avgCyclomatic}\\` | $\\\\le ${gateResult.policy.max_cyclomatic}$ | ${avgCyclomatic <= gateResult.policy.max_cyclomatic ? '✅ COMPLIANT' : '❌ EXCEEDED'} |`,\n `| **Cognitive Complexity (Average)** | \\`${avgCognitive}\\` | $\\\\le ${gateResult.policy.max_cognitive}$ | ${avgCognitive <= gateResult.policy.max_cognitive ? '✅ COMPLIANT' : '❌ EXCEEDED'} |`,\n `| **Maintainability Index (SEI MI)** | \\`${avgMaintainability} / 100\\` | $\\\\ge ${gateResult.policy.min_maintainability}$ | ${avgMaintainability >= gateResult.policy.min_maintainability ? '✅ COMPLIANT' : '❌ INSUFFICIENT'} |`,\n ...buildCoverageRows(coverage, gateResult.policy),\n `| **Functions in Violation** | \\`${gateResult.failCount}\\` | $0$ (Mode ${gateResult.policy.enforce_mode}) | ${gateResult.failCount === 0 ? '✅ 0 VIOLATIONS' : '❌ BLOCKED'} |`,\n ``,\n `---`,\n ``,\n `## 2. Polyglot Breakdown by Language Ecosystem`,\n ``,\n `| Language | Functions | Total LOC | Average MI | Average CC | Rating |`,\n `| :--- | :---: | :---: | :---: | :---: | :---: |`,\n ];\n\n for (const [lang, stats] of langMap.entries()) {\n const langMi = Math.round((stats.miSum / stats.fns) * 10) / 10;\n const langCc = Math.round((stats.ccSum / stats.fns) * 10) / 10;\n const rating = calculateRating(langMi, langCc);\n lines.push(\n `| **${lang}** | \\`${stats.fns}\\` | \\`${stats.loc}\\` | \\`${langMi}\\` | \\`${langCc}\\` | \\`${rating}\\` |`\n );\n }\n\n if (violationsList.length > 0) {\n lines.push('');\n lines.push('---');\n lines.push('');\n lines.push('## 3. Quality Gate Violations Log');\n lines.push('');\n lines.push(...violationsList);\n }\n\n lines.push('');\n lines.push('---');\n lines.push('');\n lines.push('## 4. Evaluation Criteria and Standards');\n lines.push('- **McCabe Cyclomatic Complexity (CC)**: Number of linearly independent paths.');\n lines.push('- **Maintainability Index (SEI MI)**: Normalized formula [0 - 100] combining Halstead Volume, CC, and LOC.');\n lines.push('- **Automated Test Coverage**: Passively ingested from `coverage/coverage-summary.json` or `lcov.info` when present.');\n lines.push('- **Clean Code Guardrails**: Prohibition of implicit `any` typing, function length limits ($\\le 40$ lines), and zero unjustified suppressions.');\n\n const markdown = lines.join('\\n');\n\n // Optionally write to reports/QUALITY_REPORT.md\n const reportsDir = path.join(rootDir, 'reports');\n fs.mkdirSync(reportsDir, { recursive: true });\n fs.writeFileSync(path.join(reportsDir, 'QUALITY_REPORT.md'), markdown, 'utf-8');\n\n return {\n markdown,\n totalFiles,\n totalFunctions,\n avgMaintainability,\n avgCyclomatic,\n verdict,\n coverage,\n };\n}\n","/**\n * AI-SDLC: 4-Tier Git Branching Model & Hierarchy Planner\n */\n\nimport {\n BranchClassificationResult,\n BranchHierarchyPlan,\n} from '../types/index.js';\n\nexport const BRANCH_PATTERNS = {\n MAIN: /^main$/,\n RELEASE: /^release\\/v[0-9]+\\.[0-9]+\\.[0-9]+(-[0-9A-Za-z.-]+)?$/,\n FEATURE: /^(feat|feature)\\/(?:v[0-9]+\\.[0-9]+\\.[0-9]+\\/)?([a-zA-Z0-9]+-[a-zA-Z0-9-]+)$/,\n BUG: /^(bug|fix)\\/(?:v[0-9]+\\.[0-9]+\\.[0-9]+\\/)?([a-zA-Z0-9]+-[a-zA-Z0-9-]+)$/,\n PATCH: /^(patch)\\/(?:v[0-9]+\\.[0-9]+\\.[0-9]+\\/)?([a-zA-Z0-9]+-[a-zA-Z0-9-]+)$/,\n TASK: /^task\\/([a-zA-Z0-9]+-[a-zA-Z0-9-]+)\\/([a-zA-Z0-9]+-[a-zA-Z0-9-]+)$/,\n} as const;\n\nexport function classifyBranch(branchName: string): BranchClassificationResult {\n if (BRANCH_PATTERNS.MAIN.test(branchName)) {\n return {\n valid: true,\n tier: 1,\n tierName: 'Main (Producción)',\n parentRequirement: 'Ninguno (Rama Raíz)',\n targetMerge: 'Despliegue a Producción',\n };\n }\n\n if (BRANCH_PATTERNS.RELEASE.test(branchName)) {\n return {\n valid: true,\n tier: 2,\n tierName: 'Versión / Release',\n parentRequirement: 'Debe originarse desde main',\n targetMerge: 'main',\n };\n }\n\n const featMatch = branchName.match(BRANCH_PATTERNS.FEATURE);\n if (featMatch) {\n return {\n valid: true,\n tier: 3,\n tierName: 'Feature (Funcionalidad)',\n id: featMatch[2],\n parentRequirement: 'Debe originarse desde una rama release/vX.Y.Z activa',\n targetMerge: 'release/vX.Y.Z',\n };\n }\n\n const bugMatch = branchName.match(BRANCH_PATTERNS.BUG);\n if (bugMatch) {\n return {\n valid: true,\n tier: 3,\n tierName: 'Bug (Defecto)',\n id: bugMatch[2],\n parentRequirement: 'Debe originarse desde una rama release/vX.Y.Z activa',\n targetMerge: 'release/vX.Y.Z',\n };\n }\n\n const patchMatch = branchName.match(BRANCH_PATTERNS.PATCH);\n if (patchMatch) {\n return {\n valid: true,\n tier: 3,\n tierName: 'Patch (Parche Rápido)',\n id: patchMatch[2],\n parentRequirement: 'Debe originarse desde una rama release/vX.Y.Z activa o main según criticidad',\n targetMerge: 'release/vX.Y.Z o main',\n };\n }\n\n const taskMatch = branchName.match(BRANCH_PATTERNS.TASK);\n if (taskMatch) {\n return {\n valid: true,\n tier: 4,\n tierName: 'Task (Tarea Atómica)',\n parentId: taskMatch[1],\n taskId: taskMatch[2],\n parentRequirement: `Debe originarse desde la rama de feature, bug o patch: feat/${taskMatch[1]}, bug/${taskMatch[1]} o patch/${taskMatch[1]}`,\n targetMerge: `feat/${taskMatch[1]}, bug/${taskMatch[1]} o patch/${taskMatch[1]}`,\n };\n }\n\n return {\n valid: false,\n tier: 0,\n tierName: 'Inválido',\n error: `El nombre '${branchName}' no cumple con los estándares del modelo de 4 tiers.`,\n };\n}\n\nexport function generateBranchHierarchyPlan(\n version: string,\n feature: string,\n tasks: string[]\n): BranchHierarchyPlan {\n const vBranch = `release/${version}`;\n const fBranch = `feat/${feature}`;\n\n const lines: string[] = [\n '================================================================',\n 'AI-SDLC: Plan de Ramificación Jerárquico',\n '================================================================\\n',\n `1. [TIER 1] Rama Base Estable: main`,\n `2. [TIER 2] Rama de Versión Abierta: ${vBranch} (originada de main)`,\n `3. [TIER 3] Rama de Feature: ${fBranch} (originada de ${vBranch})\\n`,\n `4. [TIER 4] Ramas de Tareas Atómicas (originadas de ${fBranch}):`,\n ];\n\n for (const t of tasks) {\n const parentSlug = feature.split('-').slice(0, 2).join('-');\n const taskBranch = `task/${parentSlug}/${t.toLowerCase()}`;\n lines.push(` ├── ${taskBranch}`);\n lines.push(` │ Comando git: git checkout ${fBranch} && git checkout -b ${taskBranch}`);\n }\n\n lines.push(`\\nFlujo de Integración (Merges):`);\n lines.push(` task/* ➔ [PR Tarea] ➔ ${fBranch} ➔ [PR Feature + Quality Gate] ➔ ${vBranch} ➔ [PR Release] ➔ main\\n`);\n\n return {\n version,\n feature,\n tasks,\n planText: lines.join('\\n'),\n };\n}\n","/**\n * AI-SDLC: Automated Task Navigation & Cascading 4-Tier Git Branch Creation Engine\n */\n\nimport { execFileSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\nimport { slugify } from '../adapters/sdd/scaffold.js';\nimport { classifyBranch } from './workflow.js';\nimport {\n ActiveTaskMatch,\n GitCheckoutTaskOptions,\n GitCheckoutTaskResult,\n} from '../types/index.js';\n\ninterface RawTasksFrontmatter {\n id?: string;\n 'change-id'?: string;\n changeId?: string;\n version?: string | number;\n 'target-release'?: string;\n release?: string;\n tasks?: Array<{\n id: string;\n title?: string;\n [key: string]: unknown;\n }>;\n [key: string]: unknown;\n}\n\nexport interface TaskLocateResult {\n found: boolean;\n match?: ActiveTaskMatch;\n availableTasks?: Array<{ id: string; title: string; changeId: string }>;\n error?: string;\n}\n\n/**\n * Locate which active SDD change (CHG-*) a task belongs to by inspecting\n * specs/changes/active/<change-dir>/tasks.md.\n */\nexport function locateTaskInActiveChanges(\n taskId: string,\n rootDir: string = process.cwd()\n): TaskLocateResult {\n const cleanTaskId = (taskId || '').trim();\n if (!cleanTaskId) {\n return {\n found: false,\n error: 'Debe especificar un identificador de tarea válido (ej. TSK-001).',\n };\n }\n\n const activeChangesDir = path.join(rootDir, 'specs', 'changes', 'active');\n if (!fs.existsSync(activeChangesDir)) {\n return {\n found: false,\n error: `No se encontró el directorio de cambios activos en '${activeChangesDir}'.`,\n };\n }\n\n const availableTasks: Array<{ id: string; title: string; changeId: string }> = [];\n const candidateDirs = fs.readdirSync(activeChangesDir, { withFileTypes: true });\n\n let matchedTask: ActiveTaskMatch | undefined;\n\n for (const entry of candidateDirs) {\n if (!entry.isDirectory()) continue;\n const changeDir = path.join(activeChangesDir, entry.name);\n const tasksFile = path.join(changeDir, 'tasks.md');\n\n if (!fs.existsSync(tasksFile)) continue;\n\n try {\n const content = fs.readFileSync(tasksFile, 'utf-8');\n const fmMatch = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!fmMatch) continue;\n\n const fm = yaml.load(fmMatch[1]) as RawTasksFrontmatter;\n if (!fm || !Array.isArray(fm.tasks)) continue;\n\n const rawChangeId =\n fm['change-id'] ||\n fm.changeId ||\n entry.name.replace(/^(chg|CHG)-/i, 'CHG-').toUpperCase();\n\n // Resolve version from tasks.md frontmatter, or fallback to proposal.md / package.json\n let versionStr = '1.0.0';\n if (fm.version) {\n versionStr = String(fm.version);\n } else if (fm['target-release'] || fm.release) {\n versionStr = String(fm['target-release'] || fm.release);\n } else {\n const proposalFile = path.join(changeDir, 'proposal.md');\n if (fs.existsSync(proposalFile)) {\n const propContent = fs.readFileSync(proposalFile, 'utf-8');\n const propFm = propContent.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (propFm) {\n const parsedProp = yaml.load(propFm[1]) as Record<string, unknown>;\n if (parsedProp?.version) versionStr = String(parsedProp.version);\n }\n }\n }\n\n for (const t of fm.tasks) {\n if (!t || !t.id) continue;\n const currentId = String(t.id).trim();\n const currentTitle = String(t.title || '').trim();\n\n availableTasks.push({\n id: currentId,\n title: currentTitle,\n changeId: String(rawChangeId),\n });\n\n const targetLower = cleanTaskId.toLowerCase();\n const currentLower = currentId.toLowerCase();\n\n // Exact match or prefix match (e.g. TSK-001 matches TSK-001-dto or vice versa)\n const isMatch =\n currentLower === targetLower ||\n currentLower.startsWith(`${targetLower}-`) ||\n targetLower.startsWith(`${currentLower}-`);\n\n if (isMatch && !matchedTask) {\n matchedTask = {\n taskId: currentId,\n taskTitle: currentTitle,\n changeId: String(rawChangeId),\n changeDir,\n version: versionStr,\n };\n }\n }\n } catch {\n // Ignore unparseable change files\n }\n }\n\n if (matchedTask) {\n return {\n found: true,\n match: matchedTask,\n availableTasks,\n };\n }\n\n return {\n found: false,\n availableTasks,\n error: `No se encontró la tarea '${cleanTaskId}' en ningún cambio activo bajo 'specs/changes/active/'.`,\n };\n}\n\n/**\n * Resolves the 4-tier branch hierarchy for a matched task:\n * Tier 1: main\n * Tier 2: release/vX.Y.Z\n * Tier 3: feat/<FEAT-ID>-<slug>\n * Tier 4: task/<PARENT-ID>/<TSK-ID>-<slug>\n */\nexport function resolveBranchHierarchy(\n match: ActiveTaskMatch,\n rootDir: string = process.cwd()\n): {\n baseBranch: string;\n releaseBranch: string;\n featureBranch: string;\n taskBranch: string;\n} {\n // Tier 1: Base branch\n const baseBranch = 'main';\n\n // Tier 2: Release branch\n // Check if an existing release branch exists locally or remotely\n let existingReleaseBranch: string | undefined;\n try {\n const branchesOutput = execFileSync('git', ['branch', '-a'], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n });\n const releaseMatches = branchesOutput.match(/(?:remotes\\/origin\\/)?(release\\/v[0-9]+\\.[0-9]+\\.[0-9]+[^\\s]*)/g);\n if (releaseMatches && releaseMatches.length > 0) {\n existingReleaseBranch = releaseMatches[0].replace(/^remotes\\/origin\\//, '');\n }\n } catch {\n // Git command failure fallback\n }\n\n const cleanVersion = (match.version || '1.0.0').replace(/^v/, '');\n const candidateReleaseBranch = `release/v${cleanVersion}`;\n const releaseBranch =\n existingReleaseBranch && classifyBranch(existingReleaseBranch).valid\n ? existingReleaseBranch\n : candidateReleaseBranch;\n\n // Tier 3: Feature branch\n // Normalize change ID into feat/<CHG-XXX-slug>\n const dirName = path.basename(match.changeDir);\n const changeSlug = dirName.replace(/^(chg|CHG)-/i, (m) => m.toUpperCase());\n\n // Check if a branch for this change already exists in git\n let existingFeatureBranch: string | undefined;\n try {\n const branchesOutput = execFileSync('git', ['branch', '-a'], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n });\n const lines = branchesOutput.split('\\n');\n for (const line of lines) {\n const cleanLine = line.trim().replace(/^[*+]\\s+/, '').replace(/^remotes\\/origin\\//, '');\n if (\n cleanLine.startsWith('feat/') &&\n (cleanLine.toLowerCase().includes(dirName.toLowerCase()) ||\n cleanLine.toLowerCase().includes(match.changeId.toLowerCase()))\n ) {\n existingFeatureBranch = cleanLine;\n break;\n }\n }\n } catch {\n // Git command failure fallback\n }\n\n let featureBranch: string;\n if (existingFeatureBranch && classifyBranch(existingFeatureBranch).valid) {\n featureBranch = existingFeatureBranch;\n } else {\n // Construct standardized feature branch\n const normalizedName = slugify(changeSlug).replace(/^(chg|bug|feat)-(\\d+)/i, (_, p, n) => `${p.toUpperCase()}-${n}`);\n featureBranch = `feat/${normalizedName}`;\n }\n\n // Tier 4: Task branch: task/<PARENT-ID>/<TSK-ID>-<slug>\n const parentIdMatch = featureBranch.replace(/^(feat|feature)\\//i, '').match(/^[a-zA-Z0-9]+-[a-zA-Z0-9]+/);\n const parentId = parentIdMatch ? parentIdMatch[0] : match.changeId.split('-').slice(0, 2).join('-');\n\n let existingTaskBranch: string | undefined;\n try {\n const branchesOutput = execFileSync('git', ['branch', '-a'], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n });\n const lines = branchesOutput.split('\\n');\n for (const line of lines) {\n const cleanLine = line.trim().replace(/^[*+]\\s+/, '').replace(/^remotes\\/origin\\//, '');\n if (\n cleanLine.startsWith(`task/${parentId}/`) &&\n cleanLine.toLowerCase().includes(match.taskId.toLowerCase())\n ) {\n existingTaskBranch = cleanLine;\n break;\n }\n }\n } catch {\n // Git command failure fallback\n }\n\n let taskBranch: string;\n if (existingTaskBranch && classifyBranch(existingTaskBranch).valid) {\n taskBranch = existingTaskBranch;\n } else {\n let taskSuffix = match.taskId.toLowerCase();\n const hasSlug = taskSuffix.includes('-') && taskSuffix.split('-').length > 2;\n if (!hasSlug && match.taskTitle) {\n const titleSlug = slugify(match.taskTitle).split('-').slice(0, 4).join('-');\n if (titleSlug) {\n taskSuffix = `${taskSuffix}-${titleSlug}`;\n }\n }\n taskBranch = `task/${parentId}/${taskSuffix}`;\n }\n\n return {\n baseBranch,\n releaseBranch,\n featureBranch,\n taskBranch,\n };\n}\n\n/**\n * Creates missing branches in cascade (Tier 1 -> Tier 2 -> Tier 3 -> Tier 4)\n * and switches to the Tier 4 task branch automatically.\n */\nexport function checkoutTaskBranch(\n taskId: string,\n options: GitCheckoutTaskOptions = {}\n): GitCheckoutTaskResult {\n const rootDir = options.rootDir || process.cwd();\n\n const locateRes = locateTaskInActiveChanges(taskId, rootDir);\n if (!locateRes.found || !locateRes.match) {\n return {\n success: false,\n taskId,\n createdBranches: [],\n error: locateRes.error,\n availableTasks: locateRes.availableTasks,\n };\n }\n\n const match = locateRes.match;\n const { baseBranch, releaseBranch, featureBranch, taskBranch } = resolveBranchHierarchy(match, rootDir);\n\n const createdBranches: string[] = [];\n\n const runGit = (args: string[]) => {\n return execFileSync('git', args, {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n };\n\n const branchExistsLocally = (branch: string): boolean => {\n try {\n runGit(['show-ref', '--verify', '--quiet', `refs/heads/${branch}`]);\n return true;\n } catch {\n return false;\n }\n };\n\n const branchExistsRemotely = (branch: string): boolean => {\n try {\n runGit(['show-ref', '--verify', '--quiet', `refs/remotes/origin/${branch}`]);\n return true;\n } catch {\n return false;\n }\n };\n\n try {\n // 1. Ensure Tier 2 (release) branch exists\n if (!branchExistsLocally(releaseBranch)) {\n if (branchExistsRemotely(releaseBranch)) {\n runGit(['branch', '--track', releaseBranch, `origin/${releaseBranch}`]);\n } else {\n runGit(['branch', releaseBranch, baseBranch]);\n }\n createdBranches.push(releaseBranch);\n }\n\n // 2. Ensure Tier 3 (feature) branch exists\n if (!branchExistsLocally(featureBranch)) {\n if (branchExistsRemotely(featureBranch)) {\n runGit(['branch', '--track', featureBranch, `origin/${featureBranch}`]);\n } else {\n runGit(['branch', featureBranch, releaseBranch]);\n }\n createdBranches.push(featureBranch);\n }\n\n // 3. Ensure Tier 4 (task) branch exists\n if (!branchExistsLocally(taskBranch)) {\n if (branchExistsRemotely(taskBranch)) {\n runGit(['branch', '--track', taskBranch, `origin/${taskBranch}`]);\n } else {\n runGit(['branch', taskBranch, featureBranch]);\n }\n createdBranches.push(taskBranch);\n }\n\n // 4. Perform checkout to Tier 4 task branch\n runGit(['checkout', taskBranch]);\n\n return {\n success: true,\n taskId: match.taskId,\n changeId: match.changeId,\n releaseBranch,\n featureBranch,\n taskBranch,\n createdBranches,\n switchedBranch: taskBranch,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n taskId: match.taskId,\n changeId: match.changeId,\n releaseBranch,\n featureBranch,\n taskBranch,\n createdBranches,\n error: `Error durante la creación o checkout de ramas Git: ${message}`,\n };\n }\n}\n","/**\n * AI-SDLC: Git Commit Trailers Parser and Extraction Engine\n */\n\nimport { execFileSync } from 'child_process';\n\nexport interface CommitTrailers {\n taskId?: string;\n parentRef?: string;\n authorType: 'human' | 'agent';\n aiModel?: string;\n promptTokens: number;\n completionTokens: number;\n activeTimeSeconds: number;\n}\n\nexport interface CommitKpiRecord {\n sha: string;\n authorName: string;\n authorEmail: string;\n date: string;\n subject: string;\n trailers: CommitTrailers;\n linesAdded: number;\n linesDeleted: number;\n isBugFix: boolean;\n}\n\nconst TRAILER_REGEXES = {\n taskId: /^\\s*Task-ID:\\s*(.+)$/im,\n parentRef: /^\\s*Parent-Ref:\\s*(.+)$/im,\n authorType: /^\\s*Author-Type:\\s*(human|agent)/im,\n aiModel: /^\\s*AI-Model:\\s*(.+)$/im,\n promptTokens: /^\\s*Prompt-Tokens:\\s*([0-9]+)/im,\n completionTokens: /^\\s*Completion-Tokens:\\s*([0-9]+)/im,\n activeTimeSeconds: /^\\s*Active-Time-Seconds:\\s*([0-9]+)/im,\n};\n\n/**\n * Parses structured AI-SDLC git trailers from a commit message.\n */\nexport function parseCommitTrailers(rawMessage: string): CommitTrailers {\n const text = rawMessage || '';\n const taskIdMatch = text.match(TRAILER_REGEXES.taskId);\n const parentRefMatch = text.match(TRAILER_REGEXES.parentRef);\n const authorTypeMatch = text.match(TRAILER_REGEXES.authorType);\n const aiModelMatch = text.match(TRAILER_REGEXES.aiModel);\n const promptTokensMatch = text.match(TRAILER_REGEXES.promptTokens);\n const completionTokensMatch = text.match(TRAILER_REGEXES.completionTokens);\n const activeTimeMatch = text.match(TRAILER_REGEXES.activeTimeSeconds);\n\n let authorType: 'human' | 'agent' = 'human';\n if (authorTypeMatch) {\n authorType = authorTypeMatch[1].toLowerCase() as 'human' | 'agent';\n } else if (aiModelMatch && aiModelMatch[1].trim() !== 'n/a') {\n authorType = 'agent';\n }\n\n const aiModel = aiModelMatch ? aiModelMatch[1].trim() : undefined;\n const promptTokens = promptTokensMatch ? parseInt(promptTokensMatch[1], 10) : 0;\n const completionTokens = completionTokensMatch ? parseInt(completionTokensMatch[1], 10) : 0;\n const activeTimeSeconds = activeTimeMatch ? parseInt(activeTimeMatch[1], 10) : 0;\n\n return {\n taskId: taskIdMatch ? taskIdMatch[1].trim() : undefined,\n parentRef: parentRefMatch ? parentRefMatch[1].trim() : undefined,\n authorType,\n aiModel: aiModel && aiModel !== 'n/a' ? aiModel : undefined,\n promptTokens: isNaN(promptTokens) ? 0 : promptTokens,\n completionTokens: isNaN(completionTokens) ? 0 : completionTokens,\n activeTimeSeconds: isNaN(activeTimeSeconds) ? 0 : activeTimeSeconds,\n };\n}\n\n/**\n * Formats structured git trailers into text suitable for git interpret-trailers.\n */\nexport function formatCommitTrailers(trailers: Partial<CommitTrailers>): string {\n const lines: string[] = [];\n if (trailers.taskId) lines.push(`Task-ID: ${trailers.taskId}`);\n if (trailers.parentRef) lines.push(`Parent-Ref: ${trailers.parentRef}`);\n lines.push(`Author-Type: ${trailers.authorType || 'human'}`);\n lines.push(`AI-Model: ${trailers.aiModel || 'n/a'}`);\n lines.push(`Prompt-Tokens: ${trailers.promptTokens ?? 0}`);\n lines.push(`Completion-Tokens: ${trailers.completionTokens ?? 0}`);\n lines.push(`Active-Time-Seconds: ${trailers.activeTimeSeconds ?? 0}`);\n return lines.join('\\n');\n}\n\ninterface ParsedCommitChunk {\n header: string;\n body: string;\n numstatLines: string[];\n}\n\nfunction parseRawLogChunks(rawLog: string): ParsedCommitChunk[] {\n const rawCommits = rawLog.split('---AI_SDLC_COMMIT---').filter((c) => c.trim().length > 0);\n const chunks: ParsedCommitChunk[] = [];\n\n for (const raw of rawCommits) {\n const endBodyIdx = raw.indexOf('---AI_SDLC_BODY_END---');\n if (endBodyIdx === -1) continue;\n\n const beforeEnd = raw.slice(0, endBodyIdx).trimStart();\n const afterEnd = raw.slice(endBodyIdx + '---AI_SDLC_BODY_END---'.length);\n\n const firstNewline = beforeEnd.indexOf('\\n');\n const header = firstNewline === -1 ? beforeEnd : beforeEnd.slice(0, firstNewline);\n const body = firstNewline === -1 ? '' : beforeEnd.slice(firstNewline + 1);\n\n const numstatLines = afterEnd.split('\\n').filter((l) => /^\\d+\\s+\\d+\\s+/.test(l.trim()));\n chunks.push({ header, body, numstatLines });\n }\n\n return chunks;\n}\n\nfunction sumNumstatLines(lines: string[]): { added: number; deleted: number } {\n let added = 0;\n let deleted = 0;\n for (const line of lines) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length >= 2) {\n const a = parseInt(parts[0], 10);\n const d = parseInt(parts[1], 10);\n if (!isNaN(a)) added += a;\n if (!isNaN(d)) deleted += d;\n }\n }\n return { added, deleted };\n}\n\nfunction evaluateIsBugFix(subject: string, parentRef?: string): boolean {\n if (parentRef && /^(BUG|FIX)-/i.test(parentRef)) return true;\n return /^(fix|bug)(\\([^)]+\\))?:/i.test(subject.trim());\n}\n\n/**\n * Infers or estimates missing KPI metrics (tokens and active development time)\n * when not explicitly declared in commit trailers.\n */\nexport function inferMissingTrailers(\n trailers: CommitTrailers,\n linesAdded: number,\n linesDeleted: number\n): CommitTrailers {\n const result: CommitTrailers = { ...trailers };\n const linesChanged = linesAdded + linesDeleted;\n\n if (result.authorType === 'agent') {\n // If prompt and completion tokens are 0, estimate based on lines changed\n if (result.promptTokens === 0 && result.completionTokens === 0) {\n if (linesChanged > 0) {\n result.completionTokens = Math.max(linesAdded * 10, 50);\n result.promptTokens = Math.max(2500 + linesChanged * 25, 3000);\n } else {\n result.completionTokens = 0;\n result.promptTokens = 1000;\n }\n }\n // If active time is 0, estimate based on lines changed\n if (result.activeTimeSeconds === 0) {\n result.activeTimeSeconds = linesChanged > 0 ? Math.round(30 + linesChanged * 0.5) : 30;\n }\n } else {\n // Human developer: tokens are always 0, estimate active development time\n if (result.activeTimeSeconds === 0) {\n result.activeTimeSeconds = linesChanged > 0 ? Math.round(180 + linesChanged * 2) : 120;\n }\n }\n\n return result;\n}\n\n/**\n * Extracts all commit records and their KPIs in a git revision range (e.g. main..HEAD).\n */\nexport function extractCommitKpisFromRange(\n baseRef: string,\n headRef: string = 'HEAD',\n options: { cwd?: string } = {}\n): CommitKpiRecord[] {\n const cwd = options.cwd || process.cwd();\n const format = '---AI_SDLC_COMMIT---%n%H%x1f%an%x1f%ae%x1f%aI%x1f%s%n%B%n---AI_SDLC_BODY_END---';\n let rawOutput = '';\n const rangeArg = baseRef ? `${baseRef}..${headRef}` : headRef;\n try {\n rawOutput = execFileSync(\n 'git',\n ['log', rangeArg, `--format=${format}`, '--numstat'],\n { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n } catch {\n if (baseRef && !baseRef.includes('/')) {\n try {\n rawOutput = execFileSync(\n 'git',\n ['log', `origin/${baseRef}..${headRef}`, `--format=${format}`, `--numstat`],\n { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n } catch {\n return [];\n }\n } else {\n return [];\n }\n }\n\n const chunks = parseRawLogChunks(rawOutput);\n const records: CommitKpiRecord[] = [];\n\n for (const chunk of chunks) {\n const fields = chunk.header.split('\\x1f');\n if (fields.length < 5) continue;\n const sha = fields[0];\n const authorName = fields[1];\n const authorEmail = fields[2];\n const date = fields[3];\n const subject = fields[4];\n\n const rawTrailers = parseCommitTrailers(chunk.body);\n const { added, deleted } = sumNumstatLines(chunk.numstatLines);\n const trailers = inferMissingTrailers(rawTrailers, added, deleted);\n const isBugFix = evaluateIsBugFix(subject, trailers.parentRef);\n\n records.push({\n sha,\n authorName,\n authorEmail,\n date,\n subject,\n trailers,\n linesAdded: added,\n linesDeleted: deleted,\n isBugFix,\n });\n }\n\n return records;\n}\n","/**\n * AI-SDLC: Universal, IDE-Agnostic Human vs. Agent Author Detection Engine\n */\n\nimport { execFileSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface AuthorIdentity {\n authorType: 'human' | 'agent';\n model: string;\n source: string;\n confidence: 'HIGH' | 'MEDIUM' | 'LOW';\n promptTokens: number;\n completionTokens: number;\n activeTimeSeconds: number;\n}\n\nconst AGENT_ENV_MAPPINGS: Array<{ envKey: string; defaultModel: string; source: string }> = [\n { envKey: 'ANTIGRAVITY_AGENT', defaultModel: 'gemini-3.8-flash', source: 'antigravity' },\n { envKey: 'ANTIGRAVITY_CONVERSATION_ID', defaultModel: 'gemini-3.8-flash', source: 'antigravity' },\n { envKey: 'ANTIGRAVITY_AGENT_ID', defaultModel: 'gemini-3.8-flash', source: 'antigravity' },\n { envKey: 'CORTEX_SESSION_ID', defaultModel: 'antigravity-agent', source: 'cortex' },\n { envKey: 'CLAUDE_CODE', defaultModel: 'claude-3-7-sonnet', source: 'claude-code' },\n { envKey: 'CLAUDE_AGENT', defaultModel: 'claude-3-7-sonnet', source: 'claude-agent' },\n { envKey: 'CURSOR_AGENT', defaultModel: 'cursor-agent', source: 'cursor' },\n { envKey: 'CURSOR_SESSION_ID', defaultModel: 'cursor-agent', source: 'cursor' },\n { envKey: 'WINDSURF_AGENT', defaultModel: 'windsurf-cascade', source: 'windsurf' },\n { envKey: 'CASCADE_AGENT', defaultModel: 'windsurf-cascade', source: 'cascade' },\n { envKey: 'GITHUB_COPILOT_AGENT', defaultModel: 'github-copilot', source: 'copilot' },\n { envKey: 'COPILOT_AGENT_NAME', defaultModel: 'github-copilot', source: 'copilot' },\n { envKey: 'AIDER_MODEL', defaultModel: 'aider-agent', source: 'aider' },\n { envKey: 'GEMINI_CLI', defaultModel: 'gemini-1.5-pro', source: 'gemini' },\n { envKey: 'AI_AGENT_NAME', defaultModel: 'agent-developer', source: 'ai-sdlc-agent' },\n { envKey: 'AI_MODEL', defaultModel: 'agent-developer', source: 'ai-sdlc-model' },\n];\n\nconst BOT_NAME_REGEX = /\\b(bot|agent|copilot|assistant|llm|claude|gpt|cortex|gemini)\\b/i;\n\nfunction getGitConfigValue(key: string, cwd: string): string | undefined {\n try {\n const val = execFileSync('git', ['config', '--get', key], {\n cwd,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n return val.length > 0 ? val : undefined;\n } catch {\n return undefined;\n }\n}\n\ninterface TelemetrySessionData {\n model?: string;\n promptTokens?: number;\n completionTokens?: number;\n activeTimeSeconds?: number;\n}\n\nfunction readSessionTelemetry(cwd: string): TelemetrySessionData | null {\n const possiblePaths = [\n path.join(cwd, '.ai-sdlc', 'session-telemetry.json'),\n path.join(cwd, '.ai-sdlc', 'agent-session.json'),\n ];\n for (const p of possiblePaths) {\n if (fs.existsSync(p)) {\n try {\n const raw = fs.readFileSync(p, 'utf-8');\n return JSON.parse(raw) as TelemetrySessionData;\n } catch {\n // Ignore parsing errors\n }\n }\n }\n return null;\n}\n\nfunction resolveModelFromBotString(str: string): string {\n if (/claude/i.test(str)) return 'claude-3-7-sonnet';\n if (/gpt/i.test(str)) return 'gpt-4o';\n if (/copilot/i.test(str)) return 'github-copilot';\n if (/gemini/i.test(str)) return 'gemini-1.5-pro';\n if (/cortex/i.test(str)) return 'antigravity-agent';\n return 'agent-developer';\n}\n\n/**\n * Universally detects whether the current author is an AI Agent or a Human,\n * regardless of IDE (VSCode, Cursor, Windsurf, Claude Code, CLI, JetBrains).\n */\nexport function detectAuthorIdentity(\n options: { cwd?: string; env?: NodeJS.ProcessEnv } = {}\n): AuthorIdentity {\n const env = options.env || process.env;\n const cwd = options.cwd || process.cwd();\n\n // 1. Explicit Override via Environment Variable\n const explicitEnv = env.AI_SDLC_AUTHOR_TYPE || env.AUTHOR_TYPE;\n if (explicitEnv === 'human' || explicitEnv === 'agent') {\n const model = explicitEnv === 'agent' ? (env.AI_MODEL || 'agent-developer') : 'n/a';\n return {\n authorType: explicitEnv,\n model,\n source: 'explicit-env',\n confidence: 'HIGH',\n promptTokens: 0,\n completionTokens: 0,\n activeTimeSeconds: 0,\n };\n }\n\n // 2. Explicit Git Config (git config ai-sdlc.author-type [human|agent])\n const gitConfigType = getGitConfigValue('ai-sdlc.author-type', cwd);\n if (gitConfigType === 'human' || gitConfigType === 'agent') {\n const gitConfigModel = getGitConfigValue('ai-sdlc.model', cwd) || (gitConfigType === 'agent' ? 'agent-developer' : 'n/a');\n return {\n authorType: gitConfigType,\n model: gitConfigModel,\n source: 'git-config',\n confidence: 'HIGH',\n promptTokens: 0,\n completionTokens: 0,\n activeTimeSeconds: 0,\n };\n }\n\n // 3. Local Session Telemetry File (.ai-sdlc/session-telemetry.json)\n const telemetry = readSessionTelemetry(cwd);\n if (telemetry) {\n const model = telemetry.model || env.AI_MODEL || 'agent-developer';\n return {\n authorType: 'agent',\n model,\n source: 'session-telemetry-file',\n confidence: 'HIGH',\n promptTokens: telemetry.promptTokens || 0,\n completionTokens: telemetry.completionTokens || 0,\n activeTimeSeconds: telemetry.activeTimeSeconds || 0,\n };\n }\n\n // 4. IDE & Toolchain Environment Variables\n for (const mapping of AGENT_ENV_MAPPINGS) {\n const envVal = env[mapping.envKey];\n if (envVal && envVal !== '0' && envVal !== 'false') {\n const model = env.AI_MODEL || (mapping.envKey === 'AIDER_MODEL' ? envVal : mapping.defaultModel);\n return {\n authorType: 'agent',\n model,\n source: `env-${mapping.source}`,\n confidence: 'HIGH',\n promptTokens: parseInt(env.PROMPT_TOKENS || '0', 10) || 0,\n completionTokens: parseInt(env.COMPLETION_TOKENS || '0', 10) || 0,\n activeTimeSeconds: parseInt(env.ACTIVE_TIME_SECONDS || env.ACTIVE_TIME_SEC || '0', 10) || 0,\n };\n }\n }\n\n // 5. Git Author / Committer Signature Inspection\n const authorName = env.GIT_AUTHOR_NAME || getGitConfigValue('user.name', cwd) || '';\n const authorEmail = env.GIT_AUTHOR_EMAIL || getGitConfigValue('user.email', cwd) || '';\n\n if (BOT_NAME_REGEX.test(authorName) || BOT_NAME_REGEX.test(authorEmail)) {\n const inferredModel = resolveModelFromBotString(`${authorName} ${authorEmail}`);\n return {\n authorType: 'agent',\n model: inferredModel,\n source: 'git-user-signature',\n confidence: 'MEDIUM',\n promptTokens: 0,\n completionTokens: 0,\n activeTimeSeconds: 0,\n };\n }\n\n // 6. Default Fallback: Human Developer\n return {\n authorType: 'human',\n model: 'n/a',\n source: 'default-human',\n confidence: 'HIGH',\n promptTokens: 0,\n completionTokens: 0,\n activeTimeSeconds: 0,\n };\n}\n","/**\n * AI-SDLC: Automated Git Hook Installer for Commit Trailers\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface HookInstallResult {\n success: boolean;\n hookPath?: string;\n error?: string;\n}\n\nexport const PREPARE_COMMIT_MSG_SCRIPT = `#!/usr/bin/env bash\n# ==============================================================================\n# AI-SDLC: Automated Commit Trailers Injection Hook\n# ==============================================================================\n\nCOMMIT_MSG_FILE=$1\nCOMMIT_SOURCE=$2\n\n# Bypass if this is an automated merge commit\nif [ \"$COMMIT_SOURCE\" = \"merge\" ]; then\n exit 0\nfi\n\nCURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo \"\")\nif [ -z \"$CURRENT_BRANCH\" ]; then\n exit 0\nfi\n\n# Extract Task-ID and Parent-Ref from 4-tier branch hierarchy\n# Patterns: task/<PARENT-ID>/<TSK-ID>-slug | feat/<FEAT-ID>-slug | bug/<BUG-ID>-slug\nTASK_ID=$(echo \"$CURRENT_BRANCH\" | grep -oE \"TSK-[0-9A-Za-z-]+\" || echo \"\")\nPARENT_REF=$(echo \"$CURRENT_BRANCH\" | grep -oE \"(CHG|FEAT|BUG|FIX|PATCH)-[0-9A-Za-z-]+\" | head -n 1 || echo \"\")\n\nTELEMETRY_FILE=\".ai-sdlc/session-telemetry.json\"\nAUTHOR_TYPE=\"human\"\nAI_MODEL_NAME=\"n/a\"\nPROMPT_TOKENS=0\nCOMPLETION_TOKENS=0\nACTIVE_TIME_SEC=0\n\n# Execute universal IDE-agnostic author detection engine\nDETECTED=$(node packages/cli/bin/aisdlc.js git detect-author 2>/dev/null || npx aisdlc git detect-author 2>/dev/null || node -e \"try { const { detectAuthorIdentity } = require('@aisdlc/core'); const id = detectAuthorIdentity(); console.log([id.authorType, id.model, id.promptTokens, id.completionTokens, id.activeTimeSeconds].join('|')); } catch {}\" 2>/dev/null || echo \"\")\n\nif [ -n \"$DETECTED\" ]; then\n IFS='|' read -r DET_AUTHOR DET_MODEL DET_PROMPT DET_COMPL DET_TIME <<< \"$DETECTED\"\n AUTHOR_TYPE=\"\\${DET_AUTHOR:-\\$AUTHOR_TYPE}\"\n AI_MODEL_NAME=\"\\${DET_MODEL:-\\$AI_MODEL_NAME}\"\n PROMPT_TOKENS=\"\\${DET_PROMPT:-\\$PROMPT_TOKENS}\"\n COMPLETION_TOKENS=\"\\${DET_COMPL:-\\$COMPLETION_TOKENS}\"\n ACTIVE_TIME_SEC=\"\\${DET_TIME:-\\$ACTIVE_TIME_SEC}\"\nelse\n if [ -n \"$AI_MODEL\" ] || [ -n \"$AI_AGENT_NAME\" ] || [ -n \"$ANTIGRAVITY_AGENT\" ] || [ -n \"$ANTIGRAVITY_AGENT_ID\" ] || [ -n \"$ANTIGRAVITY_CONVERSATION_ID\" ] || [ -n \"$CLAUDE_CODE\" ] || [ -n \"$CURSOR_AGENT\" ] || [ -n \"$WINDSURF_AGENT\" ] || [ -n \"$AIDER_MODEL\" ] || [ -f \"$TELEMETRY_FILE\" ]; then\n AUTHOR_TYPE=\"agent\"\n AI_MODEL_NAME=\"\\${AI_MODEL:-\\${AI_AGENT_NAME:-\\${AIDER_MODEL:-agent-developer}}}\"\n fi\nfi\n\n# Estimate tokens and active time if not provided for agent\nif [ \"\\$PROMPT_TOKENS\" = \"0\" ] && [ \"\\$AUTHOR_TYPE\" = \"agent\" ]; then\n CHG_LINES=\\$(git diff --cached --shortstat 2>/dev/null | grep -oE '[0-9]+ (insertion|deletion)' | awk '{s+=\\$1} END {print s+0}')\n if [ -n \"\\$CHG_LINES\" ] && [ \"\\$CHG_LINES\" -gt 0 ]; then\n COMPLETION_TOKENS=\\$((CHG_LINES * 10))\n PROMPT_TOKENS=\\$((2500 + CHG_LINES * 25))\n ACTIVE_TIME_SEC=\\$((30 + CHG_LINES / 2))\n else\n PROMPT_TOKENS=1000\n COMPLETION_TOKENS=0\n ACTIVE_TIME_SEC=30\n fi\nfi\n\n# Inject missing trailers individually into the commit message\nTRAILERS_TO_ADD=\"\"\n\nif [ -n \"$TASK_ID\" ] && ! grep -qE \"^Task-ID:\" \"$COMMIT_MSG_FILE\" 2>/dev/null; then\n TRAILERS_TO_ADD=\"\\${TRAILERS_TO_ADD}Task-ID: $TASK_ID\\n\"\nfi\nif [ -n \"$PARENT_REF\" ] && ! grep -qE \"^Parent-Ref:\" \"$COMMIT_MSG_FILE\" 2>/dev/null; then\n TRAILERS_TO_ADD=\"\\${TRAILERS_TO_ADD}Parent-Ref: $PARENT_REF\\n\"\nfi\nif ! grep -qE \"^Author-Type:\" \"$COMMIT_MSG_FILE\" 2>/dev/null; then\n TRAILERS_TO_ADD=\"\\${TRAILERS_TO_ADD}Author-Type: $AUTHOR_TYPE\\n\"\nfi\nif [ \"$AUTHOR_TYPE\" = \"agent\" ] && ! grep -qE \"^AI-Model:\" \"$COMMIT_MSG_FILE\" 2>/dev/null; then\n TRAILERS_TO_ADD=\"\\${TRAILERS_TO_ADD}AI-Model: $AI_MODEL_NAME\\n\"\nfi\nif ! grep -qE \"^Prompt-Tokens:\" \"$COMMIT_MSG_FILE\" 2>/dev/null; then\n TRAILERS_TO_ADD=\"\\${TRAILERS_TO_ADD}Prompt-Tokens: $PROMPT_TOKENS\\n\"\nfi\nif ! grep -qE \"^Completion-Tokens:\" \"$COMMIT_MSG_FILE\" 2>/dev/null; then\n TRAILERS_TO_ADD=\"\\${TRAILERS_TO_ADD}Completion-Tokens: $COMPLETION_TOKENS\\n\"\nfi\nif ! grep -qE \"^Active-Time-Seconds:\" \"$COMMIT_MSG_FILE\" 2>/dev/null; then\n TRAILERS_TO_ADD=\"\\${TRAILERS_TO_ADD}Active-Time-Seconds: $ACTIVE_TIME_SEC\\n\"\nfi\n\nif [ -n \"$TRAILERS_TO_ADD\" ]; then\n echo \"\" >> \"$COMMIT_MSG_FILE\"\n printf \"$TRAILERS_TO_ADD\" >> \"$COMMIT_MSG_FILE\"\nfi\n\nif [ -f \"$TELEMETRY_FILE\" ]; then\n rm -f \"$TELEMETRY_FILE\" 2>/dev/null || true\nfi\n`;\n\n/**\n * Installs the AI-SDLC prepare-commit-msg hook in .git/hooks.\n */\nexport function installGitHooks(rootDir: string = process.cwd()): HookInstallResult {\n const gitDir = path.join(rootDir, '.git');\n if (!fs.existsSync(gitDir)) {\n return {\n success: false,\n error: `No se encontró el directorio Git en '${gitDir}'.`,\n };\n }\n\n const hooksDir = path.join(gitDir, 'hooks');\n if (!fs.existsSync(hooksDir)) {\n fs.mkdirSync(hooksDir, { recursive: true });\n }\n\n const hookPath = path.join(hooksDir, 'prepare-commit-msg');\n try {\n fs.writeFileSync(hookPath, PREPARE_COMMIT_MSG_SCRIPT, { encoding: 'utf-8', mode: 0o755 });\n return {\n success: true,\n hookPath,\n };\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n error: `Error al escribir el hook en '${hookPath}': ${msg}`,\n };\n }\n}\n","/**\n * AI-SDLC: Pull Request KPI Aggregator & Reporter\n */\n\nimport { CommitKpiRecord, extractCommitKpisFromRange } from '../git/trailers.js';\n\nexport interface AuthorKpiSummary {\n commits: number;\n linesAdded: number;\n linesDeleted: number;\n activeTimeSeconds: number;\n promptTokens: number;\n completionTokens: number;\n estimatedCostUsd: number;\n}\n\nexport interface PrKpiAggregation {\n baseRef: string;\n headRef: string;\n totalCommits: number;\n linesAdded: number;\n linesDeleted: number;\n totalActiveTimeSeconds: number;\n totalPromptTokens: number;\n totalCompletionTokens: number;\n totalTokens: number;\n estimatedCostUsd: number;\n humanSummary: AuthorKpiSummary;\n byModel: Record<string, AuthorKpiSummary>;\n isBugPr: boolean;\n commitRecords: CommitKpiRecord[];\n}\n\nexport const KPI_SUMMARY_START_TAG = '<!-- AI-SDLC-KPI-SUMMARY-START -->';\nexport const KPI_SUMMARY_END_TAG = '<!-- AI-SDLC-KPI-SUMMARY-END -->';\n\nfunction calculateEstimatedCost(promptTokens: number, completionTokens: number): number {\n const promptCost = (promptTokens / 1_000_000) * 3.0;\n const completionCost = (completionTokens / 1_000_000) * 15.0;\n return Math.round((promptCost + completionCost) * 10000) / 10000;\n}\n\nfunction createEmptySummary(): AuthorKpiSummary {\n return {\n commits: 0,\n linesAdded: 0,\n linesDeleted: 0,\n activeTimeSeconds: 0,\n promptTokens: 0,\n completionTokens: 0,\n estimatedCostUsd: 0,\n };\n}\n\nfunction accumulateRecord(target: AuthorKpiSummary, record: CommitKpiRecord): void {\n target.commits += 1;\n target.linesAdded += record.linesAdded;\n target.linesDeleted += record.linesDeleted;\n target.activeTimeSeconds += record.trailers.activeTimeSeconds;\n target.promptTokens += record.trailers.promptTokens;\n target.completionTokens += record.trailers.completionTokens;\n target.estimatedCostUsd = calculateEstimatedCost(target.promptTokens, target.completionTokens);\n}\n\n/**\n * Aggregates all commit KPIs in the revision range of a Pull Request.\n */\nexport function aggregatePrKpis(\n baseRef: string,\n headRef: string = 'HEAD',\n options: { cwd?: string } = {}\n): PrKpiAggregation {\n const records = extractCommitKpisFromRange(baseRef, headRef, options);\n const humanSummary = createEmptySummary();\n const byModel: Record<string, AuthorKpiSummary> = {};\n\n let totalLinesAdded = 0;\n let totalLinesDeleted = 0;\n let totalActiveTime = 0;\n let totalPrompt = 0;\n let totalCompletion = 0;\n let isBugPr = false;\n\n for (const record of records) {\n totalLinesAdded += record.linesAdded;\n totalLinesDeleted += record.linesDeleted;\n totalActiveTime += record.trailers.activeTimeSeconds;\n totalPrompt += record.trailers.promptTokens;\n totalCompletion += record.trailers.completionTokens;\n if (record.isBugFix) isBugPr = true;\n\n if (record.trailers.authorType === 'agent') {\n const modelName = record.trailers.aiModel || 'agent-generic';\n if (!byModel[modelName]) {\n byModel[modelName] = createEmptySummary();\n }\n accumulateRecord(byModel[modelName], record);\n } else {\n accumulateRecord(humanSummary, record);\n }\n }\n\n return {\n baseRef,\n headRef,\n totalCommits: records.length,\n linesAdded: totalLinesAdded,\n linesDeleted: totalLinesDeleted,\n totalActiveTimeSeconds: totalActiveTime,\n totalPromptTokens: totalPrompt,\n totalCompletionTokens: totalCompletion,\n totalTokens: totalPrompt + totalCompletion,\n estimatedCostUsd: calculateEstimatedCost(totalPrompt, totalCompletion),\n humanSummary,\n byModel,\n isBugPr,\n commitRecords: records,\n };\n}\n\nfunction formatMinutes(seconds: number): string {\n const mins = Math.round(seconds / 60);\n return mins > 0 ? `${mins} min` : `${seconds}s`;\n}\n\n/**\n * Formats the KPI aggregation into a standardized Markdown summary table.\n */\nexport function formatPrKpiMarkdown(kpi: PrKpiAggregation): string {\n const models = Object.keys(kpi.byModel);\n const modelHeaders = models.map((m) => `Agent (${m})`).join(' | ');\n const modelSeparator = models.map(() => ':---:').join(' | ');\n\n const headers = `| Metric | Human |${models.length > 0 ? ` ${modelHeaders} |` : ''} Total PR |`;\n const sep = `| :--- | :---: |${models.length > 0 ? ` ${modelSeparator} |` : ''} :---: |`;\n\n const human = kpi.humanSummary;\n const commitCols = models.map((m) => kpi.byModel[m].commits).join(' | ');\n const linesCols = models.map((m) => `+${kpi.byModel[m].linesAdded} / -${kpi.byModel[m].linesDeleted}`).join(' | ');\n const timeCols = models.map((m) => formatMinutes(kpi.byModel[m].activeTimeSeconds)).join(' | ');\n const tokenCols = models.map((m) => `${(kpi.byModel[m].promptTokens + kpi.byModel[m].completionTokens).toLocaleString('en-US')}`).join(' | ');\n const costCols = models.map((m) => `$${kpi.byModel[m].estimatedCostUsd.toFixed(2)}`).join(' | ');\n\n const totalLines = `+${kpi.linesAdded} / -${kpi.linesDeleted}`;\n const totalTime = formatMinutes(kpi.totalActiveTimeSeconds);\n const totalTokensStr = `${kpi.totalTokens.toLocaleString('en-US')} tokens`;\n const totalCostStr = `$${kpi.estimatedCostUsd.toFixed(2)} USD`;\n\n const rows = [\n `| **Commits** | ${human.commits} |${models.length > 0 ? ` ${commitCols} |` : ''} **${kpi.totalCommits}** |`,\n `| **Lines Added / Deleted** | +${human.linesAdded} / -${human.linesDeleted} |${models.length > 0 ? ` ${linesCols} |` : ''} **${totalLines}** |`,\n `| **Active Development Time** | ${formatMinutes(human.activeTimeSeconds)} |${models.length > 0 ? ` ${timeCols} |` : ''} **${totalTime}** |`,\n `| **Tokens Consumed (In+Out)** | 0 |${models.length > 0 ? ` ${tokenCols} |` : ''} **${totalTokensStr}** |`,\n `| **Estimated Cost (USD)** | — (Human labor) |${models.length > 0 ? ` ${costCols} |` : ''} **${totalCostStr}** |`,\n ];\n\n return [\n KPI_SUMMARY_START_TAG,\n '### 📊 AI-SDLC: Aggregated PR KPI Summary',\n '',\n headers,\n sep,\n ...rows,\n '',\n `> **Branch Attribution:** ${kpi.isBugPr ? '🚨 *Defect Fix / Bugfix*' : '✨ *New Feature*'} (Range: \\`${kpi.baseRef}..${kpi.headRef}\\`)`,\n KPI_SUMMARY_END_TAG,\n ].join('\\n');\n}\n\n/**\n * Injects or updates the KPI table in the body of a Pull Request.\n */\nexport function injectKpisIntoPrBody(originalBody: string, kpiMarkdown: string): string {\n const body = originalBody || '';\n const startIndex = body.indexOf(KPI_SUMMARY_START_TAG);\n const endIndex = body.indexOf(KPI_SUMMARY_END_TAG);\n\n if (startIndex !== -1 && endIndex !== -1) {\n const before = body.slice(0, startIndex);\n const after = body.slice(endIndex + KPI_SUMMARY_END_TAG.length);\n return `${before.trimEnd()}\\n\\n${kpiMarkdown}\\n\\n${after.trimStart()}`.trim();\n }\n\n return `${body.trimEnd()}\\n\\n${kpiMarkdown}\\n`;\n}\n","/**\n * AI-SDLC: Release Consolidated KPIs & Defect Attribution Engine\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { CommitKpiRecord, extractCommitKpisFromRange } from '../git/trailers.js';\n\nexport interface ModelDefectStats {\n authorOrModel: string;\n isAgent: boolean;\n commits: number;\n linesAdded: number;\n linesDeleted: number;\n klocProduced: number;\n bugsInjected: number;\n defectInjectionRate: number;\n totalTimeSeconds: number;\n totalTokens: number;\n estimatedCostUsd: number;\n}\n\nexport interface BugRecordSummary {\n sha: string;\n subject: string;\n author: string;\n parentRef?: string;\n timeSeconds: number;\n tokens: number;\n}\n\nexport interface ReleaseKpiReport {\n releaseBranch: string;\n baseBranch: string;\n generatedAt: string;\n totalCommits: number;\n totalLinesAdded: number;\n totalLinesDeleted: number;\n totalKloc: number;\n totalBugs: number;\n globalDefectDensity: number;\n totalTimeSeconds: number;\n totalTokens: number;\n totalCostUsd: number;\n reworkTimeSeconds: number;\n reworkTokens: number;\n reworkCostUsd: number;\n reworkTimePercent: number;\n reworkTokensPercent: number;\n reworkCostPercent: number;\n authorStats: ModelDefectStats[];\n bugList: BugRecordSummary[];\n}\n\nfunction calculateCost(prompt: number, completion: number): number {\n const promptCost = (prompt / 1_000_000) * 3.0;\n const completionCost = (completion / 1_000_000) * 15.0;\n return Math.round((promptCost + completionCost) * 10000) / 10000;\n}\n\nfunction resolveAuthorKey(record: CommitKpiRecord): { key: string; isAgent: boolean } {\n if (record.trailers.authorType === 'agent') {\n return { key: record.trailers.aiModel || 'agent-generic', isAgent: true };\n }\n return { key: `Human (${record.authorName || 'developer'})`, isAgent: false };\n}\n\nfunction createEmptyModelStats(key: string, isAgent: boolean): ModelDefectStats {\n return {\n authorOrModel: key,\n isAgent,\n commits: 0,\n linesAdded: 0,\n linesDeleted: 0,\n klocProduced: 0,\n bugsInjected: 0,\n defectInjectionRate: 0,\n totalTimeSeconds: 0,\n totalTokens: 0,\n estimatedCostUsd: 0,\n };\n}\n\n/**\n * Aggregates all commits in a release branch relative to base (e.g. main..release/vX.Y.Z).\n */\nexport function aggregateReleaseKpis(\n releaseBranch: string,\n baseBranch: string = 'main',\n options: { cwd?: string } = {}\n): ReleaseKpiReport {\n const records = extractCommitKpisFromRange(baseBranch, releaseBranch, options);\n const statsMap: Record<string, ModelDefectStats> = {};\n const bugList: BugRecordSummary[] = [];\n\n let totalLinesAdded = 0;\n let totalLinesDeleted = 0;\n let totalTime = 0;\n let totalTokens = 0;\n let reworkTime = 0;\n let reworkTokens = 0;\n\n for (const record of records) {\n const { key, isAgent } = resolveAuthorKey(record);\n if (!statsMap[key]) {\n statsMap[key] = createEmptyModelStats(key, isAgent);\n }\n const stat = statsMap[key];\n stat.commits += 1;\n stat.linesAdded += record.linesAdded;\n stat.linesDeleted += record.linesDeleted;\n stat.totalTimeSeconds += record.trailers.activeTimeSeconds;\n const tokens = record.trailers.promptTokens + record.trailers.completionTokens;\n stat.totalTokens += tokens;\n\n totalLinesAdded += record.linesAdded;\n totalLinesDeleted += record.linesDeleted;\n totalTime += record.trailers.activeTimeSeconds;\n totalTokens += tokens;\n\n if (record.isBugFix) {\n stat.bugsInjected += 1;\n reworkTime += record.trailers.activeTimeSeconds;\n reworkTokens += tokens;\n bugList.push({\n sha: record.sha.slice(0, 8),\n subject: record.subject,\n author: key,\n parentRef: record.trailers.parentRef,\n timeSeconds: record.trailers.activeTimeSeconds,\n tokens,\n });\n }\n }\n\n const authorStats = Object.values(statsMap).map((stat) => {\n stat.klocProduced = Math.round(((stat.linesAdded + stat.linesDeleted) / 1000) * 100) / 100;\n stat.defectInjectionRate = stat.klocProduced > 0\n ? Math.round((stat.bugsInjected / stat.klocProduced) * 100) / 100\n : stat.bugsInjected;\n stat.estimatedCostUsd = calculateCost(stat.totalTokens * 0.8, stat.totalTokens * 0.2);\n return stat;\n });\n\n const totalKloc = Math.round(((totalLinesAdded + totalLinesDeleted) / 1000) * 100) / 100;\n const totalBugs = bugList.length;\n const globalDefectDensity = totalKloc > 0 ? Math.round((totalBugs / totalKloc) * 100) / 100 : totalBugs;\n const totalCostUsd = calculateCost(totalTokens * 0.8, totalTokens * 0.2);\n const reworkCostUsd = calculateCost(reworkTokens * 0.8, reworkTokens * 0.2);\n\n const reworkTimePercent = totalTime > 0 ? Math.round((reworkTime / totalTime) * 10000) / 100 : 0;\n const reworkTokensPercent = totalTokens > 0 ? Math.round((reworkTokens / totalTokens) * 10000) / 100 : 0;\n const reworkCostPercent = totalCostUsd > 0 ? Math.round((reworkCostUsd / totalCostUsd) * 10000) / 100 : 0;\n\n return {\n releaseBranch,\n baseBranch,\n generatedAt: new Date().toISOString(),\n totalCommits: records.length,\n totalLinesAdded,\n totalLinesDeleted,\n totalKloc,\n totalBugs,\n globalDefectDensity,\n totalTimeSeconds: totalTime,\n totalTokens,\n totalCostUsd,\n reworkTimeSeconds: reworkTime,\n reworkTokens,\n reworkCostUsd,\n reworkTimePercent,\n reworkTokensPercent,\n reworkCostPercent,\n authorStats,\n bugList,\n };\n}\n\nfunction formatHours(seconds: number): string {\n const hours = (seconds / 3600).toFixed(1);\n return `${hours}h (${Math.round(seconds / 60)} min)`;\n}\n\n/**\n * Formats the Release KPI Report into standardized Markdown documentation.\n */\nexport function formatReleaseKpiMarkdown(report: ReleaseKpiReport): string {\n const authorRows = report.authorStats.map((stat) => {\n return `| **${stat.authorOrModel}** | ${stat.commits} | ${stat.klocProduced} | ${stat.bugsInjected} | **${stat.defectInjectionRate}** | ${formatHours(stat.totalTimeSeconds)} | ${stat.totalTokens.toLocaleString('en-US')} | $${stat.estimatedCostUsd.toFixed(2)} |`;\n });\n\n const bugRows = report.bugList.length > 0\n ? report.bugList.map((b) => `| \\`${b.sha}\\` | ${b.subject} | ${b.author} | ${b.parentRef || 'N/A'} | ${Math.round(b.timeSeconds / 60)} min | ${b.tokens.toLocaleString('en-US')} |`)\n : ['| — | *No defects detected in this cycle* | — | — | 0 min | 0 |'];\n\n return [\n `# 📈 Consolidated Release KPI Report: \\`${report.releaseBranch}\\``,\n '',\n `> **Baseline:** \\`${report.baseBranch}\\` ➔ \\`${report.releaseBranch}\\``,\n `> **Audit Date:** ${report.generatedAt}`,\n `> **Total Volume:** ${report.totalCommits} commits | ${report.totalKloc} KLoC (+${report.totalLinesAdded} / -${report.totalLinesDeleted})`,\n `> **Global Defect Density:** **${report.globalDefectDensity} bugs / KLoC** (${report.totalBugs} confirmed bugs)`,\n '',\n '---',\n '',\n '## 1. Authorship Distribution, Volume, and Defect Injection Rate (DIR)',\n '',\n '| Entity / Model | Commits | KLoC | Bugs | DIR (Bugs/KLoC) | Total Time | Tokens | Est. Cost ($) |',\n '| :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: |',\n ...authorRows,\n `| **TOTAL RELEASE** | **${report.totalCommits}** | **${report.totalKloc}** | **${report.totalBugs}** | **${report.globalDefectDensity}** | **${formatHours(report.totalTimeSeconds)}** | **${report.totalTokens.toLocaleString('en-US')}** | **$${report.totalCostUsd.toFixed(2)} USD** |`,\n '',\n '---',\n '',\n '## 2. Bug Rework Cost vs. Total Release Cost',\n '',\n '| Cost Dimension | Total Release Investment | Invested in Bug Fixes | Rework Cost Ratio | Observational Status |',\n '| :--- | :---: | :---: | :---: | :---: |',\n `| **Cycle Time** | ${formatHours(report.totalTimeSeconds)} | ${formatHours(report.reworkTimeSeconds)} | **${report.reworkTimePercent}%** | ${report.reworkTimePercent <= 10 ? '🟢 OPTIMAL (≤10%)' : '🟡 ALERT (>10%)'} |`,\n `| **AI Tokens** | ${report.totalTokens.toLocaleString('en-US')} tokens | ${report.reworkTokens.toLocaleString('en-US')} tokens | **${report.reworkTokensPercent}%** | ${report.reworkTokensPercent <= 10 ? '🟢 OPTIMAL (≤10%)' : '🟡 ALERT (>10%)'} |`,\n `| **Computational Cost ($)** | $${report.totalCostUsd.toFixed(2)} USD | $${report.reworkCostUsd.toFixed(2)} USD | **${report.reworkCostPercent}%** | ${report.reworkCostPercent <= 10 ? '🟢 OPTIMAL (≤10%)' : '🟡 ALERT (>10%)'} |`,\n '',\n '---',\n '',\n '## 3. Defects and Fix Commits Breakdown',\n '',\n '| Commit SHA | Description | Attribution | Reference | Fix Time | Fix Tokens |',\n '| :--- | :--- | :--- | :--- | :---: | :---: |',\n ...bugRows,\n ].join('\\n');\n}\n\n/**\n * Writes the release KPI report to reports/releases/ as Markdown and JSON.\n */\nexport function writeReleaseKpiReport(\n report: ReleaseKpiReport,\n options: { outputDir?: string } = {}\n): { markdownPath: string; jsonPath: string } {\n const root = options.outputDir || path.join(process.cwd(), 'reports', 'releases');\n if (!fs.existsSync(root)) {\n fs.mkdirSync(root, { recursive: true });\n }\n\n const cleanBranchName = report.releaseBranch.replace(/[^a-zA-Z0-9.-]/g, '_');\n const mdPath = path.join(root, `RELEASE_KPIS_${cleanBranchName}.md`);\n const jsonPath = path.join(root, `release_${cleanBranchName}.kpis.json`);\n\n const mdContent = formatReleaseKpiMarkdown(report);\n fs.writeFileSync(mdPath, mdContent, 'utf-8');\n fs.writeFileSync(jsonPath, JSON.stringify(report, null, 2), 'utf-8');\n\n return { markdownPath: mdPath, jsonPath };\n}\n","/**\n * AI-SDLC: Cytoscape.js Standalone Bundle Provider\n * Resolves and provides the minified Cytoscape.js library for offline, self-contained dashboard generation.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { createRequire } from 'module';\n\nlet cachedScript: string | null = null;\n\nconst FALLBACK_CDN_URL = 'https://cdnjs.cloudflare.com/ajax/libs/cytoscape/3.34.3/cytoscape.min.js';\n\n/**\n * Resolves the physical path of cytoscape.min.js from the package.\n */\nexport function resolveCytoscapePath(): string | null {\n try {\n const req = createRequire(import.meta.url);\n const entryPath = req.resolve('cytoscape');\n const dir = path.dirname(entryPath);\n const minPath = path.join(dir, 'cytoscape.min.js');\n if (fs.existsSync(minPath)) {\n return minPath;\n }\n } catch {\n // Fall through to secondary search\n }\n\n // Fallback check in current or parent node_modules\n const searchDirs = [\n path.join(process.cwd(), 'node_modules', 'cytoscape', 'dist', 'cytoscape.min.js'),\n path.join(process.cwd(), 'packages', 'core', 'node_modules', 'cytoscape', 'dist', 'cytoscape.min.js'),\n ];\n\n for (const candidate of searchDirs) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\n/**\n * Returns the raw Cytoscape.js script content for direct inlining in standalone HTML.\n */\nexport function getCytoscapeScript(): string {\n if (cachedScript) {\n return cachedScript;\n }\n\n const scriptPath = resolveCytoscapePath();\n if (scriptPath) {\n try {\n cachedScript = fs.readFileSync(scriptPath, 'utf-8');\n return cachedScript;\n } catch {\n // Fallback\n }\n }\n\n // Graceful fallback script loader if local resolution is not found\n cachedScript = `/* Cytoscape.js CDN Fallback Loader */\n(function() {\n if (typeof window.cytoscape === 'undefined') {\n var s = document.createElement('script');\n s.src = '${FALLBACK_CDN_URL}';\n s.async = false;\n document.head.appendChild(s);\n }\n})();`;\n\n return cachedScript;\n}\n","/**\n * AI-SDLC: Interactive Web Dashboard & Cytoscape Graph Generator\n * Compiles PDaC Graph, RTM 360° Matrix, Quality Gate metrics, and KPI telemetry into\n * a standalone, zero-infrastructure, offline-ready HTML dashboard (reports/dashboard.html).\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { execFileSync } from 'child_process';\nimport yaml from 'js-yaml';\nimport {\n CytoscapeEdgeData,\n CytoscapeElement,\n CytoscapeNodeData,\n DashboardHistoricalKpi,\n DashboardOptions,\n DashboardResult,\n GraphNodeLayer,\n GraphNodeStatus,\n} from '../types/index.js';\nimport { ReleaseKpiReport } from './release-kpis.js';\nimport { verifyPdacGraph } from '../verifiers/pdac-graph.js';\nimport { verifyTraceability } from '../verifiers/traceability.js';\nimport { verifyQualityGate } from '../verifiers/quality-gate.js';\nimport { verifyTasksGovernance } from '../verifiers/governance.js';\nimport { verifyTestingCoverage } from '../verifiers/testing-coverage.js';\nimport { walkMdFiles } from '../utils/fs.js';\nimport { aggregatePrKpis } from './pr-kpis.js';\nimport { getCytoscapeScript } from './cytoscape-bundle.js';\nimport { readCodeCoverageSummary } from './quality-report.js';\n\nexport interface GraphElementsResult {\n elements: CytoscapeElement[];\n nodesByLayer: Record<GraphNodeLayer, number>;\n conformingCount: number;\n issueCount: number;\n}\n\n/**\n * Builds the graph elements (nodes & edges) for Cytoscape.js.\n */\nexport function buildGraphElements(rootDir: string = process.cwd()): GraphElementsResult {\n const pdac = verifyPdacGraph({ rootDir });\n const trace = verifyTraceability({ rootDir });\n\n const nodeMap = new Map<string, CytoscapeNodeData>();\n const edges: CytoscapeEdgeData[] = [];\n const edgeKeySet = new Set<string>();\n const driftTargets = new Set(pdac.drifts.map((d) => d.targetId));\n\n function addEdge(e: CytoscapeEdgeData) {\n const key = `${e.source}->${e.target}:${e.relation}`;\n if (!edgeKeySet.has(key)) {\n edgeKeySet.add(key);\n edges.push(e);\n }\n }\n\n // 1. Process PDaC Baseline Nodes (Drifts)\n for (const n of pdac.drifts) {\n driftTargets.add(n.targetId);\n }\n\n // 2. Scan and catalog workspace artifacts (product, security, architecture, specs)\n interface ScannedArtifact {\n id: string;\n type: string;\n title: string;\n layer: GraphNodeLayer;\n filePath: string;\n content: string;\n frontmatter: Record<string, any>;\n }\n\n const scannedArtifactsMap = new Map<string, ScannedArtifact>();\n const artifactDirs = ['product', 'architecture', 'specs', 'security'];\n for (const dirName of artifactDirs) {\n const fullDirPath = path.join(rootDir, dirName);\n if (fs.existsSync(fullDirPath)) {\n const files = walkMdFiles(fullDirPath);\n for (const f of files) {\n try {\n const fileContent = fs.readFileSync(f, 'utf-8');\n const relPath = path.relative(rootDir, f).replace(/\\\\/g, '/');\n const match = fileContent.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) continue;\n let fm: Record<string, any> = {};\n try {\n fm = (yaml.load(match[1]) as Record<string, any>) || {};\n } catch {\n continue;\n }\n\n const id = typeof fm.id === 'string' ? fm.id.trim() : undefined;\n if (!id) continue;\n\n let type = typeof fm.type === 'string' ? fm.type.trim() : '';\n let layer: GraphNodeLayer = 'product';\n\n if (id.startsWith('JRN-') || type === 'journey') {\n type = 'journey';\n layer = 'product';\n } else if (id.startsWith('ACT-THREAT-') || type === 'threat-actor') {\n type = 'threat-actor';\n layer = 'product';\n } else if (id.startsWith('ACT-') || type === 'actor') {\n type = 'actor';\n layer = 'product';\n } else if (id.startsWith('UC-') || type === 'use-case' || type === 'usecase') {\n type = 'use-case';\n layer = 'product';\n } else if (id.startsWith('BR-') || type === 'business-rule' || type === 'rule') {\n type = 'business-rule';\n layer = 'product';\n } else if (id.startsWith('ABUSE-') || type === 'abuse-case') {\n type = 'abuse-case';\n layer = 'product';\n } else if (id.startsWith('HAZ-') || type === 'hazard') {\n type = 'hazard';\n layer = 'product';\n } else if (id.startsWith('SEC-ENC-') || type === 'security-enclave') {\n type = 'security-enclave';\n layer = 'architecture';\n } else if (id.startsWith('CMP-') || type === 'component') {\n type = 'component';\n layer = 'architecture';\n } else if (id.startsWith('ADR-') || type === 'architecture-decision-record' || type === 'adr') {\n type = 'adr';\n layer = 'architecture';\n } else if (id.startsWith('SEC-REQ-') || type === 'security-requirement') {\n type = 'security-requirement';\n layer = 'requirement';\n } else if (id.startsWith('FR-') || id.startsWith('QR-') || id.startsWith('CON-') || type === 'requirement') {\n type = 'requirement';\n layer = 'requirement';\n } else {\n type = type || 'product';\n layer = 'product';\n }\n\n const title = typeof fm.title === 'string' ? fm.title.trim() : id;\n const content = fileContent.replace(/^---\\r?\\n[\\s\\S]*?\\r?\\n---/, '').trim();\n\n scannedArtifactsMap.set(id, {\n id,\n type,\n title,\n layer,\n filePath: relPath,\n content,\n frontmatter: fm,\n });\n } catch {\n // Ignore unparseable files\n }\n }\n }\n }\n\n // 3. Process Traceability Requirements\n for (const r of trace.rows) {\n const isOk =\n (r.productStatus === 'COMPLIANT' || r.productStatus === 'CONFORME') &&\n (r.archStatus === 'COMPLIANT' || r.archStatus === 'CONFORME') &&\n (r.testStatus === 'COMPLIANT' || r.testStatus === 'CONFORME');\n const status: GraphNodeStatus = isOk ? 'COMPLIANT' : 'ORPHAN';\n const reqType = r.id.startsWith('SEC-REQ-') ? 'security-requirement' : (r.type || 'requirement');\n\n nodeMap.set(r.id, {\n id: r.id,\n label: r.id,\n title: r.title,\n type: reqType,\n layer: 'requirement',\n status,\n content: r.content,\n filePath: r.filePath,\n details: {\n productStatus: r.productStatus,\n archStatus: r.archStatus,\n testStatus: r.testStatus,\n hofId: r.hofId,\n },\n upstream: r.productTraces.split(',').map((s) => s.trim()).filter(Boolean),\n downstream: [\n ...r.archTraces.split(',').map((s) => s.trim()).filter(Boolean),\n ...r.testTraces.split(',').map((s) => s.trim()).filter(Boolean),\n ],\n });\n\n // Edges from upstream\n for (const up of r.productTraces.split(',')) {\n const u = up.trim();\n if (u && u !== 'NINGUNO' && u !== 'NONE') {\n const isAbuse = u.startsWith('ABUSE-');\n addEdge({\n id: `edge-${u}-${r.id}`,\n source: u,\n target: r.id,\n label: isAbuse ? 'mitigated-by' : 'derives-from',\n relation: isAbuse ? 'mitigated-by' : 'derives-from',\n status,\n });\n if (!nodeMap.has(u)) {\n const upType = u.startsWith('ACT-') ? 'actor' : u.startsWith('UC-') ? 'use-case' : u.startsWith('BR-') ? 'business-rule' : u.startsWith('ABUSE-') ? 'abuse-case' : 'product';\n nodeMap.set(u, {\n id: u,\n label: u,\n title: u,\n type: upType,\n layer: 'product',\n status: 'COMPLIANT',\n });\n }\n }\n }\n\n // Edges to architecture\n for (const arch of r.archTraces.split(',')) {\n const a = arch.trim();\n if (a && a !== 'NINGUNO' && a !== 'NONE') {\n addEdge({\n id: `edge-${r.id}-${a}`,\n source: r.id,\n target: a,\n label: 'satisfies',\n relation: 'satisfies',\n status,\n });\n if (!nodeMap.has(a)) {\n const aType = a.startsWith('CMP-') ? 'component' : a.startsWith('ADR-') ? 'adr' : a.startsWith('SEC-ENC-') ? 'security-enclave' : 'architecture';\n nodeMap.set(a, {\n id: a,\n label: a,\n title: a,\n type: aType,\n layer: 'architecture',\n status: 'COMPLIANT',\n });\n }\n }\n }\n\n // Edges to tests\n for (const tst of r.testTraces.split(',')) {\n const t = tst.trim();\n if (t && t !== 'NINGUNO' && t !== 'NONE') {\n const testId = t.replace(/[^a-zA-Z0-9_-]/g, '_');\n addEdge({\n id: `edge-${r.id}-${testId}`,\n source: r.id,\n target: testId,\n label: 'verified-by',\n relation: 'verified-by',\n status,\n });\n if (!nodeMap.has(testId)) {\n let testContent = undefined;\n const fullTestPath = path.isAbsolute(t) ? t : path.join(rootDir, t);\n if (fs.existsSync(fullTestPath)) {\n try {\n testContent = fs.readFileSync(fullTestPath, 'utf-8');\n } catch {}\n }\n nodeMap.set(testId, {\n id: testId,\n label: path.basename(t),\n title: t,\n type: t.endsWith('.feature') ? 'bdd-feature' : 'code-test',\n layer: 'test',\n status: 'COMPLIANT',\n filePath: t,\n content: testContent ? '```' + (t.endsWith('.feature') ? 'gherkin' : 'typescript') + '\\n' + testContent.substring(0, 1500) + (testContent.length > 1500 ? '\\n... (truncated)' : '') + '\\n```' : undefined,\n });\n }\n }\n }\n }\n\n // 4. Register all scanned artifacts into nodeMap and enrich existing ones\n for (const art of scannedArtifactsMap.values()) {\n if (!nodeMap.has(art.id)) {\n nodeMap.set(art.id, {\n id: art.id,\n label: art.id,\n title: art.title,\n type: art.type,\n layer: art.layer,\n status: 'COMPLIANT',\n filePath: art.filePath,\n content: art.content,\n });\n } else {\n const n = nodeMap.get(art.id)!;\n if (!n.filePath) n.filePath = art.filePath;\n if ((!n.title || n.title === n.id) && art.title) n.title = art.title;\n if (!n.content) n.content = art.content;\n if (art.type && (!n.type || n.type === 'product' || n.type === 'architecture' || n.type === 'usecase' || n.type === 'rule')) {\n n.type = art.type;\n }\n }\n }\n\n // 5. Connect product graph relationships: Journeys, Actors, Use Cases, Business Rules, Abuse Cases\n for (const art of scannedArtifactsMap.values()) {\n const fm = art.frontmatter;\n\n if (art.type === 'journey') {\n // Persona / Actor\n const persona = typeof fm.persona === 'string' ? fm.persona : (typeof fm.actor === 'string' ? fm.actor : undefined);\n if (persona) {\n if (!nodeMap.has(persona)) {\n nodeMap.set(persona, {\n id: persona,\n label: persona,\n title: persona,\n type: 'actor',\n layer: 'product',\n status: 'COMPLIANT',\n });\n }\n addEdge({\n id: `edge-${persona}-${art.id}`,\n source: persona,\n target: art.id,\n label: 'pursues',\n relation: 'pursues',\n status: 'COMPLIANT',\n });\n }\n\n // Related Use Cases\n const relatedUcs = Array.isArray(fm['related-use-cases']) ? fm['related-use-cases'] : (Array.isArray(fm['use-cases']) ? fm['use-cases'] : []);\n for (const ucId of relatedUcs) {\n if (typeof ucId === 'string' && ucId.trim()) {\n const u = ucId.trim();\n if (!nodeMap.has(u)) {\n nodeMap.set(u, {\n id: u,\n label: u,\n title: u,\n type: 'use-case',\n layer: 'product',\n status: 'COMPLIANT',\n });\n }\n addEdge({\n id: `edge-${art.id}-${u}`,\n source: art.id,\n target: u,\n label: 'decomposes-into',\n relation: 'decomposes-into',\n status: 'COMPLIANT',\n });\n }\n }\n } else if (art.type === 'use-case') {\n // Primary Actor\n const primaryActor = typeof fm['primary-actor'] === 'string' ? fm['primary-actor'] : (typeof fm.actor === 'string' ? fm.actor : undefined);\n if (primaryActor) {\n if (!nodeMap.has(primaryActor)) {\n nodeMap.set(primaryActor, {\n id: primaryActor,\n label: primaryActor,\n title: primaryActor,\n type: 'actor',\n layer: 'product',\n status: 'COMPLIANT',\n });\n }\n addEdge({\n id: `edge-${primaryActor}-${art.id}`,\n source: primaryActor,\n target: art.id,\n label: 'initiates',\n relation: 'initiates',\n status: 'COMPLIANT',\n });\n }\n\n // Governed By (Business Rules)\n const governedBy = Array.isArray(fm['governed-by']) ? fm['governed-by'] : [];\n for (const ruleId of governedBy) {\n if (typeof ruleId === 'string' && ruleId.trim()) {\n const r = ruleId.trim();\n if (!nodeMap.has(r)) {\n nodeMap.set(r, {\n id: r,\n label: r,\n title: r,\n type: 'business-rule',\n layer: 'product',\n status: 'COMPLIANT',\n });\n }\n addEdge({\n id: `edge-${r}-${art.id}`,\n source: r,\n target: art.id,\n label: 'governs',\n relation: 'governs',\n status: 'COMPLIANT',\n });\n }\n }\n } else if (art.type === 'business-rule') {\n const governsTargets = Array.isArray(fm['governs'])\n ? fm['governs']\n : Array.isArray(fm['applies-to'])\n ? fm['applies-to']\n : typeof fm['governs'] === 'string'\n ? [fm['governs']]\n : [];\n for (const tgt of governsTargets) {\n if (typeof tgt === 'string' && tgt.trim()) {\n const t = tgt.trim();\n addEdge({\n id: `edge-${art.id}-${t}`,\n source: art.id,\n target: t,\n label: 'governs',\n relation: 'governs',\n status: 'COMPLIANT',\n });\n }\n }\n } else if (art.type === 'abuse-case') {\n // Threat Actor\n const threatActor =\n typeof fm['primary-threat-actor'] === 'string'\n ? fm['primary-threat-actor']\n : typeof fm['threat-actor'] === 'string'\n ? fm['threat-actor']\n : typeof fm.actor === 'string'\n ? fm.actor\n : undefined;\n if (threatActor) {\n if (!nodeMap.has(threatActor)) {\n nodeMap.set(threatActor, {\n id: threatActor,\n label: threatActor,\n title: threatActor,\n type: 'threat-actor',\n layer: 'product',\n status: 'COMPLIANT',\n });\n }\n addEdge({\n id: `edge-${threatActor}-${art.id}`,\n source: threatActor,\n target: art.id,\n label: 'threatens',\n relation: 'threatens',\n status: 'COMPLIANT',\n });\n }\n\n // Targets Use Cases\n const rawTargets = fm['targets-use-case']\n ? [fm['targets-use-case']]\n : Array.isArray(fm['targets-use-cases'])\n ? fm['targets-use-cases']\n : Array.isArray(fm['targets'])\n ? fm['targets']\n : [];\n for (const tgt of rawTargets) {\n if (typeof tgt === 'string' && tgt.trim()) {\n const t = tgt.trim();\n if (nodeMap.has(t)) {\n addEdge({\n id: `edge-${art.id}-${t}`,\n source: art.id,\n target: t,\n label: 'targets',\n relation: 'targets',\n status: 'COMPLIANT',\n });\n }\n }\n }\n\n // Mitigated By (Security Requirements)\n const mitigatedBy = Array.isArray(fm['mitigated-by'])\n ? fm['mitigated-by']\n : typeof fm['mitigated-by'] === 'string'\n ? [fm['mitigated-by']]\n : [];\n for (const secReq of mitigatedBy) {\n if (typeof secReq === 'string' && secReq.trim()) {\n const s = secReq.trim();\n if (!nodeMap.has(s)) {\n nodeMap.set(s, {\n id: s,\n label: s,\n title: s,\n type: s.startsWith('SEC-REQ-') ? 'security-requirement' : 'requirement',\n layer: 'requirement',\n status: 'COMPLIANT',\n });\n }\n addEdge({\n id: `edge-${art.id}-${s}`,\n source: art.id,\n target: s,\n label: 'mitigated-by',\n relation: 'mitigated-by',\n status: 'COMPLIANT',\n });\n }\n }\n } else if (art.type === 'requirement' || art.type === 'security-requirement') {\n // Mitigates Abuse Cases\n const mitigates = Array.isArray(fm['mitigates-abuse-case']) ? fm['mitigates-abuse-case'] : (typeof fm['mitigates-abuse-case'] === 'string' ? [fm['mitigates-abuse-case']] : []);\n for (const abuseId of mitigates) {\n if (typeof abuseId === 'string' && abuseId.trim()) {\n const ab = abuseId.trim();\n if (!nodeMap.has(ab)) {\n nodeMap.set(ab, {\n id: ab,\n label: ab,\n title: ab,\n type: 'abuse-case',\n layer: 'product',\n status: 'COMPLIANT',\n });\n }\n addEdge({\n id: `edge-${ab}-${art.id}`,\n source: ab,\n target: art.id,\n label: 'mitigated-by',\n relation: 'mitigated-by',\n status: 'COMPLIANT',\n });\n }\n }\n }\n }\n\n // 6. Update status for nodes with cryptographic drifts\n for (const [id, node] of nodeMap.entries()) {\n if (driftTargets.has(id)) {\n node.status = 'DRIFT';\n }\n }\n\n // 7. Populate bidirectional upstream and downstream traces for all nodes\n for (const e of edges) {\n const srcNode = nodeMap.get(e.source);\n const tgtNode = nodeMap.get(e.target);\n if (srcNode) {\n srcNode.downstream = srcNode.downstream || [];\n if (!srcNode.downstream.includes(e.target)) {\n srcNode.downstream.push(e.target);\n }\n }\n if (tgtNode) {\n tgtNode.upstream = tgtNode.upstream || [];\n if (!tgtNode.upstream.includes(e.source)) {\n tgtNode.upstream.push(e.source);\n }\n }\n }\n\n const nodesByLayer: Record<GraphNodeLayer, number> = {\n product: 0,\n requirement: 0,\n architecture: 0,\n test: 0,\n };\n\n let conformingCount = 0;\n let issueCount = 0;\n\n const elements: CytoscapeElement[] = [];\n\n for (const n of nodeMap.values()) {\n nodesByLayer[n.layer] = (nodesByLayer[n.layer] || 0) + 1;\n if (n.status === 'COMPLIANT' || n.status === 'CONFORME') {\n conformingCount++;\n } else {\n issueCount++;\n }\n elements.push({\n group: 'nodes',\n data: n,\n classes: `layer-${n.layer} type-${n.type} status-${n.status.toLowerCase()}`,\n });\n }\n\n for (const e of edges) {\n elements.push({\n group: 'edges',\n data: e,\n classes: `relation-${e.relation} status-${e.status?.toLowerCase() || 'compliant'}`,\n });\n }\n\n return { elements, nodesByLayer, conformingCount, issueCount };\n}\n\n/**\n * Loads historical KPI records from reports/releases/ directory.\n */\nexport function collectHistoricalKpis(rootDir: string): DashboardHistoricalKpi[] {\n const releasesDir = path.join(rootDir, 'reports', 'releases');\n const items: DashboardHistoricalKpi[] = [];\n\n if (fs.existsSync(releasesDir)) {\n try {\n const files = fs.readdirSync(releasesDir).filter((f) => f.endsWith('.kpis.json'));\n for (const file of files) {\n const fullPath = path.join(releasesDir, file);\n const content = fs.readFileSync(fullPath, 'utf-8');\n const report = JSON.parse(content) as ReleaseKpiReport;\n items.push({\n id: report.releaseBranch,\n label: report.releaseBranch,\n timestamp: report.generatedAt,\n kloc: report.totalKloc,\n commits: report.totalCommits,\n bugs: report.totalBugs,\n defectDensity: report.globalDefectDensity,\n reworkPercent: report.reworkTimePercent,\n costUsd: report.totalCostUsd,\n });\n }\n } catch {\n // Ignore unparseable historical records\n }\n }\n\n // Sort by timestamp\n return items.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\n}\n\n/**\n * Collects complete project metrics for dashboard tabs.\n */\nexport function collectDashboardMetrics(rootDir: string) {\n const gate = verifyQualityGate({ rootDir });\n const gov = verifyTasksGovernance({ rootDir });\n const cov = verifyTestingCoverage({ rootDir });\n const trace = verifyTraceability({ rootDir });\n const history = collectHistoricalKpis(rootDir);\n\n let activePrKpi = null;\n let activeBranch = 'HEAD';\n try {\n try {\n activeBranch = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n } catch {\n activeBranch = 'HEAD';\n }\n\n const isDefaultBranch = activeBranch === 'main' || activeBranch === 'master';\n if (isDefaultBranch) {\n let base = 'HEAD~20';\n try {\n const count = parseInt(\n execFileSync('git', ['rev-list', '--count', 'HEAD'], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim(),\n 10\n );\n if (count <= 20) {\n const rootCommit = execFileSync('git', ['rev-list', '--max-parents=0', 'HEAD'], {\n cwd: rootDir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim().split('\\n')[0];\n base = rootCommit;\n }\n } catch {\n base = 'HEAD~1';\n }\n activePrKpi = aggregatePrKpis(base, 'HEAD', { cwd: rootDir });\n } else {\n activePrKpi = aggregatePrKpis('main', 'HEAD', { cwd: rootDir });\n if (activePrKpi.totalCommits === 0) {\n try {\n activePrKpi = aggregatePrKpis('HEAD~1', 'HEAD', { cwd: rootDir });\n } catch {\n // Keep 0 commits if unable\n }\n }\n }\n } catch {\n // Graceful fallback if git range is unavailable\n }\n\n const codeCoverage = readCodeCoverageSummary(rootDir);\n\n return {\n gate,\n gov,\n cov,\n codeCoverage,\n trace,\n history,\n activePrKpi,\n activeBranch,\n };\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nfunction renderAutonomyModeSection(\n mode: string,\n statusIcon: string,\n count: number,\n roleDescription: string,\n allTasks: any[] = []\n): string {\n const modeTasks = (allTasks || []).filter(\n (t: any) => (t.task?.autonomyMode || '').toUpperCase() === mode\n );\n const openCount = modeTasks.filter(\n (t: any) => (t.task?.status || '').toUpperCase() !== 'COMPLETED'\n ).length;\n const closedCount = modeTasks.filter(\n (t: any) => (t.task?.status || '').toUpperCase() === 'COMPLETED'\n ).length;\n\n return `\n <tr class=\"mode-row\" onclick=\"toggleAutonomyTasks('${mode}')\" title=\"Haz clic para desplegar u ocultar las tareas ${mode}\">\n <td>\n <span class=\"accordion-indicator\" id=\"toggle-icon-${mode}\">▶</span>\n <code>${mode}</code>\n <span style=\"font-size: 0.72rem; color: var(--accent-cyan); margin-left: 6px;\">(Ver tareas ▼)</span>\n </td>\n <td>${statusIcon}</td>\n <td><strong>${count}</strong></td>\n <td>${roleDescription}</td>\n </tr>\n <tr id=\"tasks-row-${mode}\" class=\"autonomy-tasks-panel\" style=\"display: none;\">\n <td colspan=\"4\">\n <div class=\"autonomy-tasks-container\">\n <div class=\"autonomy-tasks-header\">\n <div class=\"autonomy-tasks-title\">\n <span>📋 Tareas <code>${mode}</code></span>\n <span class=\"badge\" style=\"background:#334155;\">Total: ${modeTasks.length}</span>\n </div>\n <div class=\"filter-btn-group\">\n <span style=\"font-size: 0.75rem; color: var(--text-muted); font-weight: 600;\">Filtrar:</span>\n <button type=\"button\" class=\"filter-btn active\" id=\"btn-filter-${mode}-all\" onclick=\"filterAutonomyTasks('${mode}', 'all', event)\">Todas (${modeTasks.length})</button>\n <button type=\"button\" class=\"filter-btn\" id=\"btn-filter-${mode}-open\" onclick=\"filterAutonomyTasks('${mode}', 'open', event)\">Abiertas (${openCount})</button>\n <button type=\"button\" class=\"filter-btn\" id=\"btn-filter-${mode}-closed\" onclick=\"filterAutonomyTasks('${mode}', 'closed', event)\">Cerradas (${closedCount})</button>\n </div>\n </div>\n ${modeTasks.length === 0 ? `\n <div style=\"color: var(--text-muted); font-size: 0.8rem; padding: 10px 0; font-style: italic;\">\n No hay tareas registradas con modo <code>${mode}</code>.\n </div>\n ` : `\n <div id=\"tasks-empty-${mode}\" style=\"display: none; color: var(--text-muted); font-size: 0.8rem; padding: 10px 0; font-style: italic;\">\n No hay tareas en el filtro seleccionado.\n </div>\n <table class=\"sub-data-table\" id=\"tasks-table-${mode}\">\n <thead>\n <tr>\n <th style=\"width: 105px;\">ID Tarea</th>\n <th>Título de la Tarea</th>\n <th style=\"width: 160px;\">Estado</th>\n <th style=\"width: 130px;\">Asignada a</th>\n <th>Verificación</th>\n <th style=\"width: 200px;\">Fichero .md</th>\n </tr>\n </thead>\n <tbody>\n ${modeTasks.map((t: any) => {\n const cleanPath = (t.file || '').replace(/\\\\/g, '/').replace(/^\\.\\//, '');\n const rawStatus = (t.task?.status || 'PENDING').toUpperCase();\n const isClosed = rawStatus === 'COMPLETED';\n const isOpen = !isClosed;\n let badgeClass = 'badge-amber';\n let badgeText = `${rawStatus} (Abierta)`;\n if (rawStatus === 'COMPLETED') {\n badgeClass = 'badge-green';\n badgeText = 'COMPLETED (Cerrada)';\n } else if (rawStatus === 'IN_PROGRESS') {\n badgeClass = 'badge-blue';\n badgeText = 'IN_PROGRESS (Abierta)';\n } else if (rawStatus === 'BLOCKED') {\n badgeClass = 'badge-rose';\n badgeText = 'BLOCKED (Abierta)';\n }\n const criteria = t.task?.verification?.criteria || 'N/A';\n const criteriaShort = criteria.length > 45 ? criteria.substring(0, 42) + '...' : criteria;\n const pathParts = cleanPath.split('/');\n const shortFile = pathParts.length > 2 ? pathParts.slice(-2).join('/') : cleanPath;\n\n const globalIndex = allTasks.indexOf(t);\n return `\n <tr class=\"task-row task-item task-item-${isOpen ? 'open' : 'closed'}\" onclick=\"showTaskSidebar(${globalIndex})\" title=\"Ver información de ${escapeHtml(t.task?.id || 'la tarea')}\">\n <td>\n <strong style=\"color: var(--accent-cyan); font-family: monospace;\"><code>${escapeHtml(t.task?.id || 'TSK-UNKNOWN')}</code></strong>\n </td>\n <td>\n <span style=\"color: var(--text-main); font-weight: 500;\">${escapeHtml(t.task?.title || 'Untitled task')}</span>\n </td>\n <td>\n <span class=\"badge ${badgeClass}\">${escapeHtml(badgeText)}</span>\n </td>\n <td>\n <code>${escapeHtml(t.task?.assignedTo || 'agent-developer')}</code>\n </td>\n <td>\n <code style=\"font-size: 0.72rem; color: #cbd5e1;\" title=\"${escapeHtml(criteria)}\">${escapeHtml(criteriaShort)}</code>\n </td>\n <td>\n <code style=\"color: var(--text-muted); font-size: 0.75rem;\">${escapeHtml(shortFile)}</code>\n </td>\n </tr>\n `;\n }).join('')}\n </tbody>\n </table>\n `}\n </div>\n </td>\n </tr>\n `;\n}\n\n/**\n * Renders the HTML string for the interactive dashboard.\n */\nexport function renderDashboardHtml(\n graphData: GraphElementsResult,\n metricsData: ReturnType<typeof collectDashboardMetrics>,\n title: string = 'AI-SDLC: Dashboard Interactivo de Trazabilidad y Calidad'\n): string {\n const cytoscapeScript = getCytoscapeScript();\n const elementsJson = JSON.stringify(graphData.elements);\n const now = new Date().toISOString();\n\n return `<!DOCTYPE html>\n<html lang=\"es\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${title}</title>\n <style>\n :root {\n --bg-dark: #0f172a;\n --panel-bg: #1e293b;\n --card-bg: #334155;\n --accent-cyan: #38bdf8;\n --accent-emerald: #10b981;\n --accent-amber: #f59e0b;\n --accent-rose: #ef4444;\n --text-main: #f8fafc;\n --text-muted: #94a3b8;\n --border-color: #475569;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif; }\n body { background-color: var(--bg-dark); color: var(--text-main); height: 100vh; display: flex; flex-direction: column; overflow: hidden; }\n \n header { background: var(--panel-bg); border-bottom: 1px solid var(--border-color); padding: 12px 24px; display: flex; justify-content: space-between; align-items: center; }\n .brand { display: flex; align-items: center; gap: 12px; }\n .brand h1 { font-size: 1.15rem; font-weight: 700; color: var(--accent-cyan); letter-spacing: -0.025em; }\n .badge { padding: 3px 8px; border-radius: 4px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; }\n .badge-green { background: rgba(16, 185, 129, 0.2); color: #34d399; border: 1px solid #10b981; }\n .badge-amber { background: rgba(245, 158, 11, 0.2); color: #fbbf24; border: 1px solid #f59e0b; }\n .badge-blue { background: rgba(56, 189, 248, 0.2); color: #38bdf8; border: 1px solid #38bdf8; }\n .badge-rose { background: rgba(239, 68, 68, 0.2); color: #ef4444; border: 1px solid #ef4444; }\n .mode-row { cursor: pointer; transition: background 0.15s; }\n .mode-row:hover { background: rgba(56, 189, 248, 0.08) !important; }\n .accordion-indicator { display: inline-block; transition: transform 0.2s ease; margin-right: 6px; font-size: 0.75rem; color: var(--accent-cyan); }\n .accordion-indicator.open { transform: rotate(90deg); }\n .autonomy-tasks-panel { background: rgba(15, 23, 42, 0.75); }\n .autonomy-tasks-panel > td { padding: 16px 20px !important; border-bottom: 2px solid var(--border-color) !important; }\n .autonomy-tasks-container { display: flex; flex-direction: column; gap: 12px; }\n .autonomy-tasks-header { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 8px; }\n .autonomy-tasks-title { font-weight: 700; font-size: 0.85rem; color: var(--accent-cyan); display: flex; align-items: center; gap: 8px; }\n .filter-btn-group { display: flex; gap: 6px; align-items: center; }\n .filter-btn { background: var(--card-bg); border: 1px solid var(--border-color); color: var(--text-muted); padding: 4px 10px; border-radius: 4px; font-size: 0.75rem; font-weight: 600; cursor: pointer; transition: all 0.15s; }\n .filter-btn:hover { color: var(--text-main); background: #475569; }\n .filter-btn.active { background: var(--accent-cyan); color: #0f172a; border-color: var(--accent-cyan); font-weight: 700; }\n .sub-data-table { width: 100%; border-collapse: collapse; background: #0f172a; border-radius: 6px; overflow: hidden; border: 1px solid var(--border-color); font-size: 0.8rem; }\n .sub-data-table th, .sub-data-table td { padding: 8px 12px; text-align: left; border-bottom: 1px solid rgba(71, 85, 105, 0.4); }\n .sub-data-table th { background: #182234; color: var(--text-muted); font-weight: 700; font-size: 0.72rem; text-transform: uppercase; }\n .sub-data-table tr.task-row { transition: background 0.15s; cursor: pointer; }\n .sub-data-table tr.task-row:hover { background: rgba(56, 189, 248, 0.12) !important; }\n .task-file-link { color: #7dd3fc; text-decoration: underline; font-family: ui-monospace, SFMono-Regular, monospace; font-size: 0.75rem; }\n .task-file-link:hover { color: #bae6fd; }\n\n /* Task Details Slide-Over Sidebar */\n .task-sidebar {\n position: fixed;\n top: 0;\n right: -480px;\n width: 460px;\n max-width: 90vw;\n height: 100vh;\n background: var(--panel-bg);\n border-left: 1px solid var(--border-color);\n box-shadow: -8px 0 30px rgba(0, 0, 0, 0.65);\n z-index: 10001;\n display: flex;\n flex-direction: column;\n transition: right 0.28s cubic-bezier(0.16, 1, 0.3, 1);\n }\n .task-sidebar.open {\n right: 0;\n }\n .task-sidebar-header {\n padding: 16px 20px;\n border-bottom: 1px solid var(--border-color);\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: #182234;\n }\n .task-sidebar-header h2 {\n font-size: 1rem;\n color: var(--accent-cyan);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .task-sidebar-close {\n background: var(--card-bg);\n border: 1px solid var(--border-color);\n color: var(--text-muted);\n border-radius: 4px;\n width: 28px;\n height: 28px;\n font-size: 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.15s;\n }\n .task-sidebar-close:hover {\n background: #475569;\n color: var(--text-main);\n border-color: var(--accent-cyan);\n }\n .task-sidebar-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n }\n .task-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(15, 23, 42, 0.6);\n backdrop-filter: blur(2px);\n z-index: 10000;\n }\n\n nav.tabs { display: flex; background: var(--panel-bg); border-bottom: 1px solid var(--border-color); padding: 0 24px; gap: 8px; }\n .tab-btn { background: transparent; border: none; color: var(--text-muted); padding: 10px 16px; font-weight: 600; font-size: 0.875rem; cursor: pointer; border-bottom: 2px solid transparent; transition: all 0.2s; }\n .tab-btn:hover { color: var(--text-main); }\n .tab-btn.active { color: var(--accent-cyan); border-bottom-color: var(--accent-cyan); }\n\n main { flex: 1; position: relative; overflow: hidden; display: flex; }\n .tab-panel { display: none; width: 100%; height: 100%; overflow: auto; }\n .tab-panel.active { display: flex; }\n\n /* Cytoscape View */\n #graph-view { position: relative; flex: 1; height: 100%; display: flex; }\n #cy { flex: 1; height: 100%; background: #0b1120; }\n .graph-toolbar { position: absolute; top: 16px; left: 16px; z-index: 10; display: flex; flex-direction: column; gap: 8px; background: rgba(30, 41, 59, 0.85); backdrop-filter: blur(8px); padding: 12px; border-radius: 8px; border: 1px solid var(--border-color); box-shadow: 0 8px 16px rgba(0,0,0,0.4); max-width: 300px; }\n .tool-row { display: flex; gap: 6px; align-items: center; }\n .tool-btn { background: var(--card-bg); border: 1px solid var(--border-color); color: var(--text-main); padding: 6px 10px; border-radius: 4px; font-size: 0.75rem; cursor: pointer; font-weight: 600; transition: background 0.2s; }\n .tool-btn:hover { background: #475569; }\n .tool-select, .tool-input { background: var(--card-bg); border: 1px solid var(--border-color); color: var(--text-main); padding: 6px 8px; border-radius: 4px; font-size: 0.75rem; width: 100%; }\n \n .sidebar { width: 340px; background: var(--panel-bg); border-left: 1px solid var(--border-color); padding: 20px; overflow-y: auto; display: flex; flex-direction: column; gap: 16px; }\n .sidebar h2 { font-size: 1rem; color: var(--accent-cyan); border-bottom: 1px solid var(--border-color); padding-bottom: 8px; }\n .sidebar-field { font-size: 0.8rem; line-height: 1.4; }\n .sidebar-field strong { color: var(--text-muted); display: block; font-size: 0.7rem; text-transform: uppercase; margin-bottom: 2px; }\n .sidebar-field pre { background: var(--card-bg); padding: 8px; border-radius: 4px; overflow-x: auto; font-size: 0.75rem; color: #a5f3fc; }\n\n /* Tables & Cards View */\n .content-container { padding: 24px; width: 100%; max-width: 1300px; margin: 0 auto; display: flex; flex-direction: column; gap: 24px; }\n .grid-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px; }\n .metric-card { background: var(--panel-bg); border: 1px solid var(--border-color); border-radius: 8px; padding: 18px; display: flex; flex-direction: column; gap: 6px; }\n .metric-card .title { font-size: 0.75rem; text-transform: uppercase; color: var(--text-muted); font-weight: 600; }\n .metric-card .value { font-size: 1.8rem; font-weight: 800; color: var(--text-main); }\n .metric-card .subtitle { font-size: 0.75rem; color: var(--accent-cyan); }\n\n .data-table { width: 100%; border-collapse: collapse; background: var(--panel-bg); border-radius: 8px; overflow: hidden; border: 1px solid var(--border-color); font-size: 0.85rem; }\n .data-table th, .data-table td { padding: 12px 16px; text-align: left; border-bottom: 1px solid var(--border-color); }\n .data-table th { background: #182234; color: var(--text-muted); font-weight: 700; text-transform: uppercase; font-size: 0.75rem; }\n .data-table tr:hover { background: rgba(255,255,255,0.03); }\n\n /* Timeline & KPI Historical */\n .chart-container { background: var(--panel-bg); border: 1px solid var(--border-color); border-radius: 8px; padding: 20px; }\n .chart-container h3 { font-size: 0.9rem; color: var(--accent-cyan); margin-bottom: 16px; }\n /* REQUIREMENT HOVER TOOLTIP */\n .req-tooltip {\n position: fixed;\n z-index: 10000;\n background: rgba(15, 23, 42, 0.95);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n border: 1px solid var(--accent-cyan);\n border-radius: 6px;\n padding: 8px 12px;\n max-width: 280px;\n font-size: 0.75rem;\n line-height: 1.35;\n color: var(--text-main);\n box-shadow: 0 8px 20px rgba(0, 0, 0, 0.5);\n pointer-events: none;\n animation: tooltipFadeIn 0.12s ease-out;\n }\n\n @keyframes tooltipFadeIn {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n .tooltip-header {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 4px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n padding-bottom: 3px;\n }\n\n .tooltip-id {\n font-weight: 700;\n color: var(--accent-cyan);\n font-size: 0.75rem;\n font-family: ui-monospace, SFMono-Regular, monospace;\n }\n\n .tooltip-title {\n font-size: 0.7rem;\n color: var(--text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .tooltip-body {\n font-size: 0.7rem;\n color: #cbd5e1;\n max-height: 80px;\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 4;\n -webkit-box-orient: vertical;\n }\n\n /* GRAPH NODE TYPOLOGIES LEGEND */\n .graph-legend {\n position: absolute;\n bottom: 16px;\n left: 16px;\n z-index: 10;\n background: rgba(30, 41, 59, 0.9);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n padding: 10px 14px;\n border-radius: 8px;\n border: 1px solid var(--border-color);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.4);\n font-size: 0.72rem;\n max-width: 520px;\n }\n .legend-header {\n font-weight: 700;\n text-transform: uppercase;\n color: var(--accent-cyan);\n margin-bottom: 6px;\n font-size: 0.68rem;\n letter-spacing: 0.05em;\n }\n .legend-items {\n display: flex;\n flex-wrap: wrap;\n gap: 6px 12px;\n }\n .legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n color: #e2e8f0;\n font-size: 0.72rem;\n }\n .legend-dot {\n width: 12px;\n height: 12px;\n display: inline-block;\n border-radius: 2px;\n flex-shrink: 0;\n }\n </style>\n</head>\n<body>\n <header>\n <div class=\"brand\">\n <h1>AI-SDLC // INTERACTIVE DASHBOARD</h1>\n <span class=\"badge ${graphData.issueCount === 0 ? 'badge-green' : 'badge-amber'}\">\n ${graphData.issueCount === 0 ? '100% COMPLIANT' : graphData.issueCount + ' ISSUES'}\n </span>\n </div>\n <div style=\"font-size: 0.75rem; color: var(--text-muted);\">\n Generated: <span>${now.replace('T', ' ').substring(0, 19)}</span>\n </div>\n </header>\n\n <nav class=\"tabs\">\n <button class=\"tab-btn active\" onclick=\"switchTab('graph')\">🌐 PDaC / RTM Graph</button>\n <button class=\"tab-btn\" onclick=\"switchTab('rtm')\">📋 360° RTM Matrix</button>\n <button class=\"tab-btn\" onclick=\"switchTab('quality')\">📊 Quality & Governance</button>\n <button class=\"tab-btn\" onclick=\"switchTab('kpis')\">📈 Telemetry & Historical KPIs</button>\n </nav>\n\n <main>\n <!-- TAB 1: CYTOSCAPE GRAPH -->\n <div id=\"tab-graph\" class=\"tab-panel active\" style=\"flex: 1;\">\n <div id=\"graph-view\">\n <div class=\"graph-toolbar\">\n <div class=\"tool-row\">\n <button class=\"tool-btn\" onclick=\"cyZoom(0.2)\">Zoom +</button>\n <button class=\"tool-btn\" onclick=\"cyZoom(-0.2)\">Zoom -</button>\n <button class=\"tool-btn\" onclick=\"cy.fit(30)\">Center</button>\n <button class=\"tool-btn\" onclick=\"resetHighlight()\">Reset</button>\n </div>\n <div class=\"tool-row\">\n <select id=\"layout-select\" class=\"tool-select\" onchange=\"applyLayout(this.value)\">\n <option value=\"breadthfirst\">Hierarchical (Layers)</option>\n <option value=\"cose\">Force-directed (COSE)</option>\n <option value=\"concentric\">Concentric</option>\n <option value=\"circle\">Circular</option>\n </select>\n </div>\n <div class=\"tool-row\">\n <select id=\"type-filter\" class=\"tool-select\" onchange=\"filterType(this.value)\">\n <option value=\"all\">All Typologies</option>\n <option value=\"journey\">Journeys (JRN)</option>\n <option value=\"actor\">Actors (ACT)</option>\n <option value=\"use-case\">Use Cases (UC)</option>\n <option value=\"business-rule\">Business Rules (BR)</option>\n <option value=\"abuse-case\">Abuse Cases (ABUSE)</option>\n <option value=\"requirement\">Requirements (FR/QR/SEC)</option>\n <option value=\"architecture\">Architecture (CMP/ADR)</option>\n <option value=\"test\">Testing (BDD/Test)</option>\n </select>\n </div>\n <div class=\"tool-row\">\n <select id=\"layer-filter\" class=\"tool-select\" onchange=\"filterLayer(this.value)\">\n <option value=\"all\">All Layers</option>\n <option value=\"product\">Layer 1: Product (Upstream)</option>\n <option value=\"requirement\">Layer 2: Requirements</option>\n <option value=\"architecture\">Layer 3: Architecture (Midstream)</option>\n <option value=\"test\">Layer 4: Testing (Downstream)</option>\n </select>\n </div>\n <div class=\"tool-row\">\n <select id=\"status-filter\" class=\"tool-select\" onchange=\"filterStatus(this.value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"COMPLIANT\">Only Compliant (Green)</option>\n <option value=\"issues\">Only Orphans / Drift (Red)</option>\n </select>\n </div>\n <div class=\"tool-row\">\n <input type=\"text\" id=\"node-search\" class=\"tool-input\" placeholder=\"Search node ID...\" oninput=\"searchNode(this.value)\">\n </div>\n </div>\n <div id=\"cy\"></div>\n <div class=\"graph-legend\">\n <div class=\"legend-header\">Node Typologies</div>\n <div class=\"legend-items\">\n <div class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#581c87; border:2px solid #c084fc;\"></span><strong>Journey</strong> (JRN)</div>\n <div class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#065f46; border:2px solid #34d399; border-radius:50%;\"></span><strong>Actor</strong> (ACT)</div>\n <div class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#0369a1; border:2px solid #38bdf8;\"></span><strong>Use Case</strong> (UC)</div>\n <div class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#b45309; border:2px solid #fbbf24; transform:rotate(45deg);\"></span><strong>Business Rule</strong> (BR)</div>\n <div class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#881337; border:2px solid #f43f5e;\"></span><strong>Abuse Case</strong> (ABUSE)</div>\n <div class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#1e293b; border:2px solid #64748b;\"></span><strong>Requirement</strong> (FR/QR/SEC)</div>\n <div class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#312e81; border:2px solid #818cf8;\"></span><strong>Architecture</strong> (CMP/ADR)</div>\n <div class=\"legend-item\"><span class=\"legend-dot\" style=\"background:#047857; border:2px solid #10b981;\"></span><strong>Test</strong> (BDD/Test)</div>\n </div>\n </div>\n </div>\n <aside class=\"sidebar\" id=\"node-details\">\n <h2>Node Details</h2>\n <div id=\"sidebar-content\" style=\"display: flex; flex-direction: column; gap: 12px;\">\n <p style=\"color: var(--text-muted); font-size: 0.8rem;\">Click on any graph node to inspect its critical path and full traceability.</p>\n </div>\n </aside>\n </div>\n\n <!-- TAB 2: RTM TABLE -->\n <div id=\"tab-rtm\" class=\"tab-panel\">\n <div class=\"content-container\">\n <h2>360° Requirements Traceability Matrix</h2>\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Requirement ID</th>\n <th>Title</th>\n <th>Product (Upstream)</th>\n <th>Architecture (Midstream)</th>\n <th>Testing (Downstream)</th>\n <th>Global Status</th>\n </tr>\n </thead>\n <tbody>\n ${metricsData.trace.rows.map((r: any) => {\n const isRowOk = (r.productStatus === 'COMPLIANT' || r.productStatus === 'CONFORME') &&\n (r.archStatus === 'COMPLIANT' || r.archStatus === 'CONFORME') &&\n (r.testStatus === 'COMPLIANT' || r.testStatus === 'CONFORME');\n return `\n <tr onclick=\"focusNode('${r.id}')\" onmouseenter=\"startRowTooltip(event, '${r.id}')\" onmouseleave=\"cancelRowTooltip()\" onmousemove=\"updateRowTooltipPos(event)\" style=\"cursor: pointer;\">\n <td><strong><code>${r.id}</code></strong></td>\n <td>${r.title}</td>\n <td><code>${r.productTraces}</code></td>\n <td><code>${r.archTraces}</code></td>\n <td><code>${r.testTraces}</code></td>\n <td><span class=\"badge ${isRowOk ? 'badge-green' : 'badge-amber'}\">${isRowOk ? 'COMPLIANT' : 'ORPHAN'}</span></td>\n </tr>\n `}).join('')}\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- TAB 3: QUALITY & GOVERNANCE -->\n <div id=\"tab-quality\" class=\"tab-panel\">\n <div class=\"content-container\">\n <div class=\"grid-cards\">\n <div class=\"metric-card\">\n <span class=\"title\">Release Gate</span>\n <span class=\"value\" style=\"color: ${metricsData.gate.success ? 'var(--accent-emerald)' : 'var(--accent-rose)'};\">${metricsData.gate.success ? 'PASS' : 'FAIL'}</span>\n <span class=\"subtitle\">${metricsData.gate.failCount} policy-violating functions</span>\n </div>\n <div class=\"metric-card\">\n <span class=\"title\">Maintainability (SEI MI)</span>\n <span class=\"value\">${metricsData.gate.results.length > 0 ? Math.round(metricsData.gate.results.reduce((a: number, b: any) => a + b.maintainability, 0) / metricsData.gate.results.length) : 100} / 100</span>\n <span class=\"subtitle\">Minimum threshold: ${metricsData.gate.policy.min_maintainability}</span>\n </div>\n <div class=\"metric-card\">\n <span class=\"title\">Cyclomatic Complexity</span>\n <span class=\"value\">${metricsData.gate.results.length > 0 ? (metricsData.gate.results.reduce((a: number, b: any) => a + b.cyclomatic, 0) / metricsData.gate.results.length).toFixed(1) : 1.0}</span>\n <span class=\"subtitle\">Maximum threshold: ${metricsData.gate.policy.max_cyclomatic}</span>\n </div>\n <div class=\"metric-card\">\n <span class=\"title\">Requirements BDD Coverage</span>\n <span class=\"value\">${metricsData.cov.totalRequirements > 0 ? Math.round((metricsData.cov.passedRequirements / metricsData.cov.totalRequirements) * 100) : 100}%</span>\n <span class=\"subtitle\">${metricsData.cov.passedRequirements} / ${metricsData.cov.totalRequirements} verified</span>\n </div>\n <div class=\"metric-card\">\n <span class=\"title\">Code Coverage (Lines)</span>\n <span class=\"value\">${metricsData.codeCoverage ? metricsData.codeCoverage.linesPct + '%' : 'N/A'}</span>\n <span class=\"subtitle\">${metricsData.codeCoverage ? `Branches: ${metricsData.codeCoverage.branchesPct}% | Funcs: ${metricsData.codeCoverage.functionsPct}%` : `Min target: ${metricsData.gate.policy.min_line_coverage}% (Run test:coverage)`}</span>\n </div>\n </div>\n\n <div class=\"chart-container\">\n <h3>Task Autonomy Modes Distribution (Governance)</h3>\n <p style=\"font-size: 0.75rem; color: var(--text-muted); margin-bottom: 12px;\">\n Haz clic sobre cualquier tipo de autonomía para desplegar sus tareas asociadas, filtrar por estado y abrir el fichero .md correspondiente.\n </p>\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Autonomy Mode</th>\n <th>Status</th>\n <th>Count</th>\n <th>Agent Role / Required Intervention</th>\n </tr>\n </thead>\n <tbody>\n ${renderAutonomyModeSection('AUTONOMOUS', '🟢', metricsData.gov.modeCounts?.AUTONOMOUS || 0, 'Autonomous planning and coding. Asynchronous PR review.', metricsData.gov.tasks)}\n ${renderAutonomyModeSection('HUMAN_REVIEW_PLAN', '🟡', metricsData.gov.modeCounts?.HUMAN_REVIEW_PLAN || 0, 'Detailed plan approved before coding.', metricsData.gov.tasks)}\n ${renderAutonomyModeSection('AMBIGUOUS', '🟠', metricsData.gov.modeCounts?.AMBIGUOUS || 0, 'Halted: Refinement required with Product Owner.', metricsData.gov.tasks)}\n ${renderAutonomyModeSection('HIGH_RISK_MANUAL', '🔴', metricsData.gov.modeCounts?.HIGH_RISK_MANUAL || 0, 'Direct execution by human engineers.', metricsData.gov.tasks)}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n\n <!-- TAB 4: TELEMETRY & HISTORICAL KPIS -->\n <div id=\"tab-kpis\" class=\"tab-panel\">\n <div class=\"content-container\">\n <h2>Active Telemetry and KPI History</h2>\n ${metricsData.activePrKpi ? `\n <div class=\"grid-cards\">\n <div class=\"metric-card\">\n <span class=\"title\">Commits in Active Branch</span>\n <span class=\"value\">${metricsData.activePrKpi.totalCommits}</span>\n <span class=\"subtitle\">+${metricsData.activePrKpi.linesAdded} / -${metricsData.activePrKpi.linesDeleted} lines</span>\n </div>\n <div class=\"metric-card\">\n <span class=\"title\">Active Development Time</span>\n <span class=\"value\">${Math.round(metricsData.activePrKpi.totalActiveTimeSeconds / 60)}m</span>\n <span class=\"subtitle\">${metricsData.activePrKpi.totalActiveTimeSeconds}s accumulated</span>\n </div>\n <div class=\"metric-card\">\n <span class=\"title\">Consumed Tokens</span>\n <span class=\"value\">${metricsData.activePrKpi.totalTokens.toLocaleString('en-US')}</span>\n <span class=\"subtitle\">In: ${metricsData.activePrKpi.totalPromptTokens.toLocaleString()} | Out: ${metricsData.activePrKpi.totalCompletionTokens.toLocaleString()}</span>\n </div>\n <div class=\"metric-card\">\n <span class=\"title\">Estimated Compute Cost</span>\n <span class=\"value\">$${metricsData.activePrKpi.estimatedCostUsd.toFixed(2)}</span>\n <span class=\"subtitle\">Weighted USD</span>\n </div>\n </div>\n\n <div class=\"chart-container\">\n <h3>Telemetry Breakdown by Author and Model (${metricsData.activeBranch || 'HEAD'})</h3>\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Entity / Model</th>\n <th>Type</th>\n <th>Commits</th>\n <th>Lines (+/-)</th>\n <th>Active Time</th>\n <th>Consumed Tokens</th>\n <th>Estimated Cost ($ USD)</th>\n </tr>\n </thead>\n <tbody>\n ${metricsData.activePrKpi.humanSummary.commits > 0 ? `\n <tr>\n <td><strong>Human (Developer)</strong></td>\n <td><span class=\"badge\" style=\"background:#334155;\">HUMAN</span></td>\n <td>${metricsData.activePrKpi.humanSummary.commits}</td>\n <td>+${metricsData.activePrKpi.humanSummary.linesAdded} / -${metricsData.activePrKpi.humanSummary.linesDeleted}</td>\n <td>${Math.round(metricsData.activePrKpi.humanSummary.activeTimeSeconds / 60)}m</td>\n <td>0</td>\n <td>—</td>\n </tr>\n ` : ''}\n ${Object.entries(metricsData.activePrKpi.byModel).map(([model, summary]: [string, any]) => `\n <tr>\n <td><strong><code>${model}</code></strong></td>\n <td><span class=\"badge badge-green\">AGENT</span></td>\n <td>${summary.commits}</td>\n <td>+${summary.linesAdded} / -${summary.linesDeleted}</td>\n <td>${Math.round(summary.activeTimeSeconds / 60)}m</td>\n <td>${(summary.promptTokens + summary.completionTokens).toLocaleString('en-US')}</td>\n <td>$${summary.estimatedCostUsd.toFixed(2)}</td>\n </tr>\n `).join('')}\n <tr style=\"font-weight: bold; background: rgba(255,255,255,0.05);\">\n <td>TOTAL BRANCH</td>\n <td>—</td>\n <td>${metricsData.activePrKpi.totalCommits}</td>\n <td>+${metricsData.activePrKpi.linesAdded} / -${metricsData.activePrKpi.linesDeleted}</td>\n <td>${Math.round(metricsData.activePrKpi.totalActiveTimeSeconds / 60)}m</td>\n <td>${metricsData.activePrKpi.totalTokens.toLocaleString('en-US')}</td>\n <td>$${metricsData.activePrKpi.estimatedCostUsd.toFixed(2)} USD</td>\n </tr>\n </tbody>\n </table>\n </div>\n ` : ''}\n\n <div class=\"chart-container\">\n <h3>Consolidated Release History</h3>\n ${metricsData.history.length > 0 ? `\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Release</th>\n <th>Date</th>\n <th>KLoC</th>\n <th>Commits</th>\n <th>Confirmed Bugs</th>\n <th>DIR (Bugs/KLoC)</th>\n <th>Rework (%)</th>\n <th>Cost ($ USD)</th>\n </tr>\n </thead>\n <tbody>\n ${metricsData.history.map((h: any) => `\n <tr>\n <td><strong><code>${h.id}</code></strong></td>\n <td>${h.timestamp.substring(0, 10)}</td>\n <td>${h.kloc}</td>\n <td>${h.commits}</td>\n <td>${h.bugs}</td>\n <td><strong>${h.defectDensity}</strong></td>\n <td>${h.reworkPercent}%</td>\n <td>$${h.costUsd.toFixed(2)}</td>\n </tr>\n `).join('')}\n </tbody>\n </table>\n ` : `\n <p style=\"color: var(--text-muted); font-size: 0.85rem;\">\n No consolidated release reports recorded yet in <code>reports/releases/*.kpis.json</code>.\n Use the command <code>aisdlc kpi release --release <branch></code> to consolidate delivery metrics.\n </p>\n `}\n </div>\n </div>\n </div>\n </main>\n\n <!-- REQUIREMENT HOVER TOOLTIP (1s hover) -->\n <div id=\"req-tooltip\" class=\"req-tooltip\" style=\"display: none;\">\n <div class=\"tooltip-header\">\n <span class=\"tooltip-id\" id=\"tooltip-id\">FR-000</span>\n <span class=\"tooltip-title\" id=\"tooltip-title\">Title</span>\n </div>\n <div class=\"tooltip-body\" id=\"tooltip-body\"></div>\n </div>\n\n <!-- TASK DETAILS SLIDE-OVER SIDEBAR -->\n <div id=\"task-backdrop\" class=\"task-backdrop\" style=\"display: none;\" onclick=\"closeTaskSidebar()\"></div>\n <aside id=\"task-sidebar\" class=\"task-sidebar\" aria-label=\"Task Details\">\n <div class=\"task-sidebar-header\">\n <h2><span>📋 Detalles de la Tarea</span></h2>\n <button type=\"button\" class=\"task-sidebar-close\" onclick=\"closeTaskSidebar()\" title=\"Cerrar panel (Esc)\">✕</button>\n </div>\n <div class=\"task-sidebar-body\" id=\"task-sidebar-content\">\n <p style=\"color: var(--text-muted); font-size: 0.85rem;\">Haz clic en una tarea para ver sus detalles de gobernanza.</p>\n </div>\n </aside>\n\n <script>\n ${cytoscapeScript}\n </script>\n <script>\n var elements = ${elementsJson};\n var govTasks = ${JSON.stringify(metricsData.gov.tasks || [])};\n var cy = null;\n\n var reqHoverTimer = null;\n var currentHoverNodeId = null;\n var tableHoverTimer = null;\n var tableHoverId = null;\n var lastMouseX = 0;\n var lastMouseY = 0;\n\n function renderMarkdown(md) {\n if (!md || !md.trim()) {\n return '<p style=\"color: var(--text-muted); font-style: italic;\">Sin contenido detallado en el cuerpo del requisito.</p>';\n }\n try {\n var text = md\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n\n // Code blocks (triple backticks)\n var tick = String.fromCharCode(96);\n var codeBlockRe = new RegExp(tick + '{3}([a-z]*)[\\\\\\\\r\\\\\\\\n]+([\\\\\\\\s\\\\\\\\S]*?)' + tick + '{3}', 'g');\n text = text.replace(codeBlockRe, function(_, lang, code) {\n return '<pre><code>' + code.trim() + '</code></pre>';\n });\n\n // Inline code (single backtick)\n var inlineCodeRe = new RegExp(tick + '([^' + tick + ']+)' + tick, 'g');\n text = text.replace(inlineCodeRe, '<code>$1</code>');\n\n // Headers (h3, h2, h1)\n text = text.replace(/^### (.*$)/gim, '<h4>$1</h4>');\n text = text.replace(/^## (.*$)/gim, '<h3>$1</h3>');\n text = text.replace(/^# (.*$)/gim, '<h2>$1</h2>');\n\n // Bold & italic\n text = text.replace(/\\\\*\\\\*([^*]+)\\\\*\\\\*/g, '<strong>$1</strong>');\n text = text.replace(/\\\\*([^*]+)\\\\*/g, '<em>$1</em>');\n\n // Unordered lists\n text = text.replace(/^\\\\s*[-*]\\\\s+(.*$)/gim, '<li>$1</li>');\n text = text.replace(/(<li>[\\\\s\\\\S]*?<\\\\/li>(?:\\\\r?\\\\n)*)+/g, function(match) {\n return '<ul>' + match + '</ul>';\n });\n\n // Paragraph line breaks\n text = text.replace(/\\\\r?\\\\n\\\\r?\\\\n/g, '<br/><br/>');\n\n return text;\n } catch (err) {\n return '<div style=\"white-space: pre-wrap; font-family: monospace;\">' +\n md.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>') +\n '</div>';\n }\n }\n\n function showTooltip(data, x, y) {\n var tooltip = document.getElementById('req-tooltip');\n if (!tooltip) return;\n document.getElementById('tooltip-id').textContent = data.id;\n document.getElementById('tooltip-title').textContent = data.title || data.label || '';\n var bodyEl = document.getElementById('tooltip-body');\n var desc = data.content ? data.content.trim() : (data.title || data.id) + ' [' + (data.layer || data.type || 'NODE').toUpperCase() + ']';\n bodyEl.textContent = desc;\n\n tooltip.style.display = 'block';\n positionTooltip(tooltip, x, y);\n }\n\n function positionTooltip(tooltip, x, y) {\n var pad = 15;\n var left = x + pad;\n var top = y + pad;\n var rect = tooltip.getBoundingClientRect();\n if (left + rect.width > window.innerWidth - 10) {\n left = Math.max(10, x - rect.width - pad);\n }\n if (top + rect.height > window.innerHeight - 10) {\n top = Math.max(10, y - rect.height - pad);\n }\n tooltip.style.left = left + 'px';\n tooltip.style.top = top + 'px';\n }\n\n function updateTooltipPosition(x, y) {\n var tooltip = document.getElementById('req-tooltip');\n if (tooltip && tooltip.style.display !== 'none') {\n positionTooltip(tooltip, x, y);\n }\n }\n\n function hideTooltip() {\n var tooltip = document.getElementById('req-tooltip');\n if (tooltip) {\n tooltip.style.display = 'none';\n }\n }\n\n function startRowTooltip(event, id) {\n tableHoverId = id;\n lastMouseX = event.clientX;\n lastMouseY = event.clientY;\n clearTimeout(tableHoverTimer);\n tableHoverTimer = setTimeout(function() {\n if (tableHoverId === id) {\n var nodeData = null;\n if (cy) {\n var n = cy.getElementById(id);\n if (n && n.length > 0) nodeData = n.data();\n }\n if (!nodeData) {\n var el = elements.find(function(e) { return e.data && e.data.id === id; });\n if (el) nodeData = el.data;\n }\n if (nodeData) {\n showTooltip(nodeData, lastMouseX, lastMouseY);\n }\n }\n }, 1000);\n }\n\n function updateRowTooltipPos(event) {\n lastMouseX = event.clientX;\n lastMouseY = event.clientY;\n updateTooltipPosition(lastMouseX, lastMouseY);\n }\n\n function cancelRowTooltip() {\n clearTimeout(tableHoverTimer);\n tableHoverId = null;\n hideTooltip();\n }\n\n function initCytoscape() {\n if (typeof cytoscape === 'undefined') {\n console.error('Cytoscape library not loaded');\n return;\n }\n cy = cytoscape({\n container: document.getElementById('cy'),\n elements: elements,\n boxSelectionEnabled: false,\n autoungrabify: true,\n style: [\n {\n selector: 'node',\n style: {\n 'label': 'data(label)',\n 'color': '#f8fafc',\n 'font-size': '10px',\n 'text-valign': 'center',\n 'text-halign': 'center',\n 'width': 65,\n 'height': 35,\n 'background-color': '#1e293b',\n 'border-width': 2,\n 'border-color': '#64748b',\n 'text-wrap': 'ellipsis',\n 'text-max-width': '65px'\n }\n },\n // Typology Styles\n {\n selector: 'node.type-journey',\n style: {\n 'shape': 'round-rectangle',\n 'background-color': '#581c87',\n 'border-color': '#c084fc',\n 'border-width': 3,\n 'width': 85,\n 'height': 42,\n 'font-weight': 'bold',\n 'text-max-width': '80px'\n }\n },\n {\n selector: 'node.type-actor',\n style: {\n 'shape': 'ellipse',\n 'background-color': '#065f46',\n 'border-color': '#34d399',\n 'border-width': 2.5,\n 'width': 54,\n 'height': 54,\n 'font-weight': 'bold'\n }\n },\n {\n selector: 'node.type-threat-actor',\n style: {\n 'shape': 'ellipse',\n 'background-color': '#4c0519',\n 'border-color': '#fb7185',\n 'border-width': 2.5,\n 'border-style': 'dashed',\n 'width': 54,\n 'height': 54\n }\n },\n {\n selector: 'node.type-usecase, node.type-use-case',\n style: {\n 'shape': 'round-rectangle',\n 'background-color': '#0369a1',\n 'border-color': '#38bdf8',\n 'border-width': 2,\n 'width': 70,\n 'height': 38\n }\n },\n {\n selector: 'node.type-rule, node.type-business-rule',\n style: {\n 'shape': 'diamond',\n 'background-color': '#b45309',\n 'border-color': '#fbbf24',\n 'border-width': 2,\n 'width': 58,\n 'height': 58\n }\n },\n {\n selector: 'node.type-abuse-case',\n style: {\n 'shape': 'octagon',\n 'background-color': '#881337',\n 'border-color': '#f43f5e',\n 'border-width': 2.5,\n 'width': 64,\n 'height': 46\n }\n },\n {\n selector: 'node.type-security-enclave',\n style: {\n 'shape': 'hexagon',\n 'background-color': '#3b0764',\n 'border-color': '#a855f7',\n 'border-width': 2,\n 'width': 65,\n 'height': 45\n }\n },\n {\n selector: 'node.type-requirement, node.type-security-requirement',\n style: {\n 'shape': 'round-rectangle',\n 'background-color': '#1e293b',\n 'border-color': '#64748b',\n 'border-width': 2.5,\n 'width': 68,\n 'height': 36\n }\n },\n {\n selector: 'node.type-component, node.type-adr',\n style: {\n 'shape': 'hexagon',\n 'background-color': '#312e81',\n 'border-color': '#818cf8',\n 'border-width': 2,\n 'width': 60,\n 'height': 45\n }\n },\n {\n selector: 'node.type-bdd-feature, node.type-code-test, node.layer-test',\n style: {\n 'shape': 'round-rectangle',\n 'background-color': '#047857',\n 'border-color': '#10b981',\n 'border-width': 2,\n 'width': 65,\n 'height': 32\n }\n },\n // Fallback Layer styles if type is missing\n {\n selector: 'node.layer-product:not(.type-journey):not(.type-actor):not(.type-use-case):not(.type-usecase):not(.type-business-rule):not(.type-rule):not(.type-abuse-case):not(.type-threat-actor)',\n style: { 'shape': 'diamond', 'background-color': '#0e7490', 'border-color': '#38bdf8', 'width': 50, 'height': 50 }\n },\n {\n selector: 'node.layer-architecture:not(.type-component):not(.type-adr):not(.type-security-enclave)',\n style: { 'shape': 'hexagon', 'background-color': '#4338ca', 'border-color': '#818cf8', 'width': 60, 'height': 45 }\n },\n // Status modifiers\n {\n selector: 'node.status-conforme, node.status-compliant',\n style: { 'border-color': '#10b981' }\n },\n {\n selector: 'node.status-huérfano, node.status-orphan, node.status-drift',\n style: { 'border-color': '#ef4444', 'background-color': '#7f1d1d' }\n },\n // Default Edge\n {\n selector: 'edge',\n style: {\n 'width': 1.5,\n 'line-color': '#475569',\n 'target-arrow-color': '#475569',\n 'target-arrow-shape': 'triangle',\n 'curve-style': 'bezier',\n 'arrow-scale': 0.8\n }\n },\n // Semantic Edge Relations\n {\n selector: 'edge.relation-pursues',\n style: { 'line-color': '#c084fc', 'target-arrow-color': '#c084fc', 'width': 2 }\n },\n {\n selector: 'edge.relation-decomposes-into',\n style: { 'line-color': '#a855f7', 'target-arrow-color': '#a855f7', 'width': 2 }\n },\n {\n selector: 'edge.relation-initiates',\n style: { 'line-color': '#34d399', 'target-arrow-color': '#34d399', 'width': 1.8 }\n },\n {\n selector: 'edge.relation-governs',\n style: { 'line-color': '#fbbf24', 'target-arrow-color': '#fbbf24', 'line-style': 'dashed', 'width': 1.8 }\n },\n {\n selector: 'edge.relation-mitigated-by, edge.relation-mitigates',\n style: { 'line-color': '#f43f5e', 'target-arrow-color': '#f43f5e', 'line-style': 'dashed', 'width': 1.8 }\n },\n {\n selector: 'edge.relation-threatens',\n style: { 'line-color': '#e11d48', 'target-arrow-color': '#e11d48', 'line-style': 'dotted', 'width': 2 }\n },\n {\n selector: 'edge.relation-derives-from',\n style: { 'line-color': '#38bdf8', 'target-arrow-color': '#38bdf8', 'width': 1.8 }\n },\n {\n selector: 'edge.relation-satisfies',\n style: { 'line-color': '#818cf8', 'target-arrow-color': '#818cf8', 'width': 1.8 }\n },\n {\n selector: 'edge.relation-verified-by',\n style: { 'line-color': '#10b981', 'target-arrow-color': '#10b981', 'width': 1.8 }\n },\n // Highlight and dim\n {\n selector: 'node.highlighted',\n style: {\n 'border-width': 4,\n 'border-color': '#38bdf8',\n 'shadow-blur': 15,\n 'shadow-color': '#38bdf8',\n 'shadow-opacity': 0.8\n }\n },\n {\n selector: 'edge.highlighted',\n style: {\n 'line-color': '#38bdf8',\n 'target-arrow-color': '#38bdf8',\n 'width': 3,\n 'z-index': 99\n }\n },\n {\n selector: 'node.dimmed, edge.dimmed',\n style: {\n 'opacity': 0.15\n }\n }\n ],\n layout: {\n name: 'breadthfirst',\n directed: true,\n padding: 30,\n spacingFactor: 1.25\n }\n });\n\n cy.on('tap', 'node', function(evt) {\n var node = evt.target;\n var data = node.data();\n highlightCriticalPath(node);\n showNodeDetails(data);\n });\n\n cy.on('tap', function(evt) {\n if (evt.target === cy) {\n resetHighlight();\n }\n });\n\n cy.on('mouseover', 'node', function(evt) {\n var node = evt.target;\n var data = node.data();\n\n currentHoverNodeId = data.id;\n clearTimeout(reqHoverTimer);\n\n var rect = document.getElementById('cy').getBoundingClientRect();\n var clientX = (evt.originalEvent && evt.originalEvent.clientX) || (rect.left + evt.renderedPosition.x);\n var clientY = (evt.originalEvent && evt.originalEvent.clientY) || (rect.top + evt.renderedPosition.y);\n\n reqHoverTimer = setTimeout(function() {\n if (currentHoverNodeId === data.id) {\n showTooltip(data, clientX, clientY);\n }\n }, 1000);\n });\n\n cy.on('mousemove', 'node', function(evt) {\n if (evt.originalEvent) {\n updateTooltipPosition(evt.originalEvent.clientX, evt.originalEvent.clientY);\n }\n });\n\n cy.on('mouseout', 'node', function(evt) {\n clearTimeout(reqHoverTimer);\n currentHoverNodeId = null;\n hideTooltip();\n });\n }\n\n function highlightCriticalPath(node) {\n cy.elements().removeClass('highlighted dimmed');\n var predecessors = node.predecessors();\n var successors = node.successors();\n var criticalPath = node.union(predecessors).union(successors);\n \n criticalPath.addClass('highlighted');\n cy.elements().difference(criticalPath).addClass('dimmed');\n }\n\n function resetHighlight() {\n if (!cy) return;\n cy.elements().removeClass('highlighted dimmed');\n var sidebar = document.getElementById('sidebar-content');\n sidebar.innerHTML = '<p style=\"color: var(--text-muted); font-size: 0.8rem;\">Click on any graph node to inspect its critical path and full traceability.</p>';\n }\n\n function showNodeDetails(data) {\n try {\n var sidebar = document.getElementById('sidebar-content');\n if (!sidebar) return;\n var isConform = data.status === 'COMPLIANT' || data.status === 'CONFORME';\n var typeName = (data.type || data.layer || 'node').toLowerCase();\n var typeBadgeColor = '#334155';\n var typeTitle = (data.type || data.layer || 'NODE').toUpperCase();\n if (typeName === 'journey') {\n typeBadgeColor = '#581c87';\n typeTitle = 'JOURNEY (JRN)';\n } else if (typeName === 'actor') {\n typeBadgeColor = '#065f46';\n typeTitle = 'ACTOR (ACT)';\n } else if (typeName === 'threat-actor') {\n typeBadgeColor = '#4c0519';\n typeTitle = 'THREAT ACTOR (ACT-THREAT)';\n } else if (typeName === 'use-case' || typeName === 'usecase') {\n typeBadgeColor = '#0369a1';\n typeTitle = 'USE CASE (UC)';\n } else if (typeName === 'business-rule' || typeName === 'rule') {\n typeBadgeColor = '#b45309';\n typeTitle = 'BUSINESS RULE (BR)';\n } else if (typeName === 'abuse-case') {\n typeBadgeColor = '#881337';\n typeTitle = 'ABUSE CASE (ABUSE)';\n } else if (typeName === 'requirement' || typeName === 'security-requirement') {\n typeBadgeColor = '#1e293b';\n typeTitle = 'REQUIREMENT (' + (data.id.split('-')[0] || 'REQ') + ')';\n } else if (typeName === 'component' || typeName === 'adr' || typeName === 'security-enclave') {\n typeBadgeColor = '#312e81';\n typeTitle = 'ARCHITECTURE (' + (data.id.split('-')[0] || 'ARCH') + ')';\n } else if (typeName === 'bdd-feature' || typeName === 'code-test') {\n typeBadgeColor = '#047857';\n typeTitle = 'TEST VERIFICATION';\n }\n\n var html = '<div class=\"sidebar-field\"><strong>ID / Identifier:</strong> <code>' + data.id + '</code></div>';\n html += '<div class=\"sidebar-field\"><strong>Title:</strong> ' + (data.title || data.label || data.id) + '</div>';\n html += '<div class=\"sidebar-field\"><strong>Typology:</strong> <span class=\"badge\" style=\"background:' + typeBadgeColor + '; border:1px solid rgba(255,255,255,0.2);\">' + typeTitle + '</span></div>';\n html += '<div class=\"sidebar-field\"><strong>Status:</strong> <span class=\"badge ' + (isConform ? 'badge-green' : 'badge-amber') + '\">' + (data.status || 'UNKNOWN') + '</span></div>';\n if (data.filePath) {\n var cleanMetaPath = data.filePath.split('\\\\\\\\').join('/');\n if (cleanMetaPath.indexOf('./') === 0) cleanMetaPath = cleanMetaPath.substring(2);\n var metaHref = (cleanMetaPath.indexOf('http://') === 0 || cleanMetaPath.indexOf('https://') === 0 || cleanMetaPath.indexOf('file://') === 0) ? cleanMetaPath : '../' + cleanMetaPath;\n html += '<div class=\"sidebar-field\"><strong>Physical File:</strong> <a href=\"' + metaHref + '\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"color: #7dd3fc; text-decoration: underline;\" title=\"Open file: ' + cleanMetaPath + '\"><code>' + cleanMetaPath + ' ↗</code></a></div>';\n }\n if (data.upstream && data.upstream.length > 0) {\n html += '<div class=\"sidebar-field\"><strong>Upstream Traces (Product):</strong> ' + data.upstream.join(', ') + '</div>';\n }\n if (data.downstream && data.downstream.length > 0) {\n html += '<div class=\"sidebar-field\"><strong>Downstream Traces (Arch/Test):</strong> ' + data.downstream.join(', ') + '</div>';\n }\n if (data.content && data.content.trim()) {\n html += '<div class=\"sidebar-field\" style=\"margin-top: 4px;\"><strong>File Content / Specification:</strong>';\n html += '<div class=\"sidebar-content-preview\" style=\"margin-top: 6px; max-height: 280px; overflow-y: auto; background: rgba(11, 17, 32, 0.75); padding: 10px 12px; border-radius: 6px; border: 1px solid var(--border-color); font-size: 0.74rem; line-height: 1.45; color: #cbd5e1;\">';\n html += renderMarkdown(data.content);\n html += '</div></div>';\n }\n sidebar.innerHTML = html;\n } catch (err) {\n console.error('Error showing node details:', err);\n }\n }\n\n function applyLayout(name) {\n if (!cy) return;\n cy.layout({ name: name, directed: true, padding: 30, animate: true, animationDuration: 400 }).run();\n }\n\n function filterType(type) {\n if (!cy) return;\n if (type === 'all') {\n cy.elements().show();\n } else if (type === 'journey') {\n cy.elements().hide();\n var nodes = cy.nodes('.type-journey');\n nodes.show();\n nodes.connectedEdges().show();\n } else if (type === 'actor') {\n cy.elements().hide();\n var nodes = cy.nodes('.type-actor, .type-threat-actor');\n nodes.show();\n nodes.connectedEdges().show();\n } else if (type === 'use-case') {\n cy.elements().hide();\n var nodes = cy.nodes('.type-use-case, .type-usecase');\n nodes.show();\n nodes.connectedEdges().show();\n } else if (type === 'business-rule') {\n cy.elements().hide();\n var nodes = cy.nodes('.type-business-rule, .type-rule');\n nodes.show();\n nodes.connectedEdges().show();\n } else if (type === 'abuse-case') {\n cy.elements().hide();\n var nodes = cy.nodes('.type-abuse-case, .type-threat-actor');\n nodes.show();\n nodes.connectedEdges().show();\n } else if (type === 'requirement') {\n cy.elements().hide();\n var nodes = cy.nodes('.type-requirement, .type-security-requirement, .layer-requirement');\n nodes.show();\n nodes.connectedEdges().show();\n } else if (type === 'architecture') {\n cy.elements().hide();\n var nodes = cy.nodes('.type-component, .type-adr, .type-security-enclave, .layer-architecture');\n nodes.show();\n nodes.connectedEdges().show();\n } else if (type === 'test') {\n cy.elements().hide();\n var nodes = cy.nodes('.type-bdd-feature, .type-code-test, .layer-test');\n nodes.show();\n nodes.connectedEdges().show();\n } else {\n cy.elements().hide();\n var nodes = cy.nodes('.type-' + type);\n nodes.show();\n nodes.connectedEdges().show();\n }\n cy.fit(30);\n }\n\n function filterLayer(layer) {\n if (!cy) return;\n if (layer === 'all') {\n cy.elements().show();\n } else {\n cy.elements().hide();\n var nodes = cy.nodes('.layer-' + layer);\n nodes.show();\n nodes.connectedEdges().show();\n }\n cy.fit(30);\n }\n\n function filterStatus(status) {\n if (!cy) return;\n if (status === 'all') {\n cy.elements().show();\n } else if (status === 'COMPLIANT' || status === 'CONFORME') {\n cy.elements().hide();\n var nodes = cy.nodes('.status-compliant, .status-conforme');\n nodes.show();\n nodes.connectedEdges().show();\n } else {\n cy.elements().hide();\n var nodes = cy.nodes('.status-orphan, .status-huérfano, .status-drift');\n nodes.show();\n nodes.connectedEdges().show();\n }\n cy.fit(30);\n }\n\n function searchNode(text) {\n if (!cy) return;\n if (!text || text.trim() === '') {\n resetHighlight();\n return;\n }\n var q = text.trim().toLowerCase();\n var matched = cy.nodes().filter(function(ele) {\n return ele.data('id').toLowerCase().includes(q) || (ele.data('title') && ele.data('title').toLowerCase().includes(q));\n });\n if (matched.length > 0) {\n highlightCriticalPath(matched[0]);\n showNodeDetails(matched[0].data());\n cy.center(matched[0]);\n }\n }\n\n function focusNode(id) {\n cancelRowTooltip();\n switchTab('graph');\n setTimeout(function() {\n if (!cy) return;\n var node = cy.getElementById(id);\n if (node && node.length > 0) {\n highlightCriticalPath(node);\n showNodeDetails(node.data());\n cy.center(node);\n cy.zoom(1.2);\n }\n }, 100);\n }\n\n function cyZoom(val) {\n if (!cy) return;\n cy.zoom(cy.zoom() + val);\n }\n\n function switchTab(name) {\n hideTooltip();\n document.querySelectorAll('.tab-btn').forEach(function(b) { b.classList.remove('active'); });\n document.querySelectorAll('.tab-panel').forEach(function(p) { p.classList.remove('active'); });\n event.target?.classList?.add('active');\n var p = document.getElementById('tab-' + name);\n if (p) p.classList.add('active');\n if (name === 'graph' && cy) {\n cy.resize();\n cy.fit(30);\n }\n }\n\n function toggleAutonomyTasks(mode) {\n var panel = document.getElementById('tasks-row-' + mode);\n var icon = document.getElementById('toggle-icon-' + mode);\n if (!panel) return;\n var isHidden = panel.style.display === 'none' || panel.style.display === '';\n if (isHidden) {\n panel.style.display = 'table-row';\n if (icon) icon.classList.add('open');\n } else {\n panel.style.display = 'none';\n if (icon) icon.classList.remove('open');\n }\n }\n\n function filterAutonomyTasks(mode, filter, event) {\n if (event) {\n event.stopPropagation();\n }\n var panel = document.getElementById('tasks-row-' + mode);\n if (!panel) return;\n\n var btns = panel.querySelectorAll('.filter-btn');\n btns.forEach(function(b) { b.classList.remove('active'); });\n var activeBtn = document.getElementById('btn-filter-' + mode + '-' + filter);\n if (activeBtn) activeBtn.classList.add('active');\n\n var allRows = panel.querySelectorAll('.task-item');\n var visibleCount = 0;\n allRows.forEach(function(row) {\n if (filter === 'all') {\n row.style.display = '';\n visibleCount++;\n } else if (filter === 'open') {\n if (row.classList.contains('task-item-open')) {\n row.style.display = '';\n visibleCount++;\n } else {\n row.style.display = 'none';\n }\n } else if (filter === 'closed') {\n if (row.classList.contains('task-item-closed')) {\n row.style.display = '';\n visibleCount++;\n } else {\n row.style.display = 'none';\n }\n }\n });\n\n var tableEl = panel.querySelector('.sub-data-table');\n var emptyMsg = document.getElementById('tasks-empty-' + mode);\n if (emptyMsg) {\n if (visibleCount === 0) {\n emptyMsg.textContent = filter === 'open'\n ? 'No hay tareas abiertas para este modo.'\n : (filter === 'closed' ? 'No hay tareas cerradas para este modo.' : 'No hay tareas registradas para este modo.');\n emptyMsg.style.display = 'block';\n if (tableEl) tableEl.style.display = 'none';\n } else {\n emptyMsg.style.display = 'none';\n if (tableEl) tableEl.style.display = 'table';\n }\n }\n }\n\n function showTaskSidebar(index) {\n if (typeof govTasks === 'undefined' || !govTasks[index]) return;\n var t = govTasks[index];\n var task = t.task || {};\n var sidebar = document.getElementById('task-sidebar');\n var backdrop = document.getElementById('task-backdrop');\n var contentEl = document.getElementById('task-sidebar-content');\n if (!sidebar || !contentEl) return;\n\n var rawStatus = (task.status || 'PENDING').toUpperCase();\n var isClosed = rawStatus === 'COMPLETED';\n var badgeClass = 'badge-amber';\n var badgeText = rawStatus + ' (Abierta)';\n if (rawStatus === 'COMPLETED') {\n badgeClass = 'badge-green';\n badgeText = 'COMPLETED (Cerrada)';\n } else if (rawStatus === 'IN_PROGRESS') {\n badgeClass = 'badge-blue';\n badgeText = 'IN_PROGRESS (Abierta)';\n } else if (rawStatus === 'BLOCKED') {\n badgeClass = 'badge-rose';\n badgeText = 'BLOCKED (Abierta)';\n }\n\n var cleanPath = (t.file || '').split(String.fromCharCode(92)).join('/');\n if (cleanPath.indexOf('./') === 0) cleanPath = cleanPath.substring(2);\n var metaHref = cleanPath;\n if (cleanPath.indexOf('http://') === 0 || cleanPath.indexOf('https://') === 0 || cleanPath.indexOf('file://') === 0) {\n metaHref = cleanPath;\n } else if (cleanPath.indexOf(':') === 1 || cleanPath.indexOf('/') === 0) {\n metaHref = 'file:///' + cleanPath.replace(/^[/]+/, '');\n } else {\n metaHref = '../' + cleanPath;\n }\n\n var html = '';\n html += '<div class=\"sidebar-field\"><strong>ID de la Tarea:</strong> <code style=\"font-size: 0.95rem; color: var(--accent-cyan); font-weight: 700;\">' + (task.id || 'TSK-UNKNOWN') + '</code></div>';\n html += '<div class=\"sidebar-field\"><strong>Título:</strong> <span style=\"font-size: 0.9rem; font-weight: 600; color: var(--text-main);\">' + (task.title || 'Sin título') + '</span></div>';\n html += '<div class=\"sidebar-field\"><strong>Estado:</strong> <span class=\"badge ' + badgeClass + '\">' + badgeText + '</span></div>';\n html += '<div class=\"sidebar-field\"><strong>Modo de Autonomía:</strong> <code>' + (task.autonomyMode || 'UNKNOWN') + '</code></div>';\n if (task.riskLevel) {\n html += '<div class=\"sidebar-field\"><strong>Nivel de Riesgo:</strong> <span class=\"badge\" style=\"background:#334155;\">' + task.riskLevel + '</span></div>';\n }\n if (task.complexity) {\n html += '<div class=\"sidebar-field\"><strong>Complejidad:</strong> <span class=\"badge\" style=\"background:#334155;\">' + task.complexity + '</span></div>';\n }\n html += '<div class=\"sidebar-field\"><strong>Asignada a:</strong> <code>' + (task.assignedTo || 'agent-developer') + '</code></div>';\n\n var criteria = (task.verification && task.verification.criteria) || 'No especificado';\n var method = (task.verification && task.verification.method) || 'N/A';\n html += '<div class=\"sidebar-field\"><strong>Método de Verificación:</strong> <code>' + method + '</code></div>';\n html += '<div class=\"sidebar-field\"><strong>Criterio / Comando de Aceptación:</strong><pre><code>' + criteria + '</code></pre></div>';\n\n if (task.blockingReason) {\n html += '<div class=\"sidebar-field\"><strong style=\"color: var(--accent-rose);\">Motivo de Bloqueo:</strong> <div style=\"background: rgba(239, 68, 68, 0.15); border: 1px solid var(--accent-rose); border-radius: 4px; padding: 8px; color: #fca5a5;\">' + task.blockingReason + '</div></div>';\n }\n\n html += '<div class=\"sidebar-field\"><strong>Gobernanza y Validación:</strong>';\n html += '<div style=\"display: flex; flex-direction: column; gap: 4px; margin-top: 4px; font-size: 0.75rem;\">';\n html += '<div>Verificación ejecutable: ' + (t.hasVerification ? '✅ Sí' : '❌ Falta') + '</div>';\n html += '<div>Modo de autonomía válido: ' + (t.validAutonomy ? '✅ Sí' : '⚠️ Inválido') + '</div>';\n html += '<div>Anomalías de seguridad/riesgo: ' + (t.riskAnomaly ? '⚠️ Detectadas' : '✅ Ninguna') + '</div>';\n html += '</div></div>';\n\n html += '<div class=\"sidebar-field\" style=\"margin-top: 8px; border-top: 1px solid var(--border-color); padding-top: 12px;\"><strong>Fichero de Especificación (.md):</strong>';\n html += '<div style=\"margin-top: 4px;\"><a href=\"' + metaHref + '\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"color: #7dd3fc; text-decoration: underline; font-family: monospace; font-size: 0.8rem;\" title=\"Abrir archivo original\"><code>' + cleanPath + ' ↗</code></a></div>';\n html += '</div>';\n\n contentEl.innerHTML = html;\n sidebar.classList.add('open');\n if (backdrop) backdrop.style.display = 'block';\n }\n\n function closeTaskSidebar() {\n var sidebar = document.getElementById('task-sidebar');\n var backdrop = document.getElementById('task-backdrop');\n if (sidebar) sidebar.classList.remove('open');\n if (backdrop) backdrop.style.display = 'none';\n }\n\n window.addEventListener('keydown', function(evt) {\n if (evt.key === 'Escape' || evt.key === 'Esc') {\n hideTooltip();\n closeTaskSidebar();\n }\n });\n\n window.addEventListener('DOMContentLoaded', function() {\n initCytoscape();\n });\n </script>\n</body>\n</html>`;\n}\n\n/**\n * Main function to generate the dashboard report.\n */\nexport function generateDashboardReport(options: DashboardOptions = {}): DashboardResult {\n const rootDir = options.rootDir || process.cwd();\n const outputPath = options.outputPath || path.join(rootDir, 'reports', 'dashboard.html');\n\n const graphData = buildGraphElements(rootDir);\n const metricsData = collectDashboardMetrics(rootDir);\n const html = renderDashboardHtml(graphData, metricsData, options.title);\n\n const outDir = path.dirname(outputPath);\n if (!fs.existsSync(outDir)) {\n fs.mkdirSync(outDir, { recursive: true });\n }\n\n fs.writeFileSync(outputPath, html, 'utf-8');\n\n const totalReqs = metricsData.cov.totalRequirements || 1;\n const passedReqs = metricsData.cov.passedRequirements || 0;\n const bddCoverageRatio = Math.round((passedReqs / totalReqs) * 100);\n\n const traceReqs = metricsData.trace.totalRequirements || 1;\n const conformingTrace = metricsData.trace.totalRequirements - metricsData.trace.orphanCount;\n const traceabilityRatio = Math.round((conformingTrace / traceReqs) * 100);\n\n const gateResults = metricsData.gate.results;\n const avgMi = gateResults.length > 0 ? Math.round(gateResults.reduce((a, b) => a + b.maintainability, 0) / gateResults.length) : 100;\n const avgCc = gateResults.length > 0 ? Math.round((gateResults.reduce((a, b) => a + b.cyclomatic, 0) / gateResults.length) * 10) / 10 : 1;\n\n return {\n outputPath,\n totalNodes: graphData.elements.filter((e) => e.group === 'nodes').length,\n totalEdges: graphData.elements.filter((e) => e.group === 'edges').length,\n conformingCount: graphData.conformingCount,\n issueCount: graphData.issueCount,\n nodesByLayer: graphData.nodesByLayer,\n metrics: {\n totalFiles: metricsData.gate.totalFiles,\n totalFunctions: metricsData.gate.totalFunctions,\n avgMaintainability: avgMi,\n avgCyclomatic: avgCc,\n qualityVerdict: metricsData.gate.success ? 'PASS' : 'FAIL',\n autonomyDistribution: metricsData.gov.modeCounts || {},\n traceabilityRatio,\n bddCoverageRatio,\n },\n html,\n };\n}\n","/**\n * AI-SDLC: Starter templates for Agent Native Configs, Specialized Agents, and MCP\n */\n\nexport interface SpecializedAgentTemplate {\n id: string;\n title: string;\n description: string;\n globs: string;\n body: string;\n}\n\nexport const SPECIALIZED_AGENT_TEMPLATES: readonly SpecializedAgentTemplate[] = [\n {\n id: 'agent-product-analyst',\n title: 'Product Analyst / Scribe',\n description:\n 'Assist the human Product Owner in exploring, modeling, and refining product definition using ProductShape (ACT-*, UC-*, FR-*, QR-*, BR-*).',\n globs: 'product/**, specs/product/**, templates/product/**',\n body: `## Role & Mission\n- **Role**: Product Analyst Agent (\\`agent-product-analyst\\`) and Technical Scribe (AI as Scribe) of the AI-SDLC framework.\n- **Mission**: Transform natural language business intent into canonical ProductShape artifacts (\\`ACT-*\\`, \\`JRN-*\\`, \\`UC-*\\`, \\`BR-*\\`, \\`TERM-*\\`, \\`FR-*\\`, \\`QR-*\\`) 100% compliant with JSON schemas.\n\n## Operational Directives & Guardrails\n- Every generated artifact must strictly adhere to the canonical Markdown and YAML frontmatter format in \\`schemas/product/\\`.\n- \\`status\\` ALWAYS starts as \\`draft\\`. Creating artifacts directly as \\`active\\` or \\`approved\\` is forbidden.\n- Always write relationships in their single canonical direction (\\`derives-from: [UC-*]\\`, \\`primary-actor: ACT-*\\`).\n- In \\`UC-*\\`, format section \\`1. Intent and Outcome\\` under the standard English structure: \\`As a <ACT-ID>... I want <action>... To <outcome>...\\`.\n- In every \\`FR-*\\` requirement, include a \\`\\`\\`gherkin block with tags \\`@<ID> @automated @regression\\`, nominal \\`Scenario\\`, and at least one \\`Scenario Outline\\` with an \\`Examples\\` table.\n- Do not assume business rules. If you detect an ambiguity, record it explicitly under \\`open-questions\\`.\n- Run \\`pnpm run verify:schemas\\` and \\`pnpm run verify:duplicates\\` before delivering the draft.\n- If autonomy is $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`, conclude by emitting the canonical Workflow Handoff block (\\`templates/workflow/agent-handoff.template.md\\`) suggesting \\`agent-threat-modeler\\` or \\`agent-expert-user\\`, opening the Human Action Window. In \\`AUTONOMOUS\\` mode, omit interactive handoff.`,\n },\n {\n id: 'agent-threat-modeler',\n title: 'Threat Modeler and Security Specialist',\n description:\n 'Analyze business use cases and architecture artifacts to proactively model STRIDE adversaries, abuse cases, and OWASP ASVS security requirements.',\n globs: 'security/**, specs/security/**, architecture/**',\n body: `## Role & Mission\n- **Role**: Threat Modeling and Shift-Left Cybersecurity Specialist Agent (\\`agent-threat-modeler\\`).\n- **Mission**: Analyze business use cases and architecture artifacts to proactively model adversaries, STRIDE attack vectors, and OWASP ASVS mitigation requirements.\n\n## Operational Directives & Guardrails\n- Apply STRIDE and OWASP ASVS methodologies to every use case \\`UC-*\\` and architecture component \\`CMP-*\\` (Mermaid C4/arc42 diagrams, ADR records).\n- Systematically generate the cybersecurity triad conforming to \\`schemas/security/\\`:\n - \\`ACT-THREAT-*\\` (Threat Actor)\n - \\`ABUSE-*\\` (Abuse Case targeting \\`UC-*\\` with \\`mitigated-by: [SEC-REQ-*]\\`)\n - \\`SEC-REQ-*\\` (Security Requirement with \\`mitigates-abuse-case: [ABUSE-*]\\` and \\`enforced-in-enclave: SEC-ENC-*\\`)\n- \\`status\\` ALWAYS starts as \\`draft\\`.\n- In the **Technical Security Feedback Loop** (arriving from \\`agent-system-architect\\`), analyze infrastructure, persistence, middleware, and API decisions to issue system/software-level \\`ACT-THREAT-*\\` and \\`SEC-REQ-*\\`.\n- Every \\`SEC-REQ-*\\` must include negative BDD attack and rejection scenarios tagged \\`@security @mitigation\\`.\n- Run \\`pnpm run verify:schemas\\` before delivering the draft.\n- If autonomy is $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`, conclude by emitting the Workflow Handoff block (\\`templates/workflow/agent-handoff.template.md\\`) suggesting \\`agent-system-architect\\` (or \\`agent-qa-engineer\\` once technical modeling is complete) and opening the Human Action Window. In \\`AUTONOMOUS\\` mode, omit interactive handoff.`,\n },\n {\n id: 'agent-system-architect',\n title: 'System Architect',\n description:\n 'Translate approved product and security definitions into modular technical architecture based on arc42 enriched with NAF v4 (CMP-*, ADR-*).',\n globs: 'architecture/**, specs/changes/**/design.md, templates/architecture/**',\n body: `## Role & Mission\n- **Role**: System Architect Agent (\\`agent-system-architect\\`) of the AI-SDLC framework.\n- **Mission**: Translate approved product definition into a modular technical architecture based on arc42 enriched with NAF v4.\n\n## Operational Directives & Guardrails\n- Decompose the system into building blocks \\`CMP-*\\` ensuring each component declares which use cases \\`UC-*\\` it implements and which requirements (\\`FR-*\\`, \\`QR-*\\`, \\`SEC-REQ-*\\`) it fulfills under \\`satisfies-requirements\\`.\n- Generate interaction and sequence diagrams in native Mermaid syntax.\n- Document critical technological decisions using immutable \\`ADR-*\\` records conforming to \\`schemas/architecture/adr.schema.json\\`.\n- Validate that architectural choices comply with legal constraints in \\`license-policy.yaml\\`.\n- **Technical Security Feedback Loop**: If architectural decisions (databases, queues, distributed caching, third-party APIs, authentication schemes) introduce new attack vectors, emit a return handoff to \\`agent-threat-modeler\\` for technical modeling prior to the testing phase.\n- If autonomy is $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`, conclude by emitting the Workflow Handoff block (\\`templates/workflow/agent-handoff.template.md\\`) suggesting \\`agent-qa-engineer\\` (or \\`agent-threat-modeler\\` if technical security loop is required) and opening the Human Action Window. In \\`AUTONOMOUS\\` mode, omit interactive handoff.`,\n },\n {\n id: 'agent-qa-engineer',\n title: 'QA Engineer and SDET',\n description:\n 'Translate approved requirements (FR-*, SEC-REQ-*, QR-*) into comprehensive FAILING (red) BDD/Gherkin and unit test suites before production code is written.',\n globs: 'tests/**, specs/changes/**/spec.md',\n body: `## Role & Mission\n- **Role**: QA Engineer and SDET (Software Development Engineer in Test) Agent (\\`agent-qa-engineer\\`).\n- **Mission**: Translate approved requirements (\\`FR-*\\`, \\`SEC-REQ-*\\`, \\`QR-*\\`) into comprehensive FAILING (red) BDD/Gherkin test suites before \\`agent-developer\\` writes a single line of production code.\n\n## Operational Directives & Guardrails\n- Read exclusively requirements cited in the \\`handoff.yaml\\` sidecar (\\`HOF-*\\`) and their referenced artifacts.\n- For each \\`FR-*\\` requirement, generate the three mandatory test categories:\n 1. **Nominal Case** (\\`Scenario\\`): happy path with valid inputs within expected boundaries.\n 2. **Boundary Cases** (\\`Scenario Outline\\` + \\`Examples\\` table): values at the extremes of the accepted range.\n 3. **Out-of-Range / Invalid Cases** (\\`Scenario Outline\\` + \\`Examples\\` table): null, empty, wrong types, values exceeding bounds.\n- Apply conditional categories when applicable: Security (\\`@security @mitigation\\`), Performance (\\`@performance\\`), Idempotency (\\`@idempotence\\`), Postconditions, and Interface Contracts.\n- Tag all scenarios with \\`@<FR-ID> @automated @regression\\`.\n- **STRICTLY FORBIDDEN**: Including production code, suggesting implementation, or anticipating technical solutions.\n- Run \\`pnpm run verify:testing\\` before emitting handoff.\n- If autonomy is $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`, conclude by emitting the Workflow Handoff block (\\`templates/workflow/agent-handoff.template.md\\`) suggesting \\`agent-developer\\` and opening the Human Action Window. In \\`AUTONOMOUS\\` mode, omit interactive handoff.`,\n },\n {\n id: 'agent-developer',\n title: 'Software Developer',\n description:\n 'Implement atomic tasks from SDD specifications (tasks.md) delivering clean, strictly typed, and tested code satisfying quality-policy.yaml thresholds.',\n globs: 'src/**, packages/**, tests/**, specs/changes/**',\n body: `## Role & Mission\n- **Role**: High-Precision Software Developer / Coder Agent (\\`agent-developer\\`).\n- **Mission**: Implement atomic tasks from SDD specifications (\\`tasks.md\\`) delivering clean, strictly typed, and tested code.\n\n## Operational Directives & Guardrails\n- Respect the autonomy mode assigned to each task in \\`tasks.md\\` (\\`AUTONOMOUS\\`, \\`HUMAN_REVIEW_PLAN\\`, \\`AMBIGUOUS\\`, \\`HIGH_RISK_MANUAL\\`).\n- Apply Test-Driven Development (TDD): make failing tests delivered by \\`agent-qa-engineer\\` pass green without altering tests to accommodate buggy code.\n- Cite implemented \\`FR-*\\` or \\`SEC-REQ-*\\` IDs in test header comments to maintain 360° reverse traceability.\n- Before adding any external dependency, verify its SPDX license is permitted in \\`license-policy.yaml\\`.\n- Respect non-negotiable \\`quality-policy.yaml\\` thresholds: Cyclomatic Complexity $\\\\le 10$, Cognitive Complexity $\\\\le 15$, Maintainability Index $\\\\ge 50$, Function Length $\\\\le 40$ lines.\n- Run unified pre-flight with auto-fix (\\`pnpm run check:fix\\`) and full verification (\\`pnpm run verify:all\\`).\n- Upon completing green implementation, suggest handoff to \\`agent-expert-user\\` for Post-Development Functional Validation prior to security audit.`,\n },\n {\n id: 'agent-security-auditor',\n title: 'Adversarial Code Auditor',\n description:\n 'Examine Pull Requests and source code with an attacker mindset for business logic vulnerabilities, injection vectors, secret leaks, and authorization flaws.',\n globs: 'src/**, packages/**, security/**',\n body: `## Role & Mission\n- **Role**: Adversarial Security Auditor Agent (\\`agent-security-auditor\\`).\n- **Mission**: Rigorously examine Pull Requests and code diffs for business logic vulnerabilities, injection vectors, secret leaks, and authorization flaws as part of the Pre-Merge Audit Triad.\n\n## Operational Directives & Guardrails\n- Analyze code diffs with an attacker mindset: How can an unauthenticated user bypass this check? Are there info leaks in exceptions? Is command, SQL, path traversal, or prompt injection possible?\n- Run deterministic security verification: \\`pnpm run verify:security\\` (secrets + shift-left SAST).\n- Issue a formal audit report with CVSS v3.1 severity scoring and concrete remediation proposals.\n- Immediately block any PR introducing CRITICAL or HIGH security risks.\n- If autonomy is $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`, conclude by emitting the Workflow Handoff block (\\`templates/workflow/agent-handoff.template.md\\`) to the human Tech Lead, opening the Human Action Window. In \\`AUTONOMOUS\\` mode, omit interactive handoff.`,\n },\n {\n id: 'agent-compliance-checker',\n title: 'Open Source License Compliance Auditor',\n description:\n 'Audit dependency manifests and SBOMs against license-policy.yaml to block viral copyleft licenses and flag commercial license requirements.',\n globs: 'package.json, pnpm-lock.yaml, license-policy.yaml, compliance/**',\n body: `## Role & Mission\n- **Role**: Open Source License and Intellectual Property Compliance Auditor Agent (\\`agent-compliance-checker\\`).\n- **Mission**: Audit dependency manifests and ensure every direct and transitive third-party package complies with \\`license-policy.yaml\\` as part of the Pre-Merge Audit Triad.\n\n## Operational Directives & Guardrails\n- Verify SPDX identifiers for every direct and transitive dependency via \\`pnpm run verify:licenses\\`.\n- Immediately block viral copyleft licenses (\\`GPL-*\\`, \\`AGPL-*\\`) and unknown/unlicensed packages.\n- If source-available or commercial licenses (\\`BSL-1.1\\`, \\`SSPL-1.0\\`) are detected, flag with \\`COMMERCIAL_APPROVAL_REQUIRED\\` and draft a request using \\`templates/compliance/commercial-acquisition-request.template.md\\`.\n- If autonomy is $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`, conclude by emitting the Workflow Handoff block (\\`templates/workflow/agent-handoff.template.md\\`) to the human Tech Lead or Legal counsel, opening the Human Action Window. In \\`AUTONOMOUS\\` mode, omit interactive handoff.`,\n },\n {\n id: 'agent-expert-user',\n title: 'Expert User and Domain Evaluator',\n description:\n 'Scrutinize product design (MVP vs roadmap) and functionally validate finished software against UC-* and FR-* acceptance criteria before pre-merge audit.',\n globs: 'product/**, specs/**, src/**, packages/**',\n body: `## Role & Mission\n- **Role**: Expert User and Domain Evaluator Agent (\\`agent-expert-user\\`).\n- **Mission**: Scrutinize product design, technical specifications, and implemented software from the perspective of an advanced operator, enforcing strict MVP boundaries and pre-PR functional conformity.\n\n## Operational Directives & Guardrails\n- Operate under bimodal discipline depending on the lifecycle phase:\n 1. **Design Mode (Upstream)**: Adopt the primary actor persona under real-world field conditions (stress, latency, constrained viewports). Separate strict Minimum Viable Product (MVP) core from future roadmap ideas using \\`templates/product/user-design-feedback.template.md\\`.\n 2. **Functional Validation Mode (Downstream / Pre-PR / Post-Development Functional Validation)**: Inspect \\`agent-developer\\` deliverables once unit tests pass green. Contrast actual UI, CLI, and API behavior against approved \\`UC-*\\` and \\`FR-*\\` criteria.\n- Formulate decisive questions under \\`open-questions\\` for the human Product Owner.\n- Emit handoff block suggesting the Pre-Merge Audit Triad (\\`agent-code-reviewer\\`, \\`agent-security-auditor\\`, \\`agent-compliance-checker\\`) if compliant, or return to \\`agent-developer\\` on functional drift.`,\n },\n {\n id: 'agent-code-reviewer',\n title: 'Technical and Architectural Code Reviewer',\n description:\n 'Audit Pull Requests for Clean Code, SOLID, DRY, YAGNI, design patterns, and compliance with quality-policy.yaml complexity and maintainability thresholds.',\n globs: 'src/**, packages/**, tests/**',\n body: `## Role & Mission\n- **Role**: Technical and Architectural Code Reviewer Agent (\\`agent-code-reviewer\\`).\n- **Mission**: Audit Pull Requests evaluating code cleanliness, adherence to SOLID, DRY, YAGNI principles, design patterns, and compliance with complexity and maintainability thresholds (\\`quality-policy.yaml\\`), forming part of the Pre-Merge Audit Triad.\n\n## Operational Directives & Guardrails\n- Analyze code diffs against \\`quality-policy.yaml\\` standards: Cyclomatic Complexity $\\\\le 10$, Cognitive Complexity $\\\\le 15$, Maintainability Index $\\\\ge 50$, Lines per Function $\\\\le 40$.\n- Detect improper coupling, code smells, magic numbers, ambiguous identifiers, and encapsulation breaches.\n- Flag premature abstractions and speculative code violating YAGNI.\n- Coordinate Pre-Merge Audit Triad with \\`agent-security-auditor\\` and \\`agent-compliance-checker\\`.\n- Categorize findings into: \\`[BLOCKING]\\` (quality violation or broken pattern), \\`[CLEAN_CODE_SUGGESTION]\\` (non-blocking improvement), and \\`[COMPLIANT]\\`.\n- If autonomy is $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`, conclude by emitting the Workflow Handoff block (\\`templates/workflow/agent-handoff.template.md\\`) to the human Tech Lead for final approval and merge, opening the Human Action Window. In \\`AUTONOMOUS\\` mode, omit interactive handoff.`,\n },\n {\n id: 'agent-devops',\n title: 'Automation and Infrastructure Engineer',\n description:\n 'Maintain, evolve, and audit CI/CD workflows, Dockerfiles, IaC manifests, and support scripts under strict non-invasion guardrails on src/.',\n globs: '.github/workflows/**, templates/ci/**, scripts/**, Dockerfile*',\n body: `## Role & Mission\n- **Role**: DevOps and Infrastructure as Code (IaC) Engineer Agent (\\`agent-devops\\`).\n- **Mission**: Maintain, evolve, and audit automated project infrastructure: CI/CD workflows, Docker containers, deployment manifests, and infrastructure scripts.\n\n## Operational Directives & Guardrails\n- **Strict Infrastructure Domain**: Operate exclusively on workflows (\\`.github/workflows/\\`, \\`templates/ci/\\`), container files (\\`Dockerfile*\\`, \\`docker-compose*.yml\\`), IaC manifests, and support scripts (\\`scripts/\\`).\n- **NON-INVASION GUARDRAIL**: STRICTLY FORBIDDEN from modifying or refactoring application source code files (\\`src/\\`, \\`packages/*/src/\\`). Your responsibility is pipelines and scaffolding, never business logic.\n- **Infrastructure Dependency Policy**: Verify licenses of dependencies, Docker base images, and third-party CI actions against \\`license-policy.yaml\\`.\n- **Gate Preservation**: Ensure any pipeline optimization keeps all existing deterministic Quality Gates intact.\n- If autonomy is $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`, conclude by emitting the Workflow Handoff block (\\`templates/workflow/agent-handoff.template.md\\`) to the human Tech Lead or Release Manager, opening the Human Action Window. In \\`AUTONOMOUS\\` mode, omit interactive handoff.`,\n },\n];\n\nexport function renderAntigravityAgentFile(agent: SpecializedAgentTemplate): string {\n return `---\\nname: ${agent.id}\\ndescription: >-\\n ${agent.description}\\n---\\n\\n# ${agent.id} (${agent.title})\\n\\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](../../process/09_agent_protocols.md) and [\\`process/01_governance_and_roles.md\\`](../../process/01_governance_and_roles.md).\\n\\n${agent.body}\\n`;\n}\n\nexport function renderClaudeAgentFile(agent: SpecializedAgentTemplate): string {\n return `---\\nname: ${agent.id}\\ndescription: ${agent.description}\\n---\\n\\n# ${agent.id} (${agent.title})\\n\\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](../../process/09_agent_protocols.md) and [\\`process/01_governance_and_roles.md\\`](../../process/01_governance_and_roles.md).\\n\\n${agent.body}\\n`;\n}\n\nexport function renderCopilotAgentFile(agent: SpecializedAgentTemplate): string {\n return `---\\nname: ${agent.id}\\ndescription: ${agent.description}\\n---\\n\\n# ${agent.id} (${agent.title})\\n\\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](../../process/09_agent_protocols.md) and [\\`process/01_governance_and_roles.md\\`](../../process/01_governance_and_roles.md).\\n\\n${agent.body}\\n`;\n}\n\nexport function renderCursorAgentFile(agent: SpecializedAgentTemplate): string {\n return `---\\ndescription: ${agent.id} (${agent.title}) - ${agent.description}\\nglobs: ${agent.globs}\\nalwaysApply: false\\n---\\n\\n# ${agent.id} (${agent.title})\\n\\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](../../process/09_agent_protocols.md) and [\\`process/01_governance_and_roles.md\\`](../../process/01_governance_and_roles.md).\\n\\n${agent.body}\\n`;\n}\n\nexport const STARTER_ANTIGRAVITY_RULES = `# Google Antigravity & Gemini CLI Rules - AI-SDLC Framework\n\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](../../process/09_agent_protocols.md) and [\\`process/01_governance_and_roles.md\\`](../../process/01_governance_and_roles.md).\n\nThis file defines the operational rules and specialized role mappings for Google Antigravity and Gemini CLI-based agents within the AI-SDLC ecosystem.\n\n---\n\n## 1. The 5 Unbreakable Commandments of Agents | Los 5 Mandamientos Inquebrantables de los Agentes\n\n1. **FORBIDDEN TO AUTO-APPROVE OR AUTO-MERGE | PROHIBIDO AUTO-APROBAR O AUTO-FUSIONAR**: No agent may auto-approve PRs or perform direct merges to protected branches (\\`main\\`, \\`release/*\\`). Only a human engineer may approve or merge.\n2. **FORBIDDEN TO INVENT PRODUCT OR ARCHITECTURE DECISIONS**: When facing ambiguous requirements, formulate clarifying questions (\\`open-questions\\`). Never assume unspecified intentions.\n3. **FORBIDDEN TO INTRODUCE DEPENDENCIES WITHOUT LICENSE INSPECTION**: Always consult \\`license-policy.yaml\\`. Dependencies with viral licenses (\\`GPL\\`/\\`AGPL\\`) or commercial paid licenses (\\`BSL\\`/\\`SSPL\\`) are strictly forbidden without authorization.\n4. **FORBIDDEN TO IGNORE CYBERSECURITY (SECURITY-BY-DEFAULT)**: Validate inputs, sanitize data, and add mitigation tests (\\`SEC-TEST-*\\`). Disabling linters or suppressing typing errors is prohibited.\n5. **MANDATORY CRYPTOGRAPHIC CITATION**: Every derived artifact must cite upstream artifacts using canonical identifiers and their Unix LF-normalized SHA-256 cryptographic hashes.\n\n---\n\n## 2. Specialized Roles Mapping\n\n### 1. \\`agent-product-analyst\\` (Product Analyst / Scribe)\n- **Mission**: Assist in defining and refining the product model using ProductShape.\n- **Input**: Business intent or natural language specification.\n- **Output**: Markdown artifacts with YAML frontmatter compliant with \\`schemas/product/\\` (\\`ACT-*\\`, \\`UC-*\\`, \\`FR-*\\`, \\`QR-*\\`, \\`BR-*\\`).\n- **Guardrails**:\n - \\`status\\` always starts in \\`draft\\`.\n - In \\`UC-*\\`, format section \\`1. Intent and Outcome\\` under the standard English structure: \\`As a <ACT-ID>... I want <action>... To <outcome>...\\`.\n - Mandatory Gherkin criteria with \\`@<ID> @automated @regression\\`.\n - Run \\`pnpm run verify:schemas\\` and \\`pnpm run verify:duplicates\\` before delivering the draft.\n\n### 2. \\`agent-threat-modeler\\` (Threat Modeler and Security Specialist)\n- **Mission**: Analyze use cases and proactively model adversaries, STRIDE attack vectors, and OWASP ASVS mitigations, both at product level and in the technical security feedback loop over architecture.\n- **Input**: Use cases \\`UC-*\\`, functional requirements \\`FR-*\\`, or architecture components (\\`CMP-*\\`, Mermaid diagrams, ADRs).\n- **Output**: Cybersecurity triad (\\`ACT-THREAT-*\\`, \\`ABUSE-*\\`, \\`SEC-REQ-*\\`) compliant with \\`schemas/security/\\`.\n- **Guardrails**:\n - \\`status\\` always starts in \\`draft\\`.\n - Negative BDD attack and rejection scenarios tagged with \\`@security @mitigation\\`.\n - Assignment of Zero Trust enclaves \\`SEC-ENC-*\\`.\n\n### 3. \\`agent-system-architect\\` (System Architect)\n- **Mission**: Translate the approved product definition into a modular technical architecture based on arc42 enriched with NAF v4.\n- **Output**: Architecture components (\\`CMP-*\\`), Mermaid diagrams, and immutable \\`ADR-*\\` records compliant with \\`schemas/architecture/\\`.\n- **Guardrails**:\n - Every \\`CMP-*\\` must declare \\`satisfies-requirements\\` linking \\`FR-*\\`, \\`QR-*\\`, and \\`SEC-REQ-*\\`.\n - Emit a return handoff to \\`agent-threat-modeler\\` in the technical security feedback loop when infrastructure or persistence decisions introduce new attack vectors.\n\n### 4. \\`agent-qa-engineer\\` (QA Engineer and SDET)\n- **Mission**: Translate approved requirements (\\`FR-*\\`, \\`SEC-REQ-*\\`, \\`QR-*\\`) into comprehensive FAILING (red) BDD/Gherkin test suites, before \\`agent-developer\\` writes production code.\n- **Input**: Approved requirements from the \\`handoff.yaml\\` sidecar (\\`HOF-*\\`).\n- **Output**: Failing Gherkin scenarios covering: nominal case, boundary cases, out-of-range cases, and conditional categories (security, performance, idempotency, postconditions, interface contract).\n- **Guardrails**:\n - FORBIDDEN to include production code or anticipate implementations.\n - Every \\`FR-*\\` must have at least nominal + boundary + out-of-range scenarios; missing these blocks handoff to \\`agent-developer\\`.\n - Mandatory tags: \\`@<FR-ID> @automated @regression\\`.\n - Run \\`pnpm run verify:testing\\` before emitting handoff.\n\n### 5. \\`agent-developer\\` (Software Developer)\n- **Mission**: Implement atomic tasks from SDD specifications (\\`tasks.md\\`) with clean, strictly typed code and thorough tests.\n- **Directives**:\n - Respect the autonomy mode assigned in \\`tasks.md\\` (\\`AUTONOMOUS\\`, \\`HUMAN_REVIEW_PLAN\\`, \\`AMBIGUOUS\\`, \\`HIGH_RISK_MANUAL\\`).\n - Make tests delivered by \\`agent-qa-engineer\\` pass green without altering them to accommodate code.\n - Respect \\`quality-policy.yaml\\` thresholds: CC $\\\\le 10$, Cognitive $\\\\le 15$, MI $\\\\ge 50$, LOC $\\\\le 40$.\n - Run pre-flight with auto-fix: \\`pnpm run check:fix\\` and full verification: \\`pnpm run verify:all\\`.\n - Upon completing green implementation, suggest handoff to \\`agent-expert-user\\` for post-development functional validation prior to security audit.\n\n### 6. \\`agent-security-auditor\\` (Adversarial Code Auditor)\n- **Mission**: Rigorously examine Pull Requests for business logic vulnerabilities, injection vectors, secret leaks, and authorization flaws as part of the Pre-Merge Audit Triad.\n- **Directives**:\n - Analyze code diffs with an attacker mindset and run \\`pnpm run verify:security\\`.\n - Issue findings with CVSS v3.1 severity scoring and block any PR introducing CRITICAL or HIGH security risks.\n\n### 7. \\`agent-compliance-checker\\` (Open Source License Compliance Auditor)\n- **Mission**: Audit dependency manifests and ensure every direct and transitive third-party package complies with \\`license-policy.yaml\\` as part of the Pre-Merge Audit Triad.\n- **Directives**:\n - Verify SPDX identifiers via \\`pnpm run verify:licenses\\`, immediately blocking viral (\\`GPL\\`, \\`AGPL\\`) or unapproved commercial (\\`BSL\\`, \\`SSPL\\`) licenses.\n\n### 8. \\`agent-expert-user\\` (Expert User and Domain Evaluator)\n- **Mission**: Contrast design and specifications (design phase) and functionally validate finished software against \\`UC-*\\` and \\`FR-*\\` (post-development phase).\n- **Directives**:\n - Design mode (upstream): Adopt the primary actor's profile under stressful field conditions, applying bimodal discrimination (strict MVP core vs. roadmap suggestion backlog in \\`templates/product/user-design-feedback.template.md\\`).\n - Functional validation mode (downstream / pre-PR / post-development functional validation): Thoroughly contrast interface and actual CLI execution against \\`UC-*\\` and \\`FR-*\\` acceptance criteria before pre-merge security audit.\n - Emit handoff block suggesting \\`agent-code-reviewer\\` / \\`agent-security-auditor\\` if compliant, or return to \\`agent-developer\\` on functional drift.\n\n### 9. \\`agent-code-reviewer\\` (Technical and Architectural Code Reviewer)\n- **Mission**: Audit Pull Requests evaluating code cleanliness, adherence to SOLID, DRY, YAGNI principles, design patterns, and respect for complexity and maintainability thresholds (\\`quality-policy.yaml\\`), forming part of the Pre-Merge Audit Triad.\n- **Directives**:\n - Respect \\`quality-policy.yaml\\` thresholds: CC $\\\\le 10$, Cognitive $\\\\le 15$, MI $\\\\ge 50$, LOC $\\\\le 40$.\n - Detect improper coupling, code smells, magic numbers, ambiguous names, and encapsulation violations.\n - Flag premature abstractions and speculative code violating YAGNI.\n - Coordinate Pre-Merge Audit Triad with \\`agent-security-auditor\\` and \\`agent-compliance-checker\\`.\n - Classify findings into: \\`[BLOCKING]\\` (quality violation or broken pattern), \\`[CLEAN_CODE_SUGGESTION]\\` (non-blocking improvement), and \\`[COMPLIANT]\\`.\n\n### 10. \\`agent-devops\\` (Automation and Infrastructure Engineer)\n- **Mission**: Maintain, evolve, and audit automated project infrastructure: CI/CD workflows, Docker containers, IaC manifests, and support scripts.\n- **Directives**:\n - Strict infrastructure domain: Operates exclusively in \\`.github/workflows/\\`, \\`Dockerfile*\\`, \\`docker-compose*.yml\\`, IaC manifests, and \\`scripts/\\`.\n - **NON-INVASION GUARDRAIL**: STRICTLY FORBIDDEN from modifying or refactoring application source code files (\\`src/\\`, \\`packages/*/src/\\`). Your responsibility is the pipeline and scaffolding, never application business logic.\n - Infrastructure dependency policy: Verify licenses of dependencies, base images, and third-party actions according to \\`license-policy.yaml\\`.\n - Gate preservation: Ensure pipeline optimizations preserve all existing deterministic Quality Gates intact.\n\n---\n\n## 3. Git 4-Tier Hierarchy and Commit Conventions\n- \\`task/<PARENT-ID>/<TSK-ID>-<slug>\\` $\\\\rightarrow$ \\`feat/<FEAT-ID>-<slug>\\` $\\\\rightarrow$ \\`release/vX.Y.Z\\` $\\\\rightarrow$ \\`main\\`.\n- Mandatory commit trailers injection:\n \\`\\`\\`text\n Author-Type: agent\n AI-Model: gemini-1.5-pro / gemini-2.0-flash\n Task-ID: TSK-XXX\n Change-ID: CHG-XXX\n \\`\\`\\`\n\n---\n\n## 4. Workflow Handoff Protocol and Human Action Window | Ventana de Acción Humana\n- **Conditional Activation Rule by Autonomy**:\n - 🟢 **\\`AUTONOMOUS\\`** (or exclusive final supervision in PR/CI): **OMITTED**. Do not request or emit interactive handoff to avoid interrupting unattended execution.\n - 🟡 **Autonomy $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`** (\\`HUMAN_REVIEW_PLAN\\`, \\`AMBIGUOUS\\`, \\`HIGH_RISK_MANUAL\\`): **MANDATORY**. Emit the Workflow Handoff block compliant with [\\`templates/workflow/agent-handoff.template.md\\`](../../templates/workflow/agent-handoff.template.md) and **STOP**.\n- **Block Contents**: Declare produced deliverables, recommend the next role in workflow (\\`agent-threat-modeler\\`, \\`agent-system-architect\\`, \\`agent-qa-engineer\\`, \\`agent-developer\\`, \\`agent-expert-user\\`, \\`agent-code-reviewer\\`, \\`agent-security-auditor\\`, \\`agent-compliance-checker\\`, \\`agent-devops\\`, etc.), provide suggested invocation prompt, and keep **the Human Action Window open at all times for the human user to take action** (review, edit by hand, pause/reroute, or delegate).\n`;\n\nexport const STARTER_CURSOR_CORE_RULES = `---\ndescription: Global canonical directives, 5 unbreakable commandments, and AI-SDLC pre-flight\nglobs: *\nalwaysApply: true\n---\n\n# Global AI-SDLC Rules (Core)\n\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](process/09_agent_protocols.md) and [\\`process/01_governance_and_roles.md\\`](process/01_governance_and_roles.md).\n\n## 1. The 5 Unbreakable Commandments of Agents | Los 5 Mandamientos Inquebrantables de los Agentes\nEvery agent operating in this repository must strictly observe the following guardrails:\n1. **FORBIDDEN TO AUTO-APPROVE OR AUTO-MERGE | PROHIBIDO AUTO-APROBAR O AUTO-FUSIONAR**: Do not approve PRs or execute direct merges to protected branches (\\`main\\`, \\`release/*\\`). Approval is exclusively reserved for human reviewers.\n2. **FORBIDDEN TO INVENT PRODUCT OR ARCHITECTURE DECISIONS**: When facing ambiguity, formulate open questions (\\`open-questions\\`). Never assume undocumented requirements.\n3. **FORBIDDEN TO INTRODUCE DEPENDENCIES WITHOUT LICENSE INSPECTION**: Always verify \\`license-policy.yaml\\`. Viral dependencies (GPL/AGPL) or commercial paid dependencies (BSL/SSPL) are strictly forbidden without explicit human approval.\n4. **FORBIDDEN TO IGNORE CYBERSECURITY (SECURITY-BY-DEFAULT)**: Validate inputs, apply least privilege, and accompany every change with security tests (\\`SEC-TEST-*\\`). Suppressing linters or tests to force a green pipeline is prohibited.\n5. **MANDATORY CRYPTOGRAPHIC CITATION**: Link specifications using immutable identifiers and Unix LF-normalized SHA-256 hashes.\n\n## 2. Pre-Flight Verification Commands\nBefore finalizing changes or proposing commits:\n- Pre-flight with auto-fix: \\`pnpm run check:fix\\` (or \\`npx aisdlc check --fix\\`)\n- Full verification: \\`pnpm run verify:all\\` (or \\`npx aisdlc verify all\\`)\n- Unit tests: \\`pnpm test\\`\n- Strict typing: \\`pnpm run typecheck\\`\n\n## 3. Git 4-Tier Hierarchy\n- Tier 1: \\`main\\` (Production)\n- Tier 2: \\`release/vX.Y.Z\\` (Frozen release)\n- Tier 3: \\`feat/<FEAT-ID>-<slug>\\` / \\`bug/<BUG-ID>-<slug>\\` (Feature)\n- Tier 4: \\`task/<PARENT-ID>/<TSK-ID>-<slug>\\` (Atomic task)\n\n## 4. Specialized Roles Mapping\n| Role | Mission (summary) |\n| :--- | :--- |\n| \\`agent-product-analyst\\` | ProductShape artifacts (\\`ACT-*\\`, \\`UC-*\\`, \\`FR-*\\`, \\`QR-*\\`, \\`BR-*\\`); status starts \\`draft\\`. |\n| \\`agent-threat-modeler\\` | STRIDE/OWASP threat triad (\\`ACT-THREAT-*\\`, \\`ABUSE-*\\`, \\`SEC-REQ-*\\`). |\n| \\`agent-system-architect\\` | Modular arc42 + NAF v4 architecture (\\`CMP-*\\`, Mermaid diagrams, \\`ADR-*\\`). |\n| \\`agent-qa-engineer\\` | FAILING BDD/Gherkin suites before \\`agent-developer\\` writes code. |\n| \\`agent-developer\\` | Atomic tasks from \\`tasks.md\\`; respects autonomy mode; runs \\`pnpm run check:fix\\` + \\`pnpm run verify:all\\`. |\n| \\`agent-security-auditor\\` | Adversarial PR security audit, SAST, secrets, and CVSS v3.1 evaluation. |\n| \\`agent-compliance-checker\\` | SPDX license compliance audit against \\`license-policy.yaml\\`. |\n| \\`agent-expert-user\\` | Bimodal MVP evaluation (design) and functional validation against \\`UC-*\\` and \\`FR-*\\` (pre-PR). |\n| \\`agent-code-reviewer\\` | PR audit (SOLID, DRY, YAGNI): \\`[BLOCKING]\\` / \\`[CLEAN_CODE_SUGGESTION]\\` / \\`[COMPLIANT]\\`. |\n| \\`agent-devops\\` | CI/CD, Docker, IaC only — **FORBIDDEN** to touch \\`src/\\` or \\`packages/*/src/\\`. |\n\n## 5. Task Autonomy Modes (\\`tasks.md\\`)\n- 🟢 **\\`AUTONOMOUS\\`**: Low risk. Implement directly, omit handoff block.\n- 🟡 **\\`HUMAN_REVIEW_PLAN\\`**: Medium risk. Emit Workflow Handoff block, wait for approval.\n- 🟠 **\\`AMBIGUOUS\\`**: Blocked. Request human clarification.\n- 🔴 **\\`HIGH_RISK_MANUAL\\`**: Critical risk. Human-only execution.\n\n## 6. Workflow Handoff Protocol and Human Action Window | Ventana de Acción Humana\n- **Conditional Activation**:\n * 🟢 **\\`AUTONOMOUS\\`** (or PR/CI supervision): **OMITTED**. Do not request or emit interactive handoff.\n * 🟡 **Autonomy $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`** (\\`HUMAN_REVIEW_PLAN\\`, \\`AMBIGUOUS\\`, \\`HIGH_RISK_MANUAL\\`): **MANDATORY**. Emit Workflow Handoff block compliant with [\\`templates/workflow/agent-handoff.template.md\\`](templates/workflow/agent-handoff.template.md) and **STOP**.\n- **Content**: Declare completed deliverables, recommend next role(s), provide suggested invocation prompt, and **keep the Human Action Window open for the human user to take action** (review, edit by hand, pause/reroute, or delegate).\n`;\n\nexport const STARTER_CURSOR_PRODUCT_RULES = `---\ndescription: Directives for SDD specifications editing, ProductShape artifacts, and Cybersecurity\nglobs: specs/**, templates/**, product/**, security/**\nalwaysApply: false\n---\n\n# Product and SDD Specification Directives\n\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](process/09_agent_protocols.md) and [\\`process/02_product_definition.md\\`](process/02_product_definition.md).\n\n## 1. Identifier Taxonomy and JSON Schemas\nEvery generated or modified artifact must follow canonical naming and satisfy its schema in \\`schemas/\\`:\n- Product Actors: \\`ACT-[SUFFIX]\\` (\\`schemas/product/actor.schema.json\\`)\n- Use Cases: \\`UC-[SUFFIX]\\` (\\`schemas/product/use-case.schema.json\\`)\n- Functional Requirements: \\`FR-[SUFFIX]-[NUM3]\\` (\\`schemas/product/requirement.schema.json\\`)\n- Quality Requirements: \\`QR-[SUFFIX]\\` (\\`schemas/product/requirement.schema.json\\`)\n- Business Rules: \\`BR-[SUFFIX]\\` (\\`schemas/product/business-rule.schema.json\\`)\n- Threat Actors: \\`ACT-THREAT-[SUFFIX]\\` (\\`schemas/security/threat-actor.schema.json\\`)\n- Abuse Cases: \\`ABUSE-[SUFFIX]\\` (\\`schemas/security/abuse-case.schema.json\\`)\n- Security Requirements: \\`SEC-REQ-[SUFFIX]\\` (\\`schemas/security/security-req.schema.json\\`)\n\n## 2. \"AI as Scribe\" Protocol Rules\n- **Initial Status**: Every new artifact strictly starts with \\`status: draft\\`. Creating artifacts directly as \\`active\\` or \\`approved\\` is forbidden.\n- **Gherkin Acceptance Criteria**: In every \\`FR-*\\` requirement, include a \\`\\`\\`gherkin block with tags \\`@<ID> @automated @regression\\` and at least one \\`Scenario Outline\\` with an \\`Examples\\` data table.\n- **Security Mitigations**: Every \\`SEC-REQ-*\\` must include negative Gherkin tests (\\`@security @mitigation\\`).\n- **Use Cases (User Story Structure)**: In every \\`UC-*\\`, the \\`1. Intent and Outcome\\` section must be written using the standard English structure: \\`As a <ACT-ID>... I want <action>... To <outcome>...\\`.\n- **Deterministic Validation**: Run \\`pnpm run verify:schemas\\` and \\`pnpm run verify:duplicates\\` before presenting the draft to the human reviewer.\n`;\n\nexport const STARTER_CURSOR_QUALITY_RULES = `---\ndescription: Directives for code quality, architecture, TDD, and complexity limits\nglobs: packages/**, src/**, scripts/**, tests/**\nalwaysApply: false\n---\n\n# Code Quality and Architecture Directives\n\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](process/09_agent_protocols.md) and [\\`process/10_quality_management_and_release_gates.md\\`](process/10_quality_management_and_release_gates.md).\n\n## 1. Non-Negotiable Quality Thresholds (\\`quality-policy.yaml\\`)\n- **Cyclomatic Complexity (CC)**: $\\\\le 10$ per function (warning alert if $> 7$).\n- **Cognitive Complexity**: $\\\\le 15$ per function (warning if $> 10$).\n- **Maintainability Index (MI)**: $\\\\ge 50$ (target minimum $\\\\ge 65$).\n- **Function Length**: $\\\\le 40$ lines (warning if $> 30$).\n- If a function exceeds these limits, decompose logic into cohesive helper functions before completing the task.\n\n## 2. TDD Methodology and Unit Testing\n- Apply Test-Driven Development: generate unit tests before or alongside component logic.\n- Tag tests linked to requirements with header comments citing the ID (\\`FR-*\\` or \\`SEC-REQ-*\\`) to enable reverse traceability.\n- Suppressing types (\\`any\\`), linter rules (\\`eslint-disable\\`), or unit tests to force pipeline passage is prohibited.\n\n## 3. Open Source License Policy (\\`license-policy.yaml\\`)\n- Before adding any dependency to \\`package.json\\`, verify its SPDX identifier.\n- Only permissive dependencies are allowed (\\`MIT\\`, \\`Apache-2.0\\`, \\`BSD-2/3-Clause\\`, \\`ISC\\`).\n- Viral licenses (\\`GPL\\`, \\`AGPL\\`) or commercial licenses without approval (\\`BSL\\`, \\`SSPL\\`) are prohibited.\n\n## 4. Structured Output \\`--json\\`\n- Any extension to CLI commands must preserve compatibility with the \\`--json\\` flag and suppress ANSI escape codes when this flag is present.\n`;\n\nexport const STARTER_CLAUDE_RULES = `# Claude Code Instructions - AI-SDLC Monorepo\n\nCanonical Reference: [\\`process/09_agent_protocols.md\\`](process/09_agent_protocols.md) and [\\`process/01_governance_and_roles.md\\`](process/01_governance_and_roles.md).\n\nThis repository implements the **AI-SDLC** framework (Spec-Driven Development, deterministic quality governance, and OSS license compliance for human-agent collaboration).\n\n---\n\n## 1. The 5 Unbreakable Commandments of Agents | Los 5 Mandamientos Inquebrantables de los Agentes\n\n1. **FORBIDDEN TO AUTO-APPROVE OR AUTO-MERGE | PROHIBIDO AUTO-APROBAR O AUTO-FUSIONAR**: Never approve PRs or merge directly to \\`main\\` or protected branches. Approval is exclusively a human prerogative.\n2. **FORBIDDEN TO INVENT PRODUCT OR ARCHITECTURE DECISIONS**: When facing ambiguous requirements, formulate open questions (\\`open-questions\\`). Never assume undocumented behaviors.\n3. **FORBIDDEN TO INTRODUCE DEPENDENCIES WITHOUT LICENSE INSPECTION**: Always validate the SPDX identifier against \\`license-policy.yaml\\`. Viral libraries (\\`GPL\\`/\\`AGPL\\`) or paid commercial libraries (\\`BSL\\`/\\`SSPL\\`) are strictly forbidden without formal human approval.\n4. **FORBIDDEN TO IGNORE CYBERSECURITY (SECURITY-BY-DEFAULT)**: Validate inputs, sanitize data, and include mitigation tests (\\`SEC-TEST-*\\`). Disabling linters or suppressing typing errors (\\`any\\`, \\`@ts-ignore\\`) is prohibited.\n5. **MANDATORY CRYPTOGRAPHIC CITATION**: Every spec or sidecar must cite immutable identifiers and Unix LF-normalized SHA-256 digests.\n\n---\n\n## 2. Essential Execution and Pre-Flight Commands\n\n\\`\\`\\`bash\n# 1. Pre-flight with deterministic auto-fix (Gherkin & SHA-256 digests)\npnpm run check:fix\n\n# 2. Complete verification across all Quality Gates (Quality, RTM, Governance, Testing, Licenses, PDaC, Schemas, Duplicates, Security)\npnpm run verify:all\n\n# 3. Complete automated test suite (Vitest)\npnpm test\n\n# 4. Strict TypeScript typechecking\npnpm run typecheck\n\n# 5. Scaffolding for a new SDD change\npnpm run change:new <name> --id <chg-id>\n\n# 6. Canonical integration of a completed SDD change\nnpx tsx packages/cli/src/index.ts sdd integrate --change <chg-id>\n\\`\\`\\`\n\n---\n\n## 3. Specialized Roles Mapping\n\n### 1. \\`agent-product-analyst\\` (Product Analyst / Scribe)\n- **Mission**: Assist in defining and refining the product model using ProductShape.\n- **Input**: Business intent or natural language specification.\n- **Output**: Markdown artifacts with YAML frontmatter compliant with \\`schemas/product/\\` (\\`ACT-*\\`, \\`UC-*\\`, \\`FR-*\\`, \\`QR-*\\`, \\`BR-*\\`).\n- **Guardrails**: \\`status\\` always starts in \\`draft\\`. Mandatory Gherkin criteria with \\`@<ID> @automated @regression\\`.\n\n### 2. \\`agent-threat-modeler\\` (Threat Modeler and Security Specialist)\n- **Mission**: Analyze use cases and proactively model adversaries, STRIDE attack vectors, and OWASP ASVS mitigations, both at product level and in the technical security feedback loop over architecture.\n- **Output**: Cybersecurity triad (\\`ACT-THREAT-*\\`, \\`ABUSE-*\\`, \\`SEC-REQ-*\\`) compliant with \\`schemas/security/\\`.\n\n### 3. \\`agent-system-architect\\` (System Architect)\n- **Mission**: Translate the approved product definition into a modular technical architecture based on arc42 enriched with NAF v4 (\\`CMP-*\\`, Mermaid diagrams, \\`ADR-*\\`).\n- **Guardrails**: Declare \\`satisfies-requirements\\` on every \\`CMP-*\\` and trigger the technical security feedback loop toward \\`agent-threat-modeler\\` when infrastructure decisions introduce new attack vectors.\n\n### 4. \\`agent-qa-engineer\\` (QA Engineer and SDET)\n- **Mission**: Translate approved requirements (\\`FR-*\\`, \\`SEC-REQ-*\\`, \\`QR-*\\`) into comprehensive FAILING (red) BDD/Gherkin test suites, before \\`agent-developer\\` writes production code.\n- **Guardrails**: FORBIDDEN to include production code. Mandatory tags: \\`@<FR-ID> @automated @regression\\`.\n\n### 5. \\`agent-developer\\` (Software Developer)\n- **Mission**: Implement atomic tasks from SDD specifications (\\`tasks.md\\`) with clean, strictly typed code and thorough tests.\n- **Directives**: Respect the autonomy mode. Make tests delivered by \\`agent-qa-engineer\\` pass green. Run \\`pnpm run check:fix\\` and \\`pnpm run verify:all\\`.\n\n### 6. \\`agent-security-auditor\\` (Adversarial Code Auditor)\n- **Mission**: Examine Pull Requests for business logic vulnerabilities, injection vectors, secret leaks, and authorization flaws as part of the Pre-Merge Audit Triad.\n- **Directives**: Run \\`pnpm run verify:security\\`, evaluate CVSS v3.1 severity, and block CRITICAL/HIGH risks.\n\n### 7. \\`agent-compliance-checker\\` (Open Source License Compliance Auditor)\n- **Mission**: Audit dependency manifests against \\`license-policy.yaml\\` as part of the Pre-Merge Audit Triad.\n- **Directives**: Run \\`pnpm run verify:licenses\\`, blocking viral (\\`GPL\\`, \\`AGPL\\`) or unapproved commercial (\\`BSL\\`, \\`SSPL\\`) packages.\n\n### 8. \\`agent-expert-user\\` (Expert User and Domain Evaluator)\n- **Mission**: Contrast design and specifications (design phase) and functionally validate finished software against \\`UC-*\\` and \\`FR-*\\` (post-development functional validation phase).\n\n### 9. \\`agent-code-reviewer\\` (Technical and Architectural Code Reviewer)\n- **Mission**: Audit Pull Requests evaluating code cleanliness, adherence to SOLID, DRY, YAGNI principles, and respect for \\`quality-policy.yaml\\` thresholds, forming part of the Pre-Merge Audit Triad.\n- **Findings classification**: \\`[BLOCKING]\\`, \\`[CLEAN_CODE_SUGGESTION]\\`, \\`[COMPLIANT]\\`.\n\n### 10. \\`agent-devops\\` (Automation and Infrastructure Engineer)\n- **Mission**: Maintain, evolve, and audit automated project infrastructure: CI/CD workflows, Docker containers, IaC manifests, and support scripts.\n- **NON-INVASION GUARDRAIL**: STRICTLY FORBIDDEN from modifying application source code (\\`src/\\`, \\`packages/*/src/\\`).\n\n---\n\n## 4. Task Autonomy Modes (\\`tasks.md\\`)\n\n- 🟢 **\\`AUTONOMOUS\\`**: Low risk, isolated task. Implement code and tests directly. Omit interactive handoff block.\n- 🟡 **\\`HUMAN_REVIEW_PLAN\\`**: Medium risk. Design detailed plan, emit Workflow Handoff block, and wait for human confirmation before coding.\n- 🟠 **\\`AMBIGUOUS\\`**: Incomplete requirements. Blocked: request human clarification.\n- 🔴 **\\`HIGH_RISK_MANUAL\\`**: Critical risk (migrations, cryptography). Direct manual execution by humans only.\n\n---\n\n## 5. Git Workflow and Commit Rules with Trailers\n\n### 4-Tier Hierarchy\n1. **Tier 1 (\\`main\\`)**: Absolute stability and production readiness.\n2. **Tier 2 (\\`release/vX.Y.Z\\`)**: Release stabilization.\n3. **Tier 3 (\\`feat/<FEAT-ID>-<slug>\\` or \\`bug/<BUG-ID>-<slug>\\`)**: SDD delivery increment.\n4. **Tier 4 (\\`task/<PARENT-ID>/<TSK-ID>-<slug>\\`)**: Atomic implementation task.\n\n### Commit Format (Conventional Commits + Git Trailers)\n\\`\\`\\`text\nfeat(scope): concise imperative description (#issue)\n\nBody explaining the motivation and technical justification of the change.\n\nAuthor-Type: agent\nAI-Model: claude-3-7-sonnet\nTask-ID: TSK-001\nChange-ID: CHG-026-AGENT-NATIVE-CONFIGS\n\\`\\`\\`\n\n---\n\n## 6. Non-Negotiable Quality Thresholds (\\`quality-policy.yaml\\`)\n- **Cyclomatic Complexity (CC)**: $\\\\le 10$\n- **Cognitive Complexity**: $\\\\le 15$\n- **Maintainability Index (MI)**: $\\\\ge 50$\n- **Lines per Function**: $\\\\le 40$\n- Deterministic CLI output: every \\`verify\\` command supports \\`--json\\` without ANSI escape codes.\n\n---\n\n## 7. Workflow Handoff Protocol and Human Action Window | Ventana de Acción Humana\n- **Conditional Activation**:\n - 🟢 **\\`AUTONOMOUS\\`** (or PR/CI final supervision): **OMITTED**. Uninterrupted continuous execution.\n - 🟡 **Autonomy $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`** (\\`HUMAN_REVIEW_PLAN\\`, \\`AMBIGUOUS\\`, \\`HIGH_RISK_MANUAL\\`): **MANDATORY**. Emit Workflow Handoff block ([\\`templates/workflow/agent-handoff.template.md\\`](templates/workflow/agent-handoff.template.md)) and **STOP**.\n- **Content**: Completed deliverables, suggested next role(s), copy-paste ready invocation prompt, and **an open Human Action Window for the user to take action** (review, edit by hand, pause/reroute, or delegate).\n`;\n\nexport const STARTER_COPILOT_RULES = `<!--\n AI-SDLC: Canonical Instructions for GitHub Copilot (Chat & Workspace)\n Canonical Reference: process/09_agent_protocols.md and process/01_governance_and_roles.md\n-->\n\n# GitHub Copilot Instructions - AI-SDLC Framework\n\nYou operate as an assistant agent in the **AI-SDLC** repository. You are not a simple text auto-completer: you are a specialized technical worker subject to normative directives, deterministic autonomy boundaries, and strict traceability.\n\n---\n\n## 1. The 5 Unbreakable Commandments of Agents | Los 5 Mandamientos Inquebrantables de los Agentes\n\n1. **FORBIDDEN TO AUTO-APPROVE OR AUTO-MERGE | PROHIBIDO AUTO-APROBAR O AUTO-FUSIONAR**:\n - Never execute PR approvals or direct merges to stable branches (\\`main\\`, \\`release/*\\`). Approval is an exclusive human prerogative.\n2. **FORBIDDEN TO INVENT PRODUCT OR ARCHITECTURE DECISIONS**:\n - If a requirement is ambiguous or incomplete, formulate open questions (\\`open-questions\\`) to the human user. Guessing undocumented intentions is forbidden.\n3. **FORBIDDEN TO INTRODUCE DEPENDENCIES WITHOUT LICENSE INSPECTION**:\n - Before suggesting or adding dependencies to manifests (\\`package.json\\`, etc.), validate their SPDX identifier against \\`license-policy.yaml\\`. Adding viral (\\`GPL\\`, \\`AGPL\\`) or commercial paid (\\`BSL\\`, \\`SSPL\\`) licenses without human authorization is prohibited.\n4. **FORBIDDEN TO IGNORE CYBERSECURITY (SECURITY-BY-DEFAULT)**:\n - All code must enforce least privilege, sanitize external inputs, and include mitigation tests (\\`SEC-TEST-*\\`). Suppressing types (\\`any\\`), linters, or tests to force a green pipeline is prohibited.\n5. **MANDATORY CRYPTOGRAPHIC CITATION**:\n - Every specification, design, or sidecar must reference canonical identifiers and their Unix LF-normalized SHA-256 digests.\n\n---\n\n## 2. Git 4-Tier Branch Hierarchy\n\nWhen proposing or creating branches, respect the strict hierarchical structure:\n- **Tier 1**: \\`main\\` (Protected production branch with maximum stability).\n- **Tier 2**: \\`release/vX.Y.Z\\` (Release consolidation and scope freeze branch).\n- **Tier 3**: \\`feat/<FEAT-ID>-<slug>\\` or \\`bug/<BUG-ID>-<slug>\\` (SDD increment or feature branch).\n- **Tier 4**: \\`task/<PARENT-ID>/<TSK-ID>-<slug>\\` (Atomic development task branch).\n\n---\n\n## 3. Pre-Flight Commands and Quality Gates\n\nBefore concluding any intervention or suggesting a commit:\n- **Unified pre-flight with auto-fix**: \\`pnpm run check:fix\\` (or \\`npx aisdlc check --fix\\`).\n- **Complete Quality Gates verification**: \\`pnpm run verify:all\\` (or \\`npx aisdlc verify all\\`).\n- **Unit test suite**: \\`pnpm test\\`.\n- **Strict typing**: \\`pnpm run typecheck\\`.\n\nNon-Negotiable Quality Thresholds (\\`quality-policy.yaml\\`):\n- Cyclomatic Complexity (CC) $\\\\le 10$.\n- Cognitive Complexity $\\\\le 15$.\n- Maintainability Index (MI) $\\\\ge 50$.\n- Maximum lines per function $\\\\le 40$.\n\n---\n\n## 4. Task Autonomy Modes (\\`tasks.md\\`)\n\n- 🟢 **\\`AUTONOMOUS\\`**: Low risk, isolated task. Implement code and tests directly. Omit interactive handoff block.\n- 🟡 **\\`HUMAN_REVIEW_PLAN\\`**: Medium risk. Design detailed plan, emit Workflow Handoff block, and wait for human confirmation before coding.\n- 🟠 **\\`AMBIGUOUS\\`**: Incomplete requirements. Blocked: request human clarification.\n- 🔴 **\\`HIGH_RISK_MANUAL\\`**: Critical risk (migrations, cryptography). Direct manual execution by humans only.\n\n---\n\n## 5. Workflow Handoff Protocol and Human Action Window | Ventana de Acción Humana\n- **Conditional Activation**:\n * 🟢 **\\`AUTONOMOUS\\` Mode** (or PR/CI final supervision): **OMITTED**. Do not interrupt unattended execution.\n * 🟡 **Autonomy $\\\\ge$ \\`HUMAN_REVIEW_PLAN\\`** (\\`HUMAN_REVIEW_PLAN\\`, \\`AMBIGUOUS\\`, \\`HIGH_RISK_MANUAL\\`): **MANDATORY**. Emit Workflow Handoff block compliant with [\\`templates/workflow/agent-handoff.template.md\\`](../templates/workflow/agent-handoff.template.md) and **STOP**.\n- **Components**: Declare completed deliverables, recommend next roles (\\`agent-threat-modeler\\`, \\`agent-system-architect\\`, \\`agent-developer\\`, \\`agent-security-auditor\\`), provide suggested invocation prompt, and **keep the Human Action Window open at all times for the user to take action** (review, edit by hand, pause/reroute, or delegate).\n\n---\n\n## 6. Specialized Roles Mapping\n\n| Role | Mission (summary) |\n| :--- | :--- |\n| \\`agent-product-analyst\\` | ProductShape artifacts (\\`ACT-*\\`, \\`UC-*\\`, \\`FR-*\\`, \\`QR-*\\`, \\`BR-*\\`); \\`status\\` starts \\`draft\\`. |\n| \\`agent-threat-modeler\\` | STRIDE/OWASP threat triad (\\`ACT-THREAT-*\\`, \\`ABUSE-*\\`, \\`SEC-REQ-*\\`). |\n| \\`agent-system-architect\\` | Modular arc42 + NAF v4 architecture (\\`CMP-*\\`, Mermaid diagrams, \\`ADR-*\\`). |\n| \\`agent-qa-engineer\\` | FAILING BDD/Gherkin suites before \\`agent-developer\\` writes production code. |\n| \\`agent-developer\\` | Atomic tasks from \\`tasks.md\\`; autonomy mode must be respected; runs \\`pnpm run check:fix\\` + \\`pnpm run verify:all\\`. |\n| \\`agent-security-auditor\\` | Adversarial PR security audit, SAST, secrets, and CVSS v3.1 evaluation. |\n| \\`agent-compliance-checker\\` | SPDX license compliance audit against \\`license-policy.yaml\\`. |\n| \\`agent-expert-user\\` | Bimodal MVP evaluation (design) and functional validation against \\`UC-*\\` and \\`FR-*\\` (pre-PR). |\n| \\`agent-code-reviewer\\` | PR audit (SOLID, DRY, YAGNI): \\`[BLOCKING]\\` / \\`[CLEAN_CODE_SUGGESTION]\\` / \\`[COMPLIANT]\\`. |\n| \\`agent-devops\\` | CI/CD, Docker, IaC only — **FORBIDDEN** to touch \\`src/\\` or \\`packages/*/src/\\`. |\n\n---\n\n## 7. Canonical Reference\nTo consult full protocols, specialized prompts, and interface contracts:\n- [\\`process/09_agent_protocols.md\\`](../process/09_agent_protocols.md)\n- [\\`process/01_governance_and_roles.md\\`](../process/01_governance_and_roles.md)\n`;\n\nexport const STARTER_CURSOR_MCP = `{\\n \"mcpServers\": {\\n \"ai-sdlc\": {\\n \"command\": \"npx\",\\n \"args\": [\\n \"@aisdlc/mcp\"\\n ]\\n }\\n }\\n}\\n`;\n\nexport const STARTER_ANTIGRAVITY_MCP = `{\\n \"mcpServers\": {\\n \"ai-sdlc\": {\\n \"command\": \"npx\",\\n \"args\": [\\n \"@aisdlc/mcp\"\\n ]\\n }\\n }\\n}\\n`;\n\nexport const STARTER_VSCODE_MCP = `{\\n \"servers\": {\\n \"ai-sdlc\": {\\n \"command\": \"npx\",\\n \"args\": [\\n \"@aisdlc/mcp\"\\n ]\\n }\\n }\\n}\\n`;\n","/**\n * AI-SDLC: Starter templates for System Architecture (arc42 + NAF v4)\n */\n\nexport const STARTER_ARCH_ADR = `---\nid: ADR-001-DECISION-NAME\ntype: architecture-decision-record\ntitle: Clear Title of Technical Decision\nstatus: proposed # proposed, accepted, rejected, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\ndeciders:\n - \"Lead Architect Name\"\n - \"Tech Lead Name\"\ndecision-date: \"2026-09-03\"\naffects-components:\n - CMP-NAME-001\nsupersedes: null\nsuperseded-by: null\n---\n\n# ADR-001: Clear Title of Technical Decision\n\n## 1. Context and Problem Statement\nDescribe the technological context, requirements (\\`FR-*\\`, \\`QR-*\\`, \\`SEC-REQ-*\\`) driving the decision, and forces in tension (performance, cost, complexity, license compliance).\n\n## 2. Considered Technology Options\n1. **Option A**: [Pros and cons, OSS license regime].\n2. **Option B**: [Pros and cons, OSS license regime].\n\n## 3. Decision Outcome\nChosen **Option [A/B]** because [solid technical and business justification].\n\n## 4. Consequences\n- **Positive**: Latency reduction, compliance with \\`license-policy.yaml\\`.\n- **Negative / Trade-offs**: Higher initial memory footprint or additional instrumentation needed.\n\n---\n\n## 5. Revision History and Version Control\n\n| Version | Date | Deciders | Decision Status | Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-03 | Lead Architect & Tech Lead | Formal decision proposal | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_ARCHITECTURE_CONSTRAINTS = `---\nid: ARCH-CONSTR-001\ntype: architecture-constraints\ntitle: \"02. Architecture Constraints\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 2\nnaf-perspective: \"Architecture Constraints\"\nconstraints:\n - CON-TECH-001\n - ACON-ORG-001\nlicense-policy: \"license-policy.yaml\"\nsupersedes: null\nsuperseded-by: null\n---\n\n# 02. Architecture Constraints (arc42 Sec. 2 / NAF Constraints)\n\n## 1. Non-Negotiable Technical Constraints (\\`CON-*\\`)\nLimitations imposed by hardware, underlying platform, operating systems, network protocols, or binary compatibility:\n\n| Constraint ID | Constraint Name | Description and Technical Rationale |\n| :--- | :--- | :--- |\n| \\`CON-TECH-001\\` | Cross-Platform Compatibility | Mandatory support for Linux x86_64, ARM64, and Windows Server |\n| \\`CON-TECH-002\\` | Fixed Runtime and Toolchain | Execution on Node.js LTS 20+ and deterministic packaging with pnpm |\n| \\`CON-TECH-003\\` | Controlled Dynamic Memory | 512 MB maximum memory consumption limit per containerized process |\n\n---\n\n## 2. Organizational and Process Constraints (\\`ACON-*\\`)\nGovernance rules, organizational standards, and team conventions:\n\n| Constraint ID | Name | Binding Directive |\n| :--- | :--- | :--- |\n| \\`ACON-ORG-001\\` | 4-Tier Git Governance | Strict flow: task ➔ feat ➔ release ➔ main |\n| \\`ACON-ORG-002\\` | Inalienable Human Sovereignty | Strict ban on unattended AI auto-approval of PRs |\n\n---\n\n## 3. Open Source License Compliance (\\`LIC-POL-*\\`)\nIn accordance with \\`license-policy.yaml\\`:\n- **Permissive (ALLOW)**: MIT, Apache-2.0, BSD-2-Clause, BSD-3-Clause, ISC.\n- **Weak Copyleft (REVIEW_REQUIRED)**: LGPL-2.1+, MPL-2.0 (restricted to dynamically linked decoupled libraries).\n- **Strong Copyleft / Viral (DENY)**: GPLv2, GPLv3, AGPLv3 (strictly prohibited in dependency tree).\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial constraints definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_COMPONENT = `---\nid: CMP-NAME-001\ntype: component\ntitle: Architecture Component Name\nstatus: proposed # proposed, accepted, deprecated, retired\nversion: \"1.0.0\"\nschema-version: \"1.0\"\nlevel: 1 # 1: Bounded Context / Root System, 2: Subsystem / Container, 3: Executable Unit / DLL / Function\nbounded-context: \"Bounded Context Name\" # Domain bounded context in DDD\nparent-component: null # null for Level 1; parent component ID (CMP-PARENT-001) for Level > 1\nimplementation-type: service # service | dll | function | composite\nimplements-use-cases:\n - UC-ACTION-001\nsatisfies-requirements:\n - FR-FEATURE-001\n - SEC-REQ-CONTROL-001\nhosted-in-enclave: SEC-ENC-DMZ-001 # Optional: mandatory only if operating in physical/logical network enclave\ninterfaces:\n # By implementation-type:\n # - service: REST/HTTP, gRPC, WebSocket, Kafka, MQTT, IPC\n # - dll: C-ABI, Native-ABI, FFI\n # - function: Function-Call, In-Process API, CLI, GUI\n - name: \"API / Interface Contract\"\n protocol: \"WebSocket\"\n contract-spec: \"docs/architecture/08_cross_cutting/data_models/ingestion_asyncapi.yaml\"\nsupersedes: null\nsuperseded-by: null\n---\n\n# CMP-NAME-001: Architecture Component Name\n\n## 1. Purpose, Responsibility, and Bounded Context\nDefines the single responsibility of the component, its domain Bounded Context alignment, and abstraction level within the overall architecture.\n\n## 2. Structure and Connectivity Diagram (arc42 Sec. 5 / NAF v4)\n\\`\\`\\`mermaid\ngraph TD\n Client[Actor / External Client] -->|Protocol / Interface| CMP[CMP-NAME-001]\n CMP -->|In-Process / Network / C-ABI| SubModule[Subcomponent or Persistence]\n\\`\\`\\`\n\n## 3. Interface Contracts and Execution Policies\n- **Execution Mechanism**: Lifecycle specification (autonomous daemon/service, dynamic loading via \\`LoadLibrary\\`/\\`dlopen\\` if DLL, or direct function invocation).\n- **Fault Tolerance and Performance**: Memory bounds, target latency, concurrency, or failure isolation.\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-14 | Lead Architect | Initial component architecture definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_CONTEXT_AND_SCOPE = `---\nid: ARCH-CTX-001\ntype: context-and-scope\ntitle: \"03. System Context and Scope\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 3\nnaf-perspective: \"Operational Perspective\"\noperational-exchanges:\n - OIE-CHANNEL-001\ncontext-boundaries:\n - CTX-PERIMETER-001\nsupersedes: null\nsuperseded-by: null\n---\n\n# 03. Context and Scope (arc42 Sec. 3 / NAF Operational)\n\n## 1. Business Context\nModels conceptual boundaries of the system with respect to users, collaborating external systems, and external data sources.\n\n### 1.1 Business Context Diagram\n\\`\\`\\`mermaid\ngraph LR\n User[Actor / End User] -->|Service Request| System([AI-SDLC System])\n System -->|Query / Enrichment| ExtService[External System / Partner API]\n System -->|Audit Record| SIEM[SIEM / Audit System]\n\\`\\`\\`\n\n### 1.2 Operational Information Exchanges (\\`OIE-*\\`)\n| Exchange ID | Source / Target | Payload / Message | Protocol / Channel | Format |\n| :--- | :--- | :--- | :--- | :--- |\n| \\`OIE-COMM-001\\` | User ➔ System | Operation Request | HTTPS / REST | JSON (Schema v1) |\n| \\`OIE-NOTIF-002\\`| System ➔ User | Events and Notifications | WebSocket / WSS | JSON Streaming |\n| \\`OIE-AUDIT-003\\`| System ➔ SIEM | Immutable Audit Trails | Syslog / TLS | RFC 5424 |\n\n---\n\n## 2. Technical Context and Perimeter Infrastructure\nModels physical and logical channels crossing system boundaries (DMZ networks, load balancers, firewalls, and reverse proxies).\n\n### 2.1 Technical Context Diagram\n\\`\\`\\`mermaid\ngraph TD\n Client[Client / Browser / App] -->|TLS 1.3 / Port 443| LB[Reverse Proxy / WAF]\n LB -->|mTLS / DMZ Internal Network| Gateway[API Gateway / Ingestion]\n Gateway -->|gRPC / IPC| Core[Domain Services]\n\\`\\`\\`\n\n---\n\n## 3. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial context and scope definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_CROSS_CUTTING_CONCEPTS = `---\nid: ARCH-CROSS-001\ntype: cross-cutting-concepts\ntitle: \"08. Cross-Cutting Concepts\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 8\nnaf-perspective: \"Information & Security\"\ndata-models:\n - DATA-MODEL-001\nsecurity-enclaves:\n - SEC-ENC-DMZ-001\nsecurity-policies:\n - SEC-POL-TLS-001\nsupersedes: null\nsuperseded-by: null\n---\n\n# 08. Cross-Cutting Concepts (arc42 Sec. 8 / NAF Information & Security)\n\n## 1. Cross-Cutting Security Concept and Zero Trust Model\nDescribes global security approach, authentication, authorization, and enclave isolation (\\`SEC-ENC-*\\`):\n\n### 1.1 Machine-to-Machine (M2M) Identity and Authentication\n- All inter-service communication requires mutual authentication (mTLS) with regularly rotated x509 certificates.\n- Private keys are safeguarded in secure enclaves (TPM, HSM, or centralized secret vaults).\n\n### 1.2 Binding Security Policies (\\`SEC-POL-*\\`)\n| Policy ID | Scope | Control Description |\n| :--- | :--- | :--- |\n| \\`SEC-POL-TLS-001\\` | Network Communications | Mandatory TLS 1.3 with modern cipher suites (ECDHE-ECDSA-AES256-GCM) |\n| \\`SEC-POL-ZERO-LEAK\\`| Data at Rest | AES-256 volume encryption and strict PII log masking |\n\n---\n\n## 2. Cross-Cutting Data Models and Schemas (\\`DATA-*\\`)\nSpecifies exchange schemas and canonical interfaces:\n\n| Model ID | Format / Schema | Specification Path | Purpose |\n| :--- | :--- | :--- | :--- |\n| \\`DATA-SCHEMA-001\\` | JSON Schema / OpenAPI 3.1 | \\`docs/architecture/08_cross_cutting/data_models/api.json\\` | External API contract |\n| \\`DATA-EVENT-002\\` | AsyncAPI / Protobuf | \\`docs/architecture/08_cross_cutting/data_models/events.yaml\\`| Internal async events |\n\n---\n\n## 3. Observability, Metrics, and Immutable Auditing\n- **Distributed Tracing**: W3C Trace Context (\\`traceparent\\`) injection via OpenTelemetry.\n- **Operational Metrics**: Prometheus RED metrics exposition (Rate, Errors, Duration).\n- **Structured Logging**: Deterministic JSON format with mandatory fields (\\`timestamp\\`, \\`level\\`, \\`trace_id\\`, \\`component_id\\`).\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial cross-cutting concepts definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_DEPLOYMENT_VIEW = `---\nid: ARCH-DEP-001\ntype: deployment-view\ntitle: \"07. Deployment and Infrastructure View\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 7\nnaf-perspective: \"Resource / Deployment\"\ndeployment-nodes:\n - RES-NODE-001\n - RES-CLUSTER-002\nenclaves-mapped:\n - SEC-ENC-DMZ-001\n - SEC-ENC-INTERNAL-002\nsupersedes: null\nsuperseded-by: null\n---\n\n# 07. Deployment View (arc42 Sec. 7 / NAF Resource Deployment)\n\n## 1. Infrastructure Topology and Network Enclaves\nMaps physical and logical component distribution across compute nodes, Kubernetes clusters, availability zones, and segmented security enclaves.\n\n### 1.1 Deployment Topology Diagram\n\\`\\`\\`mermaid\ngraph TD\n subgraph Internet[\"Public Internet\"]\n Users[Clients / Browsers]\n end\n\n subgraph EnclaveDMZ[\"Enclave: SEC-ENC-DMZ-001 (Perimeter Network)\"]\n WAF[WAF / Reverse Proxy]\n IngestService[\"Pod: CMP-INGEST-001 (Node.js LTS)\"]\n end\n\n subgraph EnclaveInternal[\"Enclave: SEC-ENC-INTERNAL-002 (Private Network)\"]\n CoreService[\"Pod: CMP-CORE-001 (Worker Pool)\"]\n DB[(DB Cluster: PostgreSQL / Storage)]\n end\n\n Users -->|HTTPS / TLS 1.3| WAF\n WAF -->|mTLS| IngestService\n IngestService -->|Isolated Internal Network| CoreService\n CoreService -->|Encrypted Connection / TLS| DB\n\\`\\`\\`\n\n---\n\n## 2. Node and Execution Resources Inventory (\\`RES-*\\` / \\`DEP-*\\`)\n\n| Resource ID | Node Type | Associated Enclave | Min CPU / RAM | Deployed Components |\n| :--- | :--- | :--- | :--- | :--- |\n| \\`RES-NODE-DMZ-01\\` | VM / Kubernetes Node | \\`SEC-ENC-DMZ-001\\` | 2 vCPU / 4 GB | \\`CMP-INGEST-001\\` |\n| \\`RES-NODE-CORE-01\\`| VM / Worker Node | \\`SEC-ENC-INTERNAL-002\\` | 4 vCPU / 8 GB | \\`CMP-CORE-001\\` |\n| \\`RES-NODE-DB-01\\` | Managed Instance | \\`SEC-ENC-INTERNAL-002\\` | 4 vCPU / 16 GB | Immutable Storage |\n\n---\n\n## 3. Network Policies and Traffic Isolation\n- **Perimeter Control**: External access strictly restricted to port 443 via WAF.\n- **Lateral Isolation**: Perimeter network (\\`SEC-ENC-DMZ-001\\`) has no direct visibility into internal database.\n- **Encrypted Channels**: All inter-node connections operate under mTLS with certificates issued by internal CA.\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial deployment view definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_GLOSSARY = `---\nid: ARCH-GLOSS-001\ntype: architecture-glossary\ntitle: \"12. Architecture Glossary and Terms Taxonomy\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 12\nnaf-perspective: \"Taxonomy & Terms\"\ncites-domain-terms:\n - TERM-TELEMETRY-001\n - TERM-ENCLAVE-001\ncites-bounded-contexts:\n - BC-CORE-GOVERNANCE\nsupersedes: null\nsuperseded-by: null\n---\n\n# 12. Architecture Glossary (arc42 Sec. 12 / NAF Taxonomy)\n\n## 1. Canonical Domain Terms (\\`TERM-*\\`)\nOfficial definitions and references for business and product domain terms:\n\n| Term / ID | Canonical Definition | Reference Bounded Context |\n| :--- | :--- | :--- |\n| \\`TERM-ENCLAVE-001\\` | Logically or physically isolated network zone with strict access and encryption policies | Architecture / Cybersecurity |\n| \\`TERM-HANDOFF-001\\` | Immutable canonical context handoff contract between development and engineering agents | AI-SDLC Governance |\n| \\`TERM-PDAC-001\\` | Product-Definition-as-Code: product modeling and 360° traceability in Git repositories | Core Engine |\n\n---\n\n## 2. Technical Abbreviations and Acronyms\nGlossary of architectural concepts used across system documentation:\n\n| Acronym | Full Meaning | Definition in System Context |\n| :--- | :--- | :--- |\n| **arc42** | Architecture Communication Template | Modular standard to document and communicate software architectures |\n| **NAF v4** | NATO Architecture Framework v4 | Enterprise architecture framework for critical, interoperable systems |\n| **ADR** | Architecture Decision Record | Immutable record of a significant architectural decision |\n| **mTLS** | Mutual Transport Layer Security | Bidirectional cryptographic certificate authentication |\n| **RTM** | Requirements Traceability Matrix | 360° traceability matrix between requirements, code, and tests |\n\n---\n\n## 3. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial architecture glossary definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_INTRODUCTION_AND_GOALS = `---\nid: ARCH-INTRO-001\ntype: architecture-introduction\ntitle: \"01. Introduction and System Goals\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 1\nnaf-perspective: \"Enterprise & Capability\"\ncites-product-actors:\n - ACT-NAME-001\ncites-quality-goals:\n - QR-LATENCY-001\n - QR-AVAILABILITY-001\ncites-use-cases:\n - UC-MAIN-001\nsupersedes: null\nsuperseded-by: null\n---\n\n# 01. Introduction and System Goals (arc42 Sec. 1 / NAF Enterprise)\n\n## 1. System Vision and Executive Summary\nDescribes core system mission, the business problem it solves, and value delivered to users and organization.\n\n### 1.1 Mission Statement\n> *The [System Name] system provides [key capability] for [target audience], guaranteeing [key security, performance, or reliability guarantees].*\n\n---\n\n## 2. Priority Quality Goals (Canonical ProductShape Citations)\nLists top 3 to 5 critical quality goals, linking directly to non-functional requirements (\\`QR-*\\`) defined in ProductShape:\n\n| Priority | Quality Goal | Requirement ID | Architectural Rationale |\n| :---: | :--- | :--- | :--- |\n| **1** | High Availability and Resilience | \\`QR-AVAILABILITY-001\\` | Decoupled architecture, active redundancy, and automated failover |\n| **2** | Real-Time Latency / Performance | \\`QR-LATENCY-001\\` | Asynchronous processing pipeline, low-latency queues |\n| **3** | Zero Trust Security | \\`SEC-REQ-AUTH-001\\` | Strict mTLS authentication and enclave isolation |\n\n---\n\n## 3. Stakeholder and Primary Actors Matrix\nMapping of system stakeholders with architectural expectations:\n\n| Role / Stakeholder | Actor ID | Architectural Expectations |\n| :--- | :--- | :--- |\n| **System Operators** | \\`ACT-OPERATOR-001\\` | Observability dashboards, early alerting, and auditability |\n| **End Users** | \\`ACT-USER-001\\` | Consistent response times and secure interfaces |\n| **Security Team** | \\`ACT-SEC-AUDITOR\\` | Zero secrets leakage and immutable access logging |\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial architecture goals definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_LEVEL_1_WHITEBOX = `---\nid: ARCH-L1-WHITEBOX-001\ntype: building-blocks-level-1\ntitle: \"05. Level 1 Building Blocks: Overall Whitebox\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 5\nnaf-perspective: \"Services & Systems (Level 1)\"\nbounded-contexts:\n - \"Core Domain Context\"\n - \"Supporting Context\"\ncontains-components:\n - CMP-NAME-001\n - CMP-NAME-002\nsupersedes: null\nsuperseded-by: null\n---\n\n# 05. Building Blocks View: Level 1 Whitebox (arc42 Sec. 5 / NAF Services & Systems)\n\n## 1. Overall System Decomposition (Level 1)\nPresents system decomposition into major subsystems, execution containers, and domain Bounded Contexts.\n\n### 1.1 Level 1 Whitebox Diagram\n\\`\\`\\`mermaid\ngraph TD\n subgraph BoundedContext_Core[\"Bounded Context: Core Domain\"]\n CMP_INGEST[\"CMP-INGEST: Data Ingestion\"]\n CMP_ENGINE[\"CMP-ENGINE: Rules Engine\"]\n end\n\n subgraph BoundedContext_Audit[\"Bounded Context: Auditing & Telemetry\"]\n CMP_OBSERVABILITY[\"CMP-OBS: Monitoring & Metrics\"]\n CMP_STORAGE[\"CMP-STORAGE: Immutable Storage\"]\n end\n\n Actor[Client / User] -->|External Protocol| CMP_INGEST\n CMP_INGEST -->|Internal Event / IPC| CMP_ENGINE\n CMP_ENGINE -->|Traces / Auditing| CMP_STORAGE\n CMP_OBSERVABILITY -.->|Scrape / Polling| CMP_ENGINE\n\\`\\`\\`\n\n---\n\n## 2. Bounded Contexts and Root Components Catalog\n\n| Bounded Context | Component ID | Implementation Type | Primary Responsibility |\n| :--- | :--- | :---: | :--- |\n| **Core Domain** | \\`CMP-INGEST\\` | \\`service\\` | TLS termination, syntactic payload validation, and filtering |\n| **Core Domain** | \\`CMP-ENGINE\\` | \\`service\\` | Business rules evaluation and deterministic computation |\n| **Auditing** | \\`CMP-STORAGE\\` | \\`composite\\` | Event persistence and immutable traceability |\n\n---\n\n## 3. Recursive Decomposition into Sub-Levels\nEach listed container or subsystem is detailed in its own component specification (\\`CMP-*.md\\`) conforming to \\`templates/architecture/component.template.md\\`:\n- **Level 2 (Subsystems / Containers)**: Autonomous services, microservices, daemons.\n- **Level 3 (Execution Units)**: DLLs, native plugins (.so, .dylib), pure domain functions.\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial L1 whitebox definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_QUALITY_REQUIREMENTS = `---\nid: ARCH-QUAL-001\ntype: quality-requirements\ntitle: \"10. Quality Requirements and Quality Tree\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 10\nnaf-perspective: \"Quality Perspective\"\ncites-quality-requirements:\n - QR-LATENCY-001\n - QR-AVAILABILITY-001\n - QR-MAINTAINABILITY-001\nsupersedes: null\nsuperseded-by: null\n---\n\n# 10. Quality Requirements (arc42 Sec. 10 / NAF Quality)\n\n## 1. Quality Tree\nHierarchical structure of key system quality attributes based on ISO/IEC 25010:\n\n\\`\\`\\`mermaid\ngraph TD\n QualityTree[System Quality] --> Performance[Performance Efficiency]\n QualityTree --> Reliability[Reliability & Resilience]\n QualityTree --> Security[Zero Trust Security]\n QualityTree --> Maintainability[As-Code Maintainability]\n\n Performance --> P1[Real-Time Latency: QR-LATENCY-001]\n Reliability --> R1[99.99% Availability: QR-AVAILABILITY-001]\n Security --> S1[Strict Authentication: SEC-REQ-AUTH-001]\n Maintainability --> M1[Cyclomatic Complexity <= 10: quality-policy.yaml]\n\\`\\`\\`\n\n---\n\n## 2. Assessable Quality Scenarios\nDefinition of concrete scenarios with stimulus, environment, response, and measure:\n\n| Requirement ID | ISO Attribute | Stimulus and Environment | System Response | Objective Measure |\n| :--- | :--- | :--- | :--- | :--- |\n| \\`QR-LATENCY-001\\` | Performance | Peak load of 10,000 req/s | Processing and queuing persistence | p95 latency < 50ms |\n| \\`QR-AVAILABILITY-001\\` | Reliability | Abrupt crash of 1 worker node | Automatic pod redistribution | Service downtime = 0s |\n| \\`QR-MAINTAINABILITY-001\\`| Maintainability | Submodule refactoring | Deterministic Release Gates execution | CC $\\\\le 10$, LOC $\\\\le 40$ |\n\n---\n\n## 3. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial quality tree definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_RISKS_AND_TECHNICAL_DEBT = `---\nid: ARCH-RISK-001\ntype: risks-and-technical-debt\ntitle: \"11. Architecture Risks and Technical Debt\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 11\nnaf-perspective: \"Risk & Technical Debt\"\nrisks:\n - RSK-SCALE-001\n - RSK-DEP-002\nsupersedes: null\nsuperseded-by: null\n---\n\n# 11. Risks and Technical Debt (arc42 Sec. 11 / NAF Risk & Debt)\n\n## 1. Architectural Risks Matrix (\\`RSK-*\\`)\nAssessment and tracking of identified technical risks:\n\n| Risk ID | Risk Description | Probability | Impact | Mitigation Strategy |\n| :--- | :--- | :---: | :---: | :--- |\n| \\`RSK-SCALE-001\\` | Database bottleneck during telemetry bursts | Medium | High | Horizontal partitioning and second-level cache |\n| \\`RSK-DEP-002\\` | Stale cryptographic runtime dependencies | Low | Critical | Automated SCA auditing in CI with daily scanning |\n| \\`RSK-MEM-003\\` | Memory degradation due to ingestion buffer accumulation | Medium | Medium | Continuous heap metrics monitoring and deterministic restarts |\n\n---\n\n## 2. Technical Debt and Incurred Compromises Log\nDocumentation of temporary shortcuts, provisional decisions, or pending refactorings:\n\n| Debt Item | Affected Component | Trade-off Justification | Payoff / Refactoring Plan |\n| :--- | :--- | :--- | :--- |\n| JSON serialization instead of binary | \\`CMP-INGEST-001\\` | Fast initial MVP delivery | Planned migration to Protobuf in release v2.0 |\n| Manual mock in integration tests | \\`packages/core\\` | Avoid external broker dependency in CI | Adoption of hermetic testcontainers |\n\n---\n\n## 3. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial risks and technical debt definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_RUNTIME_VIEW = `---\nid: ARCH-RUN-001\ntype: runtime-view\ntitle: \"06. Runtime View and Dynamic Behavior\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 6\nnaf-perspective: \"Behaviour & Sequences\"\nsequences:\n - SEQ-NOMINAL-001\n - SEQ-DEGRADED-002\nflows:\n - FLW-LIFECYCLE-001\nsatisfies-requirements:\n - FR-FEATURE-001\n - SEC-REQ-AUTH-001\nsupersedes: null\nsuperseded-by: null\n---\n\n# 06. Runtime View (arc42 Sec. 6 / NAF Behaviour)\n\n## 1. Nominal Scenario: Main Business Flow (\\`SEQ-NOMINAL-001\\`)\nDescribes sequence orchestration and component interactions for a typical user request or system event:\n\n\\`\\`\\`mermaid\nsequenceDiagram\n autonumber\n actor Client as External Client (ACT-CLIENT-001)\n participant Gateway as API Gateway (CMP-GATEWAY-001)\n participant Core as Domain Engine (CMP-CORE-001)\n participant Storage as Persistence / DB (CMP-STORAGE-001)\n\n Client->>Gateway: POST /api/v1/resource (Bearer Token / mTLS)\n Gateway->>Gateway: Validate input schema and authentication\n alt Validation Failed\n Gateway-->>Client: 400 Bad Request / 401 Unauthorized\n else Valid Input\n Gateway->>Core: In-process invocation / gRPC\n Core->>Core: Execute business rules\n Core->>Storage: Deterministic transaction (INSERT / UPDATE)\n Storage-->>Core: Confirmation (ACK)\n Core-->>Gateway: Business result\n Gateway-->>Client: 200 OK with response payload\n end\n\\`\\`\\`\n\n---\n\n## 2. Security Scenario / Abuse Mitigation (\\`SEQ-SEC-002\\`)\nModels behavior and isolation under malicious attempts or anomalous loads:\n\n\\`\\`\\`mermaid\nsequenceDiagram\n autonumber\n actor Attacker as Threat Actor (ACT-THREAT-001)\n participant DMZ as Ingestion Gateway (SEC-ENC-DMZ-001)\n participant SIEM as Audit and SIEM (CMP-AUDIT-001)\n\n Attacker->>DMZ: Anomalous request (missing credentials or oversized payload)\n DMZ->>DMZ: Detected by strict validation filter\n DMZ->>SIEM: Log anomaly event with IP and fingerprint\n DMZ-->>Attacker: 403 Forbidden / Connection aborted\n\\`\\`\\`\n\n---\n\n## 3. Dynamic Scenarios and Associated Requirements Matrix\n\n| Scenario ID | Type | Satisfied Requirements | Participating Components |\n| :--- | :---: | :--- | :--- |\n| \\`SEQ-NOMINAL-001\\` | Nominal | \\`FR-FEATURE-001\\` | \\`CMP-GATEWAY-001\\`, \\`CMP-CORE-001\\` |\n| \\`SEQ-SEC-002\\` | Security | \\`SEC-REQ-AUTH-001\\` | \\`CMP-GATEWAY-001\\`, \\`CMP-AUDIT-001\\` |\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial runtime views definition | CHG-ARCH-001 |\n`;\n\nexport const STARTER_ARCH_SOLUTION_STRATEGY = `---\nid: ARCH-STRAT-001\ntype: solution-strategy\ntitle: \"04. Architecture Solution Strategy\"\nstatus: proposed # proposed, accepted, deprecated, superseded\nversion: \"1.0.0\"\nschema-version: \"1.0\"\narc42-section: 4\nnaf-perspective: \"Service & Resource Strategy\"\nstrategies:\n - STRAT-ARCH-001\n - STRAT-DATA-001\nsupersedes: null\nsuperseded-by: null\n---\n\n# 04. Solution Strategy (arc42 Sec. 4 / NAF Strategy)\n\n## 1. Fundamental Structural Decisions (\\`STRAT-*\\`)\nDescribes global choices shaping the system and how they address priority quality goals:\n\n| Strategy ID | Fundamental Pattern / Decision | Technical Rationale & Trade-offs |\n| :--- | :--- | :--- |\n| \\`STRAT-ARCH-001\\` | Hexagonal Architecture / Ports and Adapters | Strict isolation of domain logic from I/O frameworks |\n| \\`STRAT-COMM-002\\` | Event-Driven Asynchronous Communication | Temporal decoupling between fast ingestion and batch processing |\n| \\`STRAT-SEC-003\\` | Zero Trust Verification | Every internal channel validates identity using mTLS and short-lived tokens |\n\n---\n\n## 2. Decomposition and Design Principles\n- **Domain-Driven Design (DDD)**: Identification of independent Bounded Contexts with decoupled canonical schemas.\n- **Immutability and Determinism**: Reproducible states, cryptographic hashing of inputs and outputs (PDaC).\n- **Error Handling and Graceful Degradation**: Circuit Breaker pattern and Dead-Letter-Queue (DLQ) retry mechanisms.\n\n---\n\n## 3. Quality Goals Fulfillment Matrix\nMapping of strategies against non-functional requirements (\\`QR-*\\`):\n\n| Quality Goal | Adopted Decision / Strategy | Guarantee Mechanism |\n| :--- | :--- | :--- |\n| \\`QR-LATENCY-REALTIME\\` | Zero-Copy binary ingestion and in-memory queues | Static buffers and HTTP/2 connection pooling |\n| \\`QR-AVAILABILITY-HIGH\\` | Stateless multi-zone deployment | Automated horizontal autoscaling with Health Checks |\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-09-24 | Lead Architect | Initial solution strategy definition | CHG-ARCH-001 |\n`;\n\nexport interface ArchTemplateDef {\n filename: string;\n content: string;\n isMinimal: boolean;\n}\n\nexport const ALL_ARCHITECTURE_TEMPLATES: ArchTemplateDef[] = [\n { filename: \"adr.template.md\", content: STARTER_ARCH_ADR, isMinimal: true },\n { filename: \"architecture-constraints.template.md\", content: STARTER_ARCH_ARCHITECTURE_CONSTRAINTS, isMinimal: false },\n { filename: \"component.template.md\", content: STARTER_ARCH_COMPONENT, isMinimal: true },\n { filename: \"context-and-scope.template.md\", content: STARTER_ARCH_CONTEXT_AND_SCOPE, isMinimal: false },\n { filename: \"cross-cutting-concepts.template.md\", content: STARTER_ARCH_CROSS_CUTTING_CONCEPTS, isMinimal: false },\n { filename: \"deployment-view.template.md\", content: STARTER_ARCH_DEPLOYMENT_VIEW, isMinimal: false },\n { filename: \"glossary.template.md\", content: STARTER_ARCH_GLOSSARY, isMinimal: false },\n { filename: \"introduction-and-goals.template.md\", content: STARTER_ARCH_INTRODUCTION_AND_GOALS, isMinimal: false },\n { filename: \"level-1-whitebox.template.md\", content: STARTER_ARCH_LEVEL_1_WHITEBOX, isMinimal: false },\n { filename: \"quality-requirements.template.md\", content: STARTER_ARCH_QUALITY_REQUIREMENTS, isMinimal: false },\n { filename: \"risks-and-technical-debt.template.md\", content: STARTER_ARCH_RISKS_AND_TECHNICAL_DEBT, isMinimal: false },\n { filename: \"runtime-view.template.md\", content: STARTER_ARCH_RUNTIME_VIEW, isMinimal: false },\n { filename: \"solution-strategy.template.md\", content: STARTER_ARCH_SOLUTION_STRATEGY, isMinimal: false },\n];\n\nexport const VALID_ARCHITECTURE_GRANULARITIES = ['minimal', 'full', 'complete', 'none'] as const;\nexport type ArchitectureGranularity = (typeof VALID_ARCHITECTURE_GRANULARITIES)[number];\n\nexport function getArchitectureTemplates(\n granularity: ArchitectureGranularity | string = 'minimal'\n): { filename: string; content: string }[] {\n const normalized = String(granularity || 'minimal').toLowerCase();\n if (normalized === 'none') {\n return [];\n }\n if (normalized === 'full' || normalized === 'complete') {\n return ALL_ARCHITECTURE_TEMPLATES.map((t) => ({ filename: t.filename, content: t.content }));\n }\n // Default to minimal\n return ALL_ARCHITECTURE_TEMPLATES.filter((t) => t.isMinimal).map((t) => ({\n filename: t.filename,\n content: t.content,\n }));\n}\n","/**\n * AI-SDLC: Core Project Initialization and Governance Setup\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { installGitHooks } from '../git/hook-installer.js';\nimport {\n STARTER_ANTIGRAVITY_RULES,\n STARTER_CURSOR_CORE_RULES,\n STARTER_CURSOR_PRODUCT_RULES,\n STARTER_CURSOR_QUALITY_RULES,\n STARTER_CLAUDE_RULES,\n STARTER_COPILOT_RULES,\n STARTER_CURSOR_MCP,\n STARTER_ANTIGRAVITY_MCP,\n STARTER_VSCODE_MCP,\n SPECIALIZED_AGENT_TEMPLATES,\n renderAntigravityAgentFile,\n renderClaudeAgentFile,\n renderCopilotAgentFile,\n renderCursorAgentFile,\n} from './agent-templates.js';\nimport {\n getArchitectureTemplates,\n VALID_ARCHITECTURE_GRANULARITIES,\n ArchitectureGranularity,\n} from './architecture-templates.js';\n\nexport const VALID_CI_PROVIDERS = ['github', 'gitlab', 'azure', 'bitbucket'] as const;\nexport type SupportedCiProvider = (typeof VALID_CI_PROVIDERS)[number];\n\nexport const STARTER_QUALITY_POLICY = `# ==============================================================================\n# AI-SDLC: Software Quality, Coding Rules & Release Gate Policy\n# ==============================================================================\nversion: \"1.0\"\nproject: \"Standard AI-SDLC Project\"\nenforcement_mode: \"STRICT\"\n\nscope:\n target_directories:\n - \"src\"\n - \"lib\"\n - \"examples\"\n - \"tests\"\n supported_extensions:\n - \".ts\"\n - \".js\"\n - \".py\"\n - \".java\"\n - \".go\"\n - \".cs\"\n - \".rs\"\n - \".cpp\"\n - \".c\"\n exclude_patterns:\n - \"node_modules\"\n - \"__pycache__\"\n - \".pytest_cache\"\n - \"target\"\n - \"bin\"\n - \"obj\"\n - \".git\"\n - \"reports\"\n - \"dist\"\n - \".changeset\"\n\nthresholds:\n cyclomatic_complexity:\n max_per_function: 10\n cognitive_complexity:\n max_per_function: 15\n maintainability_index:\n min_acceptable_score: 50.0\n function_length:\n max_function_lines: 40\n`;\n\nexport const STARTER_LICENSE_POLICY = `# ==============================================================================\n# AI-SDLC: Open Source License Compliance & Governance Policy\n# ==============================================================================\nversion: \"1.0\"\nproject: \"Standard AI-SDLC Project\"\ndefault_action: \"DENY\"\n\ncategories:\n permissive_free:\n action: \"ALLOW\"\n description: \"Permissive commercial use licenses. Attribution only required.\"\n spdx_identifiers:\n - \"MIT\"\n - \"Apache-2.0\"\n - \"BSD-2-Clause\"\n - \"BSD-3-Clause\"\n - \"ISC\"\n - \"Unlicense\"\n - \"CC0-1.0\"\n - \"0BSD\"\n\n weak_copyleft_conditional:\n action: \"REVIEW_REQUIRED\"\n description: \"Allowed only as dynamically linked decoupled libraries.\"\n spdx_identifiers:\n - \"LGPL-2.1-only\"\n - \"LGPL-3.0-only\"\n - \"MPL-2.0\"\n\n strong_copyleft_viral:\n action: \"DENY\"\n description: \"Forbidden due to viral copyleft forcing source code disclosure.\"\n spdx_identifiers:\n - \"GPL-2.0-only\"\n - \"GPL-3.0-only\"\n - \"AGPL-3.0-only\"\n - \"AGPL-3.0-or-later\"\n\n commercial_acquisition_required:\n action: \"COMMERCIAL_APPROVAL_REQUIRED\"\n description: \"Source-available code requiring commercial license for SaaS deployment.\"\n spdx_identifiers:\n - \"SSPL-1.0\"\n - \"BSL-1.1\"\n`;\n\nexport const STARTER_TASK_TEMPLATE = `---\ntasks:\n - id: \"TSK-001-setup\"\n title: \"Initial component setup\"\n complexity: \"LOW\"\n risk-level: \"LOW\"\n autonomy-mode: \"AUTONOMOUS\"\n assigned-to: \"agent-developer\"\n status: \"PENDING\"\n verification:\n method: \"COMMAND_VERIFICATION\"\n command-or-criteria: \"pnpm test\"\n---\n\n# Task Plan: Component\n`;\n\nexport const STARTER_REQUIREMENT_TEMPLATE = `---\nid: \"FR-SAMPLE-001\"\ntype: \"requirement\"\ntitle: \"Sample Feature\"\nstatus: \"active\"\nversion: \"1.0.0\"\ncategory: \"functional\"\nderives-from:\n - \"UC-SAMPLE-USECASE\"\nverifiable-by: \"cucumber-bdd\"\nacceptance-format: \"gherkin\"\ncucumber-tags:\n - \"@FR-SAMPLE-001\"\n---\n\n# Requirement: Sample Feature\n\n\\`\\`\\`gherkin\nFeature: Sample Feature\n Scenario: Basic execution\n Given system is ready\n When user triggers action\n Then system responds with 200 OK\n\\`\\`\\`\n`;\n\nexport const STARTER_WORKFLOW_HANDOFF_TEMPLATE = `# Workflow Handoff Template\n\n> **Canonical reference:** [\\`process/09_agent_protocols.md\\`](../../process/09_agent_protocols.md) and [\\`process/01_governance_and_roles.md\\`](../../process/01_governance_and_roles.md).\n>\n> **Activation Criterion by Autonomy Mode:**\n> - 🟢 **\\`AUTONOMOUS\\` (or exclusive supervision at the end in PR/CI):** OMITTED. The agent executes and delivers without interrupting the user with this handoff block.\n> - 🟡 **\\`HUMAN_REVIEW_PLAN\\` | 🟠 \\`AMBIGUOUS\\` | 🔴 \\`HIGH_RISK_MANUAL\\`:** MANDATORY. Upon completing the phase or proposal, the agent emits this block and **halts**, granting visibility to the user and relinquishing control.\n\n---\n\n### 🔄 Workflow Handoff\n\n- **Completed Phase / Activity**: \\`[Current phase, e.g. Product Definition / Threat Modeling / Architecture / SDD Implementation]\\`\n- **Acting Role**: \\`[agent-product-analyst | agent-threat-modeler | agent-system-architect | agent-developer | agent-expert-user | agent-security-auditor | agent-compliance-checker]\\`\n- **Task Autonomy Mode**: \\`[HUMAN_REVIEW_PLAN | AMBIGUOUS | HIGH_RISK_MANUAL]\\`\n- **Produced Deliverables**:\n - [x] \\`[Path or ID of generated artifact, e.g. specs/product/uc-mission.md]\\`\n - [x] \\`[Path or ID of generated artifact, e.g. quality-report.md]\\`\n\n- **Recommended Next Role(s) in Workflow**:\n - \\`[Suggested role name, e.g. agent-threat-modeler]\\`: \\`[Technical rationale, e.g. Model STRIDE adversaries and mitigate abuse cases]\\`\n - *(Optional)* \\`[Alternative role, e.g. agent-expert-user]\\`: \\`[Technical rationale, e.g. Evaluate UX and MVP boundary]\\`\n\n- **Suggested Invocation Prompt**:\n > \"Act as \\`[next-role]\\` and proceed with the \\`[next phase]\\` phase on the generated deliverables: \\`[key artifacts]\\`.\"\n\n- **Human Action Window (User Sovereignty and Priority)**:\n - ✋ **Review and Validate**: Inspect generated artifacts and validate alignment with project vision before proceeding.\n - ✏️ **Edit Directly**: Modify requirements, code, or acceptance criteria directly at any time.\n - 🛑 **Pause, Divert, or Discard**: Freeze workflow, redirect toward another goal, or discard proposal.\n - ▶️ **Delegate to Next Agent**: If satisfied with output, execute suggested prompt to continue the chain.\n\n---\n`;\n\nexport const STARTER_GITLAB_CI = `# ==============================================================================\n# AI-SDLC: GitLab CI/CD Pipeline Template\n# ==============================================================================\n\nstages:\n - validate\n - test\n - integrate\n\ndefault:\n image: node:20\n cache:\n key:\n files:\n - pnpm-lock.yaml\n paths:\n - .pnpm-store\n\nvariables:\n PNPM_HOME: \"$CI_PROJECT_DIR/.pnpm\"\n\nbefore_script:\n - corepack enable\n - corepack prepare pnpm@10 --activate\n - pnpm config set store-dir .pnpm-store\n - pnpm install --frozen-lockfile\n - pnpm approve-builds --all\n - pnpm run build\n\nquality-gates:\n stage: validate\n rules:\n - if: '$CI_PIPELINE_SOURCE == \"merge_request_event\"'\n - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'\n - if: '$CI_COMMIT_BRANCH =~ /^release\\\\/.*/'\n script:\n - node packages/cli/bin/aisdlc.js check\n\ntest-and-verify:\n stage: test\n rules:\n - if: '$CI_PIPELINE_SOURCE == \"merge_request_event\"'\n - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'\n - if: '$CI_COMMIT_BRANCH =~ /^release\\\\/.*/'\n script:\n - pnpm test\n - node packages/cli/bin/aisdlc.js verify all\n\nsdd-canonical-integration:\n stage: integrate\n rules:\n - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == \"push\"'\n - if: '$CI_COMMIT_BRANCH =~ /^release\\\\/.*/ && $CI_PIPELINE_SOURCE == \"push\"'\n - if: '$CI_PIPELINE_SOURCE == \"web\"'\n variables:\n GIT_STRATEGY: clone\n GIT_DEPTH: 0\n script:\n - node packages/cli/bin/aisdlc.js sdd integrate --auto || true\n - |\n git config user.name \"gitlab-ci-bot\"\n git config user.email \"gitlab-ci-bot@noreply.gitlab.com\"\n git add -A\n if ! git diff --cached --quiet; then\n git commit -m \"chore(sdd): integrate changes into canonical baseline [skip ci]\"\n git push \"https://oauth2:\\${CI_JOB_TOKEN}@\\${CI_SERVER_HOST}/\\${CI_PROJECT_PATH}.git\" \"HEAD:\\${CI_COMMIT_BRANCH}\"\n fi\n`;\n\nexport const STARTER_AZURE_PIPELINES = `# ==============================================================================\n# AI-SDLC: Azure DevOps Pipelines Template\n# ==============================================================================\n\ntrigger:\n branches:\n include:\n - main\n - release/*\n\npr:\n branches:\n include:\n - main\n - release/*\n\npool:\n vmImage: 'ubuntu-latest'\n\nstages:\n - stage: ValidateAndTest\n displayName: 'Verificación y Quality Gates'\n jobs:\n - job: QualityAndTests\n displayName: 'Quality Gates, Linting & Tests'\n steps:\n - task: NodeTool@0\n inputs:\n versionSpec: '20.x'\n displayName: 'Instalar Node.js 20'\n\n - script: |\n corepack enable\n corepack prepare pnpm@10 --activate\n pnpm install --frozen-lockfile\n pnpm approve-builds --all\n pnpm run build\n displayName: 'Instalar dependencias y compilar monorepo'\n\n - script: |\n node packages/cli/bin/aisdlc.js check\n displayName: 'Ejecutar pre-vuelo AI-SDLC (check)'\n\n - script: |\n pnpm test\n displayName: 'Ejecutar suite de pruebas unitarias'\n\n - script: |\n node packages/cli/bin/aisdlc.js verify all\n displayName: 'Ejecutar Release Gate Completo (verify all)'\n\n - stage: CanonicalIntegration\n displayName: 'Integración Canónica Post-Merge SDD'\n dependsOn: ValidateAndTest\n condition: and(succeeded(), in(variables['Build.SourceBranch'], 'refs/heads/main', 'refs/heads/release/'))\n jobs:\n - job: SddPromote\n displayName: 'Consolidar especificaciones canónicas SDD'\n steps:\n - checkout: self\n persistCredentials: true\n fetchDepth: 0\n\n - task: NodeTool@0\n inputs:\n versionSpec: '20.x'\n displayName: 'Instalar Node.js 20'\n\n - script: |\n corepack enable\n corepack prepare pnpm@10 --activate\n pnpm install --frozen-lockfile\n pnpm approve-builds --all\n pnpm run build\n displayName: 'Instalar dependencias'\n\n - script: |\n node packages/cli/bin/aisdlc.js sdd integrate --auto || true\n name: SddIntegrate\n displayName: 'Detectar e integrar incremento SDD'\n\n - script: |\n git config user.name \"azure-pipelines[bot]\"\n git config user.email \"azure-pipelines[bot]@dev.azure.com\"\n git add -A\n if ! git diff --cached --quiet; then\n git commit -m \"chore(sdd): integrate changes into canonical baseline [skip ci]\"\n git push origin HEAD:$(Build.SourceBranchName)\n fi\n displayName: 'Sincronizar cambios canónicos en repositorio'\n`;\n\nexport const STARTER_BITBUCKET_PIPELINES = `# ==============================================================================\n# AI-SDLC: Bitbucket Pipelines Template\n# ==============================================================================\n\nimage: node:20\n\ndefinitions:\n caches:\n pnpm: $BITBUCKET_CLONE_DIR/.pnpm-store\n steps:\n - step: &build-and-verify\n name: Quality Gates & Verification\n caches:\n - pnpm\n script:\n - corepack enable\n - corepack prepare pnpm@10 --activate\n - pnpm config set store-dir $BITBUCKET_CLONE_DIR/.pnpm-store\n - pnpm install --frozen-lockfile\n - pnpm approve-builds --all\n - pnpm run build\n - node packages/cli/bin/aisdlc.js check\n - pnpm test\n - node packages/cli/bin/aisdlc.js verify all\n\n - step: &sdd-integrate\n name: SDD Canonical Integration\n caches:\n - pnpm\n script:\n - corepack enable\n - corepack prepare pnpm@10 --activate\n - pnpm config set store-dir $BITBUCKET_CLONE_DIR/.pnpm-store\n - pnpm install --frozen-lockfile\n - pnpm approve-builds --all\n - pnpm run build\n - node packages/cli/bin/aisdlc.js sdd integrate --auto || true\n - |\n git config user.name \"bitbucket-pipelines[bot]\"\n git config user.email \"pipelines[bot]@bitbucket.org\"\n git add -A\n if ! git diff --cached --quiet; then\n git commit -m \"chore(sdd): integrate changes into canonical baseline [skip ci]\"\n git push origin HEAD:$BITBUCKET_BRANCH\n fi\n\npipelines:\n pull-requests:\n '**':\n - step: *build-and-verify\n\n branches:\n main:\n - step: *build-and-verify\n - step: *sdd-integrate\n 'release/*':\n - step: *build-and-verify\n - step: *sdd-integrate\n`;\n\nexport const STARTER_GITHUB_CI = `name: CI - AI-SDLC Quality Gates & Testing\n\non:\n push:\n branches: [ main ]\n pull_request:\n branches: [ main ]\n\njobs:\n verify-and-test:\n runs-on: ubuntu-latest\n strategy:\n matrix:\n node-version: [ 18.x, 20.x, 22.x ]\n\n steps:\n - name: Checkout Code\n uses: actions/checkout@v4\n\n - name: Install pnpm\n uses: pnpm/action-setup@v4\n with:\n version: 10\n\n - name: Setup Node.js \\${{ matrix.node-version }}\n uses: actions/setup-node@v4\n with:\n node-version: \\${{ matrix.node-version }}\n cache: 'pnpm'\n\n - name: Install Dependencies\n run: |\n pnpm install --frozen-lockfile\n pnpm approve-builds --all\n\n - name: Build Monorepo Packages (@aisdlc/core & @aisdlc/cli)\n run: pnpm run build\n\n - name: Run Vitest Unit & Integration Suites\n run: pnpm test\n\n - name: Dogfooding - Run AI-SDLC Full Verification Suite\n run: node packages/cli/bin/aisdlc.js verify all\n`;\n\nexport const STARTER_GITHUB_SDD_INTEGRATE = `name: SDD Canonical Integration on Merge\n\non:\n pull_request:\n types: [closed]\n branches:\n - main\n - 'release/**'\n workflow_dispatch:\n inputs:\n change_id:\n description: 'Manual SDD change ID to integrate (e.g. chg-001-telemetry)'\n required: false\n type: string\n\npermissions:\n contents: write\n pull-requests: read\n\nconcurrency:\n group: sdd-integrate-\\${{ github.ref }}\n cancel-in-progress: false\n\njobs:\n integrate-sdd:\n name: SDD Canonical Integration\n if: github.event.pull_request.merged == true || github.event_name == 'workflow_dispatch'\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout Repository\n uses: actions/checkout@v4\n with:\n ref: \\${{ github.event.pull_request.base.ref || github.ref_name }}\n fetch-depth: 0\n token: \\${{ secrets.GITHUB_TOKEN }}\n\n - name: Install pnpm\n uses: pnpm/action-setup@v4\n with:\n version: 10\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: 20\n cache: 'pnpm'\n\n - name: Install Dependencies\n run: |\n pnpm install --frozen-lockfile\n pnpm approve-builds --all\n\n - name: Build Packages\n run: pnpm run build\n\n - name: Detect and Integrate SDD Change\n id: integrate\n env:\n PR_HEAD_REF: \\${{ github.event.pull_request.head.ref }}\n PR_TITLE: \\${{ github.event.pull_request.title }}\n PR_BODY: \\${{ github.event.pull_request.body }}\n MANUAL_CHANGE_ID: \\${{ github.event.inputs.change_id }}\n run: |\n node packages/cli/bin/aisdlc.js sdd integrate --auto || true\n\n - name: Commit and Push Canonical Baseline Changes\n run: |\n git config user.name \"github-actions[bot]\"\n git config user.email \"github-actions[bot]@users.noreply.github.com\"\n git add -A\n if ! git diff --cached --quiet; then\n git commit -m \"chore(sdd): integrate changes into canonical baseline [skip ci]\"\n git push\n echo \"✔ Canonical integration committed and synchronized in repository.\"\n else\n echo \"ℹ No pending modifications generated in working tree.\"\n fi\n`;\n\nexport * from './agent-templates.js';\nexport * from './architecture-templates.js';\n\nexport const VALID_AGENT_TARGETS = ['cursor', 'claude', 'antigravity', 'copilot', 'mcp', 'all'] as const;\nexport type AgentTarget = (typeof VALID_AGENT_TARGETS)[number];\n\nexport interface InitProjectOptions {\n rootDir?: string;\n targetDir?: string;\n ci?: string;\n agents?: string | boolean | string[];\n architecture?: ArchitectureGranularity | string;\n dryRun?: boolean;\n}\n\nexport interface InitProjectResult {\n success: boolean;\n targetDir: string;\n directoriesCreated: string[];\n filesCreated: string[];\n ciProvider?: SupportedCiProvider;\n agentsConfigured: string[];\n architectureGranularity?: ArchitectureGranularity;\n gitHookInstalled: boolean;\n error?: string;\n}\n\nconst DISABLED_AGENT_VALUES = new Set<unknown>([false, 'none', 'false', '']);\nconst ALL_AGENT_VALUES = new Set<unknown>([undefined, null, true, 'all']);\n\nexport function resolveAgentTargets(agents?: string | boolean | string[]): Set<string> {\n const result = new Set<string>();\n if (DISABLED_AGENT_VALUES.has(agents)) return result;\n if (ALL_AGENT_VALUES.has(agents)) {\n VALID_AGENT_TARGETS.forEach((t) => result.add(t));\n return result;\n }\n const rawList = Array.isArray(agents) ? agents : String(agents).split(',');\n for (const raw of rawList) {\n const item = raw.trim().toLowerCase();\n if (item === 'all') {\n VALID_AGENT_TARGETS.forEach((t) => result.add(t));\n return result;\n }\n if (VALID_AGENT_TARGETS.includes(item as AgentTarget)) {\n result.add(item);\n }\n }\n return result;\n}\n\nfunction appendAntigravityFiles(dirs: string[], files: { relPath: string; content: string }[]): void {\n dirs.push('.agent/rules', '.agent/agents', '.agent/skills');\n files.push({ relPath: '.agent/rules/ai-sdlc.md', content: STARTER_ANTIGRAVITY_RULES });\n for (const agent of SPECIALIZED_AGENT_TEMPLATES) {\n const content = renderAntigravityAgentFile(agent);\n dirs.push(`.agent/skills/${agent.id}`);\n files.push(\n { relPath: `.agent/agents/${agent.id}.md`, content },\n { relPath: `.agent/skills/${agent.id}/SKILL.md`, content }\n );\n }\n}\n\nfunction appendCursorFiles(dirs: string[], files: { relPath: string; content: string }[]): void {\n dirs.push('.cursor/rules');\n files.push(\n { relPath: '.cursor/rules/ai-sdlc-core.mdc', content: STARTER_CURSOR_CORE_RULES },\n { relPath: '.cursor/rules/ai-sdlc-product.mdc', content: STARTER_CURSOR_PRODUCT_RULES },\n { relPath: '.cursor/rules/ai-sdlc-quality.mdc', content: STARTER_CURSOR_QUALITY_RULES }\n );\n for (const agent of SPECIALIZED_AGENT_TEMPLATES) {\n files.push({ relPath: `.cursor/rules/${agent.id}.mdc`, content: renderCursorAgentFile(agent) });\n }\n}\n\nfunction appendClaudeFiles(dirs: string[], files: { relPath: string; content: string }[]): void {\n dirs.push('.claude/agents');\n files.push({ relPath: 'CLAUDE.md', content: STARTER_CLAUDE_RULES });\n for (const agent of SPECIALIZED_AGENT_TEMPLATES) {\n files.push({ relPath: `.claude/agents/${agent.id}.md`, content: renderClaudeAgentFile(agent) });\n }\n}\n\nfunction appendCopilotFiles(dirs: string[], files: { relPath: string; content: string }[]): void {\n dirs.push('.github', '.github/agents');\n files.push({ relPath: '.github/copilot-instructions.md', content: STARTER_COPILOT_RULES });\n for (const agent of SPECIALIZED_AGENT_TEMPLATES) {\n files.push({ relPath: `.github/agents/${agent.id}.agent.md`, content: renderCopilotAgentFile(agent) });\n }\n}\n\nexport function collectAgentFiles(targets: Set<string>): {\n dirs: string[];\n files: { relPath: string; content: string }[];\n} {\n const dirs: string[] = [];\n const files: { relPath: string; content: string }[] = [];\n\n const includeAll = targets.has('all');\n const includeCursor = includeAll || targets.has('cursor');\n const includeClaude = includeAll || targets.has('claude');\n const includeAntigravity = includeAll || targets.has('antigravity');\n const includeCopilot = includeAll || targets.has('copilot');\n const includeMcp = includeAll || targets.has('mcp');\n\n if (includeAntigravity) appendAntigravityFiles(dirs, files);\n if (includeCursor) appendCursorFiles(dirs, files);\n if (includeClaude) appendClaudeFiles(dirs, files);\n if (includeCopilot) appendCopilotFiles(dirs, files);\n\n if (includeMcp || includeCursor) {\n dirs.push('.cursor');\n files.push({ relPath: '.cursor/mcp.json', content: STARTER_CURSOR_MCP });\n }\n if (includeMcp || includeAntigravity) {\n files.push({ relPath: 'antigravity.mcp.json', content: STARTER_ANTIGRAVITY_MCP });\n }\n if (includeMcp) {\n dirs.push('.vscode');\n files.push({ relPath: '.vscode/mcp.json', content: STARTER_VSCODE_MCP });\n }\n\n return { dirs, files };\n}\n\nfunction writeProjectFiles(\n destDir: string,\n files: { relPath: string; content: string }[],\n dryRun?: boolean\n): string[] {\n const filesCreated: string[] = [];\n for (const f of files) {\n const fullFilePath = path.join(destDir, f.relPath);\n const parentDir = path.dirname(fullFilePath);\n if (!dryRun) {\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n if (!fs.existsSync(fullFilePath)) {\n fs.writeFileSync(fullFilePath, f.content, 'utf-8');\n filesCreated.push(f.relPath);\n }\n } else {\n filesCreated.push(f.relPath);\n }\n }\n return filesCreated;\n}\n\nexport function initProject(options: InitProjectOptions = {}): InitProjectResult {\n const baseDir = options.rootDir || process.cwd();\n const destDir = path.resolve(baseDir, options.targetDir || '.');\n\n let ciProvider: SupportedCiProvider | undefined;\n if (options.ci) {\n const normalized = options.ci.trim().toLowerCase();\n if (!VALID_CI_PROVIDERS.includes(normalized as SupportedCiProvider)) {\n return {\n success: false,\n targetDir: destDir,\n directoriesCreated: [],\n filesCreated: [],\n agentsConfigured: [],\n gitHookInstalled: false,\n error: `Unrecognized CI provider: '${options.ci}'. Valid options: ${VALID_CI_PROVIDERS.join(', ')}.`,\n };\n }\n ciProvider = normalized as SupportedCiProvider;\n }\n\n let archGranularity: ArchitectureGranularity = 'minimal';\n if (options.architecture !== undefined && options.architecture !== null) {\n const rawArch = String(options.architecture).trim().toLowerCase();\n if (!VALID_ARCHITECTURE_GRANULARITIES.includes(rawArch as ArchitectureGranularity)) {\n return {\n success: false,\n targetDir: destDir,\n directoriesCreated: [],\n filesCreated: [],\n agentsConfigured: [],\n gitHookInstalled: false,\n error: `Unrecognized architecture granularity level: '${options.architecture}'. Valid options: ${VALID_ARCHITECTURE_GRANULARITIES.join(', ')}.`,\n };\n }\n archGranularity = rawArch as ArchitectureGranularity;\n }\n\n const directories = [\n 'process',\n 'schemas/product',\n 'schemas/security',\n 'schemas/compliance',\n 'schemas/architecture',\n 'schemas/safety',\n 'schemas/sdd',\n 'schemas/manuals',\n 'templates/product',\n 'templates/security',\n 'templates/compliance',\n 'templates/architecture',\n 'templates/safety',\n 'templates/sdd',\n 'templates/manuals',\n 'templates/ci',\n 'templates/workflow',\n 'specs',\n 'reports',\n 'tests/features',\n ];\n\n if (ciProvider === 'github') {\n directories.push('.github/workflows');\n }\n\n const agentTargets = resolveAgentTargets(options.agents);\n const { dirs: agentDirs, files: agentFiles } = collectAgentFiles(agentTargets);\n for (const d of agentDirs) {\n if (!directories.includes(d)) {\n directories.push(d);\n }\n }\n\n const directoriesCreated: string[] = [];\n for (const d of directories) {\n const fullDir = path.join(destDir, d);\n if (!options.dryRun) {\n fs.mkdirSync(fullDir, { recursive: true });\n }\n directoriesCreated.push(d);\n }\n\n const filesToWrite: { relPath: string; content: string }[] = [\n { relPath: 'quality-policy.yaml', content: STARTER_QUALITY_POLICY },\n { relPath: 'license-policy.yaml', content: STARTER_LICENSE_POLICY },\n { relPath: 'templates/sdd/tasks.template.md', content: STARTER_TASK_TEMPLATE },\n { relPath: 'templates/product/requirement.template.md', content: STARTER_REQUIREMENT_TEMPLATE },\n { relPath: 'templates/workflow/agent-handoff.template.md', content: STARTER_WORKFLOW_HANDOFF_TEMPLATE },\n { relPath: 'templates/ci/.gitlab-ci.yml', content: STARTER_GITLAB_CI },\n { relPath: 'templates/ci/azure-pipelines.yml', content: STARTER_AZURE_PIPELINES },\n { relPath: 'templates/ci/bitbucket-pipelines.yml', content: STARTER_BITBUCKET_PIPELINES },\n ];\n\n if (ciProvider === 'gitlab') {\n filesToWrite.push({ relPath: '.gitlab-ci.yml', content: STARTER_GITLAB_CI });\n } else if (ciProvider === 'azure') {\n filesToWrite.push({ relPath: 'azure-pipelines.yml', content: STARTER_AZURE_PIPELINES });\n } else if (ciProvider === 'bitbucket') {\n filesToWrite.push({ relPath: 'bitbucket-pipelines.yml', content: STARTER_BITBUCKET_PIPELINES });\n } else if (ciProvider === 'github') {\n filesToWrite.push(\n { relPath: '.github/workflows/ci.yml', content: STARTER_GITHUB_CI },\n { relPath: '.github/workflows/sdd-integrate-on-merge.yml', content: STARTER_GITHUB_SDD_INTEGRATE }\n );\n }\n\n filesToWrite.push(...agentFiles);\n\n const archTemplates = getArchitectureTemplates(archGranularity);\n for (const tpl of archTemplates) {\n filesToWrite.push({\n relPath: path.join('templates', 'architecture', tpl.filename).replace(/\\\\/g, '/'),\n content: tpl.content,\n });\n }\n\n const filesCreated = writeProjectFiles(destDir, filesToWrite, options.dryRun);\n\n let gitHookInstalled = false;\n if (!options.dryRun) {\n const gitDir = path.join(destDir, '.git');\n if (fs.existsSync(gitDir)) {\n const hookRes = installGitHooks(destDir);\n gitHookInstalled = hookRes.success;\n }\n }\n\n const agentsConfigured = Array.from(agentTargets).filter((t) => t !== 'all');\n if (agentTargets.has('all')) {\n agentsConfigured.unshift('all');\n }\n\n return {\n success: true,\n targetDir: destDir,\n directoriesCreated,\n filesCreated,\n ciProvider,\n agentsConfigured,\n architectureGranularity: archGranularity,\n gitHookInstalled,\n };\n}\n"]}
|